Et av hovedmålene som blokkjedebaserte prosjekter tar sikte på å oppnå, er verifisering av data. For levende eksempler kan du se på den digitale identiteten og elektroniske dokumenter lagring og sjekker. Faktisk krever alle disse tilfellene handlings-/transaksjonsinitiatorbekreftelsen for å bekrefte personen eller enheten. Hvis personen for eksempel har den digitale formen for ID-dokument, blir det avgjørende å sikre eierskap. Dermed er det et utmerket eksempel på et problem med dataverifiserbarhet. La oss se på den enkleste formen for løsningen - en digital signatur, hvis testing er et av de avgjørende punktene under utviklingen av smartkontrakter.
Tilnærmingen er enkel:
1) systemet genererer en melding etter kjente for alle regler
2) underskriveren får meldingen og legger til et spesifikt sett med symboler - digital signatur, kode konstruert fra meldingen med en privat nøkkel
3) den genererte signaturen sendes nå til kontrakten, hvor den dekomponeres for å hente underskriverens adresse.
Solidity tilbyr deg ECDSA-algoritmen for signaturgenerering og ytterligere dekomponering. Vi trenger ikke å dykke dypt inn i selve algoritmen (du kan finne nødvendig informasjon i de aktuelle kildene). Alt vi trenger å vite er at ECDSA er et eksempel på asymmetrisk kryptografi, der den første brukeren oppretter en signatur med sin private nøkkel, og den andre brukeren bruker en standardalgoritme for å hente den offentlige nøkkelen til underskriveren. Dermed kan den bekrefte kilden til signaturen. La oss heller fokusere på den praktiske delen - signaturbruk og testing.
Først av alt må vi gjenkjenne et problem. For eksempel må kontrakten utføre en handling, la oss si, lagre adressen til den som ringer. Selv om kontrakten bare skal utføre lagring hvis den som ringer er bekreftet, må vi være sikre på at ingen kan bruke adressen deres uten tillatelse. For å hente den autentiske oppringeren, må vi generere en melding, signere den og dekomponere den innenfor kontrakten.
Du kan finne den standardløsning i Soliditetsdokumentasjonen (for eksempel, i 0.8.4 — den siste stabile versjonen i øyeblikket av artikkelen). Dokumentene tilbyr oss kontrakten, som har trengt følgende innebygde funksjonalitet: meldingsgenerering, signaturdeling og monteringskode for å hente underskriveren. Eksemplet viser alle nødvendige metoder og er ganske enkelt, selv om det har to ulemper: det mangler universalitet, og det er ikke noe godt eksempel på løsningstesting. Det er derfor jeg gir min versjon av koden og (det faktiske målet) - teststrategien til kontrakten.
Visst, du kan bruke standard OpenZeppelin-biblioteket for ECDSA-operasjonene, men du vil møte de samme problemene igjen - mangel på fleksibilitet og testmetoder. Så la oss dykke ned i eksemplet mitt på signaturbasert logikk. Du kan finne den komplette fungerende eksempel i min GitHub, men det er få steder jeg ønsker å vise fullt ut.
Først av alt vil vi forberede meldingen. Som du kan se, er den dannet av to pakkede og hashed lommebokadresser:
Den andre viktige kodebiten er å hashe meldingen sammen med standard Ethereum-meldingen:
Den viser at meldingen ble sendt innenfor Ethereum-nettverket og har en lengde på 32 byte, som ikke er et tilfeldig tall. Etter tidligere operasjoner har vi hashen, som har en lengde på 32 byte. Det er viktig å ha den ekstra hashing-funksjonen i en slik form, og vi vil diskutere resonnementet litt senere.
Andre kodebiter er ganske standard. Funksjonen for å dele signaturen er som følger:
og her er funksjonen for å hente underskriveren:
For det eksterne grensesnittet vil vi bruke den tilpassede funksjonen, som mottar signaturen og nødvendige argumenter, sjekker om brukeren allerede er registrert, danner meldingen og verifiserer signaturen:
Først vil vi imitere meldingen som må signeres. Vi vil bruke ethers.js bibliotek, som er (sammen med web3) det mest brukte og praktiske biblioteket. Siden det er et åpen kildekode-bibliotek, står du fritt til å utforske dens kode og dokumenter. Dette biblioteket gir oss også det perfekte grensesnittet for å konstruere følgende melding:
En av ulempene med begge web3 og etere bibliotekene er at de ikke har alle funksjonene for det lokale Ganache-miljøet siden begge bibliotekene er ment å fungere med fulle Ethererum-noder. Likevel er det en tilnærming for lokal testing ved hjelp av web3-konto funksjonalitet. Selv om du må opprette en ekstra konto, som vil implementere sangerfunksjonaliteten og gi en tilkobling til den nåværende web3-leverandøren:
Så nå har vi meldingen generert og signert. Men, det er ikke alt; det er noen ting igjen å snakke om. Begge bibliotekene (web3 og ethers) under panseret gir ekstra hashing av meldingen før signaturopprettingen. Dessuten er meldingen ikke bare hash, men er kombinert med standard Ethereum-meldingen vi så tidligere:
Og det er derfor vi har lagt til tilleggsmetoden i kontrakten. Så hvis du vil bruke egendefinerte meldinger, hoppe over ekstra hashing osv., må du lage en tilpasset versjon av signeringsfunksjonaliteten. Vi har diskutert årsaken ovenfor - begge standardbibliotekene implementerer den typiske tilnærmingen for å signere meldingen, som bare kan endres ved å overstyre funksjonaliteten.
Som det siste trinnet, la oss kjøre testen og sjekke om den fungerer riktig:
Vi har testet signaturgenereringen, meldingen som ble generert, signaturgodkjenningen og avvisningen. Så det er et ganske komplett sett med tester for verifiseringsfunksjonaliteten.
- Logg inn
- Handling
- Ytterligere
- algoritme
- Alle
- argumenter
- Artikkel
- Autentisk
- Bit
- saker
- Sjekker
- kode
- kontrakt
- kryptografi
- Gjeldende
- dato
- Utvikling
- digitalt
- digital identitet
- dokumenter
- Miljø
- ethereum
- ethereum nettverk
- Face
- Først
- fleksibilitet
- Fokus
- skjema
- Gratis
- fullt
- funksjon
- god
- hash
- hashing
- HTTPS
- ia
- Identitet
- informasjon
- IP
- IT
- nøkkel
- siste
- Bibliotek
- lokal
- medium
- nettverk
- noder
- tilby
- Tilbud
- på nett
- åpen
- åpen kildekode
- Drift
- privat
- private Key
- prosjekter
- offentlig
- offentlig Key
- anmeldelse
- Kjør
- sett
- Enkelt
- So
- soliditet
- splittet
- lagring
- oppbevare
- Strategi
- system
- test
- Testing
- tester
- Kilden
- us
- Verifisering
- lommebok
- Wikipedia
- innenfor
- Arbeid
- virker