Ett av huvudmålen som blockchain-baserade projekt syftar till att uppnå är verifiering av data. För levande exempel kan du titta på den digitala identiteten och online-dokumentlagring och kontroller. I själva verket kräver något av dessa fall verifiering av åtgärden/transaktionsinitiatorn för att bekräfta personen eller enheten. Om personen till exempel har den digitala formen av ID-handling blir det avgörande att säkerställa ägandet. Det är alltså ett utmärkt exempel på ett problem med dataverifierbarhet. Låt oss se över den enklaste formen av lösningen — en digital signatur, vars testning är en av de avgörande punkterna under utvecklingen av smarta kontrakt.
Tillvägagångssättet är enkelt:
1) systemet genererar ett meddelande enligt kända för alla regler
2) undertecknaren får meddelandet och lägger till en specifik uppsättning symboler - digital signatur, kod konstruerad från meddelandet med en privat nyckel
3) den genererade signaturen skickas nu till kontraktet, där den sönderdelas för att hämta undertecknarens adress.
Solidity erbjuder dig ECDSA-algoritmen för signaturgenerering och ytterligare nedbrytning. Vi behöver inte djupdyka i själva algoritmen (du kan hitta den nödvändiga informationen i lämpliga källor). Allt vi behöver veta är att ECDSA är ett exempel på asymmetrisk kryptografi, där den första användaren skapar en signatur med sin privata nyckel, och den andra användaren använder en standardalgoritm för att hämta undertecknarens publika nyckel. Således kan den verifiera källan till signaturen. Låt oss istället fokusera på den praktiska delen – signaturanvändning och testning.
Först och främst måste vi känna igen ett problem. Till exempel måste kontraktet utföra någon åtgärd, låt oss säga, lagra uppringarens adress. Även om kontraktet endast ska utföra lagring om den som ringer är verifierad, måste vi vara säkra på att ingen kan använda sin adress utan tillstånd. För att hämta den autentiska uppringaren måste vi generera ett meddelande, signera det och dekomponera det inom kontraktet.
Du kan hitta standardlösning i Solidity-dokumentationen (till exempel, i 0.8.4 — den senaste stabila versionen vid tidpunkten för artikeln). Dokumenten erbjuder oss kontraktet, som har behövt följande inbyggda funktionalitet: meddelandegenerering, signaturdelning och monteringskod för att hämta undertecknaren. Exemplet visar alla nödvändiga metoder och är ganska okomplicerat, även om det har två nackdelar: det saknar universalitet och det finns inget bra exempel på lösningstestning. Det är därför jag tillhandahåller min version av koden och (det faktiska målet) - teststrategin för kontraktet.
Visst, du kan använda standardbiblioteket OpenZeppelin för ECDSA-verksamheten, men du kommer att möta samma problem igen — brist på flexibilitet och testmetoder. Så låt oss dyka in i mitt exempel på signaturbaserad logik. Du kan hitta hela fungerande exempel i min GitHub, men det är få platser som jag vill visa fullt ut.
Först och främst kommer vi att förbereda meddelandet. Som du kan se är den bildad av två packade och hashade plånboksadresser:
Den andra viktiga kodbiten är att hasha meddelandet tillsammans med standard Ethereum-meddelandet:
Det visar att meddelandet skickades inom Ethereum-nätverket och har en längd på 32 byte, vilket inte är ett slumptal. Efter tidigare operationer har vi hashen, som har en längd på 32 byte. Det är viktigt att ha den extra hashfunktionen i sådan form, och vi kommer att diskutera resonemanget lite senare.
Andra kodbitar är ganska standard. Funktionen för att dela upp signaturen är som följer:
och här är funktionen för att hämta undertecknaren:
För det externa gränssnittet kommer vi att använda den anpassade funktionen, som tar emot signaturen och nödvändiga argument, kontrollerar om användaren redan är registrerad, bildar meddelandet och verifierar signaturen:
Först kommer vi att imitera meddelandet som måste signeras. Vi kommer använda ethers.js bibliotek, vilket är (tillsammans med web3) det mest använda och bekväma biblioteket. Eftersom det är ett bibliotek med öppen källkod är du fri att utforska dess kod och dokument. Det här biblioteket ger oss också det perfekta gränssnittet för att konstruera följande meddelande:
En av nackdelarna med båda web3 och etrar bibliotek är att de inte har alla funktioner för den lokala Ganache-miljön eftersom båda biblioteken syftar till att fungera med fullständiga Ethererum-noder. Ändå finns det ett tillvägagångssätt för lokal testning web3-konto funktionalitet. Även om du behöver skapa ett extra konto, som kommer att implementera sångarfunktionen och ge en anslutning till den nuvarande web3-leverantören:
Så nu har vi meddelandet genererat och signerat. Men det är inte allt; det finns några saker kvar att prata om. Båda biblioteken (web3 och etrar) under huven tillhandahåller ytterligare hash av meddelandet innan signaturen skapas. Dessutom är meddelandet inte bara hashat utan kombineras med standard Ethereum-meddelandet som vi såg tidigare:
Och det var därför vi lade till tilläggsmetoden i kontraktet. Så om du vill använda anpassade meddelanden, hoppa över ytterligare hash, etc., måste du skapa en anpassad version av signeringsfunktionen. Vi har diskuterat orsaken ovan — båda standardbiblioteken implementerar den typiska metoden för att signera meddelandet, som endast kan ändras genom att åsidosätta funktionaliteten.
Som sista steg, låt oss köra testet och kontrollera om det fungerar korrekt:
Vi har testat signaturgenereringen, meddelandet som genereras, signaturgodkännandet och avvisningen. Så det är en ganska komplett uppsättning tester för verifieringsfunktionen.
- Konto
- Handling
- Annat
- algoritm
- Alla
- argument
- Artikeln
- Äkta
- Bit
- fall
- Kontroller
- koda
- kontrakt
- kryptografi
- Aktuella
- datum
- Utveckling
- digital
- digital identitet
- dokument
- Miljö
- ethereum
- ethereum nätverk
- Ansikte
- Förnamn
- Flexibilitet
- Fokus
- formen
- Fri
- full
- fungera
- god
- hash
- hasch
- HTTPS
- ia
- Identitet
- informationen
- IP
- IT
- Nyckel
- senaste
- Bibliotek
- lokal
- Medium
- nät
- noder
- erbjudanden
- Erbjudanden
- nätet
- öppet
- öppen källkod
- Verksamhet
- privat
- privat nyckel
- projekt
- allmän
- Public Key
- översyn
- Körning
- in
- Enkelt
- So
- fasthet
- delas
- förvaring
- lagra
- Strategi
- system
- testa
- Testning
- tester
- källan
- us
- Verifiering
- plånbok
- wikipedia
- inom
- Arbete
- fungerar