Et af hovedmålene, som blockchain-baserede projekter sigter mod at opnå, er verifikation af data. For levende eksempler kan du se på den digitale identitet og online-dokumentlagring og kontrol. Faktisk kræver enhver af disse sager handlings-/transaktionsinitiator-bekræftelsen for at bekræfte personen eller enheden. Hvis personen for eksempel har den digitale form for ID-dokument, bliver det afgørende at sikre ejerskabet. Det er således et glimrende eksempel på et problem med dataverificerbarhed. Lad os gennemgå den enkleste form for løsningen - en digital signatur, hvis test er et af de afgørende punkter under udviklingen af smarte kontrakter.
Fremgangsmåden er enkel:
1) systemet genererer en besked efter kendte for alle regler
2) underskriveren får beskeden og tilføjer et specifikt sæt symboler - digital signatur, kode konstrueret ud fra beskeden med en privat nøgle
3) den genererede signatur sendes nu til kontrakten, hvor den dekomponeres for at hente underskriverens adresse.
Solidity tilbyder dig ECDSA-algoritmen til signaturgenerering og yderligere nedbrydning. Vi behøver ikke dykke dybt ned i selve algoritmen (du kan finde de nødvendige oplysninger i de relevante kilder). Alt, hvad vi behøver at vide, er, at ECDSA er et eksempel på asymmetrisk kryptografi, hvor den første bruger opretter en signatur med deres private nøgle, og den anden bruger anvender en standardalgoritme til at hente underskriverens offentlige nøgle. Således kan den verificere kilden til signaturen. Lad os i stedet fokusere på den praktiske del - signaturbrug og test.
Først og fremmest skal vi erkende et problem. For eksempel skal kontrakten udføre en handling, lad os sige, gemme den, der ringer op. Selvom kontrakten kun skal udføre lagring, hvis den, der ringer, er verificeret, skal vi være sikre på, at ingen kan bruge deres adresse uden tilladelse. For at hente den autentiske opkalder skal vi generere en besked, underskrive den og dekomponere den inden for kontrakten.
Du kan finde standardløsning i Solidity-dokumentationen (for eksempel, i 0.8.4 — den seneste stabile version på tidspunktet for artiklen). Dokumenterne tilbyder os kontrakten, som har brug for følgende indbyggede funktionalitet: meddelelsesgenerering, signaturopdeling og samlingskode for at hente underskriveren. Eksemplet viser alle de nødvendige metoder og er ret ligetil, selvom det har to ulemper: det mangler universalitet, og der er ikke noget godt eksempel på løsningstest. Det er derfor, jeg giver min version af koden og (det faktiske mål) — teststrategien for kontrakten.
Selvfølgelig kan du bruge standard OpenZeppelin bibliotek for ECDSA-operationerne, men du vil møde de samme problemer igen - mangel på fleksibilitet og testmetoder. Så lad os dykke ned i mit eksempel på signaturbaseret logik. Du kan finde den komplette arbejdseksempel i min GitHub, men der er få steder, som jeg vil vise fuldt ud.
Først og fremmest vil vi forberede beskeden. Som du kan se, er den dannet af to pakkede og hasherede tegnebogsadresser:
Det andet vigtige stykke kode er hashing af beskeden sammen med standard Ethereum-meddelelsen:
Det viser, at beskeden blev sendt inden for Ethereum-netværket og har en længde på 32 byte, hvilket ikke er et tilfældigt tal. Efter tidligere operationer har vi hashen, som har en længde på 32 byte. Det er vigtigt at have den ekstra hashing-funktion i en sådan form, og vi vil diskutere ræsonnementet lidt senere.
Andre kodestykker er ret standard. Funktionen til at opdele signaturen er som følger:
og her er funktionen til at hente underskriveren:
Til den eksterne grænseflade vil vi bruge den brugerdefinerede funktion, som modtager signaturen og nødvendige argumenter, kontrollerer om brugeren allerede er registreret, danner beskeden og verificerer signaturen:
Først vil vi efterligne den besked, der skal underskrives. Vi vil bruge ethers.js bibliotek, som er (sammen med web3) det mest brugte og praktiske bibliotek. Da det er et open source-bibliotek, er du fri til at udforske dens kode og dokumenter. Dette bibliotek giver os også den perfekte grænseflade til at konstruere følgende besked:
En af ulemperne ved begge web3 , ethere biblioteker er, at de ikke har alle funktionerne til det lokale Ganache-miljø, da begge biblioteker har til formål at arbejde med fulde Ethererum-noder. Ikke desto mindre er der en tilgang til lokal test ved hjælp af web3-konto funktionalitet. Selvom du skal oprette en ekstra konto, som vil implementere sangerfunktionaliteten og give forbindelse til den nuværende web3-udbyder:
Så nu har vi meddelelsen genereret og underskrevet. Men det er ikke alt; der er et par ting tilbage at tale om. Begge biblioteker (web3 og ethere) under hætten giver yderligere hashing af meddelelsen før signaturoprettelse. Beskeden er heller ikke bare hashed, men kombineres med standard Ethereum-meddelelsen, vi så tidligere:
Og derfor har vi tilføjet den ekstra metode til kontrakten. Så hvis du vil bruge brugerdefinerede beskeder, springe yderligere hash over osv., skal du oprette en brugerdefineret version af signeringsfunktionaliteten. Vi har diskuteret årsagen ovenfor - begge standardbiblioteker implementerer den typiske tilgang til at signere beskeden, som kun kan ændres ved at tilsidesætte funktionaliteten.
Som det sidste trin, lad os køre testen og kontrollere, om den fungerer korrekt:
Vi har testet signaturgenereringen, den genererede besked, signaturgodkendelsen og afvisningen. Så det er et ret komplet sæt tests for verifikationsfunktionaliteten.
- Konto
- Handling
- Yderligere
- algoritme
- Alle
- argumenter
- artikel
- Autentisk
- Bit
- tilfælde
- Kontrol
- kode
- kontrakt
- kryptografi
- Nuværende
- data
- Udvikling
- digital
- digital identitet
- dokumenter
- Miljø
- ethereum
- ethereum-netværk
- Ansigtet
- Fornavn
- Fleksibilitet
- Fokus
- formular
- Gratis
- fuld
- funktion
- godt
- hash
- hashing
- HTTPS
- ia
- Identity
- oplysninger
- IP
- IT
- Nøgle
- seneste
- Bibliotek
- lokale
- medium
- netværk
- noder
- tilbyde
- Tilbud
- online
- åbent
- open source
- Produktion
- private
- private nøgle
- projekter
- offentlige
- offentlig nøgle
- gennemgå
- Kør
- sæt
- Simpelt
- So
- soliditet
- delt
- opbevaring
- butik
- Strategi
- systemet
- prøve
- Test
- tests
- The Source
- us
- Verifikation
- tegnebog
- Wikipedia
- inden for
- Arbejde
- virker