Een van de belangrijkste doelen die op blockchain gebaseerde projecten willen bereiken, is de verificatie van gegevens. Voor live voorbeelden kunt u kijken naar de opslag en controles van de digitale identiteit en online documenten. In elk van deze gevallen is verificatie van de actie/transactie-initiator vereist om de persoon of entiteit te bevestigen. Als de persoon bijvoorbeeld over de digitale vorm van een identiteitsbewijs beschikt, wordt het van cruciaal belang om het eigendom te garanderen. Het is dus een uitstekend voorbeeld van een probleem van de verifieerbaarheid van gegevens. Laten we de eenvoudigste vorm van de oplossing eens bekijken: een digitale handtekening, waarvan het testen een van de cruciale punten is tijdens de ontwikkeling van slimme contracten.
De aanpak is eenvoudig:
1) Het systeem genereert een bericht met voor iedereen bekende regels
2) de ondertekenaar ontvangt het bericht en voegt een specifieke reeks symbolen toe: digitale handtekening, code die met een privésleutel uit het bericht is opgebouwd
3) de gegenereerde handtekening wordt nu naar het contract verzonden, waar deze wordt ontleed om het adres van de ondertekenaar op te halen.
Solidity biedt u het ECDSA-algoritme voor het genereren en verder ontleden van handtekeningen. We hoeven niet diep in het algoritme zelf te duiken (je kunt de benodigde informatie vinden). in de juiste bronnen). Het enige dat we moeten weten is dat ECDSA een voorbeeld is van asymmetrische cryptografie, waarbij de eerste gebruiker een handtekening maakt met zijn privésleutel, en de tweede gebruiker een standaardalgoritme toepast om de publieke sleutel van de ondertekenaar op te halen. Zo kan het de bron van de handtekening verifiëren. Laten we ons in plaats daarvan concentreren op het praktische gedeelte: het gebruik en testen van handtekeningen.
Allereerst moeten we een probleem onderkennen. Het contract moet bijvoorbeeld een bepaalde actie uitvoeren, bijvoorbeeld het adres van de beller opslaan. Hoewel het contract alleen opslag mag uitvoeren als de beller is geverifieerd, moeten we er zeker van zijn dat niemand zijn adres zonder toestemming kan gebruiken. Om de authentieke beller op te halen, moeten we een bericht genereren, ondertekenen en in het contract opnemen.
U kunt het vinden standaardoplossing in de Solidity-documentatie (bijvoorbeeld, in de 0.8.4 — de nieuwste stabiele versie op het moment van dit artikel). De documenten bieden ons het contract, waarvoor de volgende ingebouwde functionaliteit nodig was: het genereren van berichten, het splitsen van handtekeningen en assemblagecode om de ondertekenaar op te halen. Het voorbeeld toont alle benodigde methoden en is vrij eenvoudig, hoewel het twee nadelen heeft: het ontbeert universaliteit en er is geen goed voorbeeld van het testen van oplossingen. Daarom geef ik mijn versie van de code en (het eigenlijke doel) – de teststrategie van het contract.
Natuurlijk, je kunt gebruiken can de standaard OpenZeppelin-bibliotheek voor de ECDSA-operaties, maar u zult opnieuw met dezelfde problemen te maken krijgen: gebrek aan flexibiliteit en testbenaderingen. Laten we dus eens kijken naar mijn voorbeeld van op handtekeningen gebaseerde logica. Je kunt het volledige vinden werkend voorbeeld in mijn GitHub, maar er zijn weinig plaatsen die ik volledig wil laten zien.
Allereerst gaan we het bericht voorbereiden. Zoals je kunt zien, bestaat het uit twee verpakte en gehashte portemonnee-adressen:
Het tweede belangrijke stuk code is het hashen van het bericht samen met het standaard Ethereum-bericht:
Daaruit blijkt dat het bericht binnen het Ethereum-netwerk is verzonden en een lengte van 32 bytes heeft, wat geen willekeurig getal is. Na eerdere bewerkingen hebben we de hash, die een lengte van 32 bytes heeft. Het is essentieel om de extra hashfunctie in een dergelijke vorm te hebben, en we zullen de redenering verderop bespreken.
Andere codestukken zijn vrij standaard. De functie om de handtekening te splitsen is als volgt:
en hier is de functie om de ondertekenaar op te halen:
Voor de externe interface gebruiken we de aangepaste functie, die de handtekening en de nodige argumenten ontvangt, controleert of de gebruiker al geregistreerd is, het bericht vormt en de handtekening verifieert:
Eerst imiteren we het bericht dat ondertekend moet worden. We zullen gebruiken ethers.js bibliotheek, namelijk (samen met web3) de meest gebruikte en handige bibliotheek. Omdat het een open source-bibliotheek is, bent u vrij om te verkennen de code en documenten. Bovendien biedt deze bibliotheek ons de perfecte interface voor het construeren van het volgende bericht:
Een van de nadelen van beide web3 en ethers bibliotheken is dat ze niet alle functies voor de lokale Ganache-omgeving hebben, aangezien beide bibliotheken bedoeld zijn om met volledige Ethererum-knooppunten te werken. Niettemin bestaat er een aanpak om lokaal te testen web3-accountfunctionaliteit. U moet echter wel een extra account aanmaken, waarmee u de Singer-functionaliteit kunt implementeren en verbinding kunt maken met de huidige web3-provider:
Dus nu hebben we het bericht gegenereerd en ondertekend. Maar dat is niet alles; er zijn nog een paar dingen om over te praten. Beide bibliotheken (web3 en ethers) onder de motorkap zorgen voor extra hashing van het bericht voordat de handtekening wordt gemaakt. Bovendien is het bericht niet alleen gehasht, maar gecombineerd met het standaard Ethereum-bericht dat we eerder zagen:
En daarom hebben we de aanvullende methode aan het contract toegevoegd. Als u dus aangepaste berichten wilt gebruiken, extra hashing wilt overslaan, enz., moet u een aangepaste versie van de ondertekeningsfunctionaliteit maken. We hebben de reden hierboven besproken: beide standaardbibliotheken implementeren de typische aanpak om het bericht te ondertekenen, die alleen kan worden gewijzigd door de functionaliteit te overschrijven.
Laten we als laatste stap de test uitvoeren en controleren of deze correct werkt:
We hebben het genereren van handtekeningen, het gegenereerde bericht, de goedkeuring en afwijzing van de handtekening getest. Het is dus een behoorlijk complete set tests voor de verificatiefunctionaliteit.
- Account
- Actie
- Extra
- algoritme
- Alles
- argumenten
- dit artikel
- Authentiek
- Beetje
- gevallen
- Controles
- code
- contract
- geheimschrift
- Actueel
- gegevens
- Ontwikkeling
- digitaal
- digitale identiteit
- documenten
- Milieu
- ethereum
- ethereum-netwerk
- Gezicht
- Voornaam*
- Flexibiliteit
- Focus
- formulier
- Gratis
- vol
- functie
- goed
- hachee
- hashing
- HTTPS
- ia
- Identiteit
- informatie
- IP
- IT
- sleutel
- laatste
- Bibliotheek
- lokaal
- Medium
- netwerk
- knooppunten
- bieden
- Aanbod
- online.
- open
- open source
- Operations
- privaat
- private Key
- projecten
- publiek
- public Key
- beoordelen
- lopen
- reeks
- Eenvoudig
- So
- stevigheid
- spleet
- mediaopslag
- shop
- Strategie
- system
- proef
- Testen
- testen
- De Bron
- us
- Verificatie
- Portemonnee
- Wikipedia
- binnen
- Mijn werk
- Bedrijven