Eden glavnih ciljev, ki ga želijo doseči projekti, ki temeljijo na blockchainu, je preverjanje podatkov. Za primere v živo si lahko ogledate shranjevanje in preverjanje digitalne identitete in spletnih dokumentov. Vsak od teh primerov dejansko zahteva preverjanje iniciatorja dejanja/transakcije za potrditev osebe ali subjekta. Na primer, če ima oseba digitalno obliko osebnega dokumenta, postane ključnega pomena zagotoviti lastništvo. Tako je odličen primer problema preverljivosti podatkov. Oglejmo si najenostavnejšo obliko rešitve - digitalni podpis, katerega testiranje je ena ključnih točk pri razvoju pametne pogodbe.
Pristop je preprost:
1) sistem ustvari sporočilo po vsem znanih pravilih
2) podpisnik prejme sporočilo in doda določen nabor simbolov — digitalni podpis, koda, sestavljena iz sporočila z zasebnim ključem
3) ustvarjeni podpis se zdaj pošlje v pogodbo, kjer se razgradi, da se pridobi naslov podpisnika.
Solidity vam ponuja algoritem ECDSA za ustvarjanje podpisa in nadaljnjo dekompozicijo. Ni se nam treba poglobiti v sam algoritem (lahko najdete potrebne informacije v ustreznih virih). Vedeti moramo le, da je ECDSA primer asimetrične kriptografije, kjer prvi uporabnik ustvari podpis s svojim zasebnim ključem, drugi uporabnik pa uporabi standardni algoritem za pridobitev javnega ključa podpisnika. Tako lahko preveri vir podpisa. Namesto tega se osredotočimo na praktični del – uporabo in testiranje podpisa.
Najprej moramo prepoznati problem. Na primer, pogodba mora izvesti neko dejanje, recimo shraniti naslov klicatelja. Čeprav bi morala pogodba izvajati shranjevanje le, če je klicatelj preverjen, moramo biti prepričani, da nihče ne more uporabiti njegovega naslova brez dovoljenja. Za pridobitev avtentičnega klicatelja moramo ustvariti neko sporočilo, ga podpisati in razstaviti znotraj pogodbe.
Najdete standardna rešitev v dokumentaciji Solidity (npr. v 0.8.4 — najnovejša stabilna različica v trenutku članka). Dokumenti nam ponujajo pogodbo, ki je potrebovala naslednje vgrajene funkcije: generiranje sporočil, razdelitev podpisa in zbirno kodo za pridobitev podpisnika. Primer prikazuje vse potrebne metode in je precej preprost, čeprav ima dve slabosti: manjka mu univerzalnosti in ni dobrega primera testiranja rešitev. Zato ponujam svojo različico kode in (dejanski cilj) — strategijo testiranja pogodbe.
Seveda lahko uporabite standardna knjižnica OpenZeppelin za operacije ECDSA, vendar se boste znova soočili z enakimi težavami — pomanjkanjem prilagodljivosti in pristopov testiranja. Torej, poglobimo se v moj primer logike, ki temelji na podpisu. Lahko najdete popolno delovni primer v mojem GitHubu, vendar je malo krajev, ki jih želim prikazati v celoti.
Najprej bomo pripravili sporočilo. Kot lahko vidite, je sestavljen iz dveh pakiranih in zgoščenih naslovov denarnice:
Drugi pomemben del kode je zgoščevanje sporočila skupaj s standardnim sporočilom Ethereum:
Prikazuje, da je bilo sporočilo poslano znotraj omrežja Ethereum in ima 32-bajtno dolžino, kar ni naključno število. Po prejšnjih operacijah imamo hash, ki ima 32-bajtno dolžino. Bistveno je imeti dodatno funkcijo zgoščevanja v takšni obliki, o razlogih pa bomo razpravljali nekoliko kasneje.
Drugi deli kode so precej standardni. Funkcija za razdelitev podpisa je naslednja:
in tukaj je funkcija za pridobitev podpisnika:
Za zunanji vmesnik bomo uporabili funkcijo po meri, ki prejme podpis in potrebne argumente, preveri, ali je uporabnik že registriran, oblikuje sporočilo in preveri podpis:
Najprej bomo posnemali sporočilo, ki ga je treba podpisati. Bomo uporabili ethers.js knjižnica, ki je (skupaj z web3) najbolj uporabljena in priročna knjižnica. Ker gre za odprtokodno knjižnico, jo lahko prosto raziskujete njegovo kodo in dokumente. Poleg tega nam ta knjižnica ponuja popoln vmesnik za sestavo naslednjega sporočila:
Ena od slabosti obeh web3 in etri knjižnic je, da nimajo vseh funkcij za lokalno okolje Ganache, saj sta obe knjižnici namenjeni delovanju s polnimi vozlišči Ethererum. Kljub temu obstaja pristop za lokalno testiranje funkcionalnost računa web3. Čeprav morate ustvariti dodaten račun, ki bo implementiral funkcijo pevca in zagotovil povezavo s trenutnim ponudnikom web3:
Torej, zdaj imamo sporočilo ustvarjeno in podpisano. Vendar to še ni vse; nekaj stvari je še za govoriti. Obe knjižnici (web3 in ethers) pod pokrovom zagotavljata dodatno zgoščevanje sporočila pred ustvarjanjem podpisa. Poleg tega sporočilo ni le zgoščeno, ampak je kombinirano s standardnim sporočilom Ethereum, ki smo ga videli prej:
In zato smo pogodbi dodali dodatno metodo. Torej, če želite uporabiti sporočila po meri, preskočiti dodatno zgoščevanje itd., morate ustvariti prilagojeno različico funkcije podpisovanja. Zgoraj smo razpravljali o razlogu — obe standardni knjižnici izvajata tipičen pristop k podpisovanju sporočila, ki ga je mogoče spremeniti samo s preglasitvijo funkcionalnosti.
Kot zadnji korak zaženimo preizkus in preverimo, ali deluje pravilno:
Preizkusili smo generiranje podpisa, generirano sporočilo, odobritev in zavrnitev podpisa. Gre torej za precej popoln nabor testov za funkcionalnost preverjanja.
- Račun
- Ukrep
- Dodatne
- algoritem
- vsi
- Argumenti
- članek
- Avtentična
- Bit
- primeri
- Pregledi
- Koda
- Naročilo
- kriptografija
- Trenutna
- datum
- Razvoj
- digitalni
- digitalna identiteta
- Dokumenti
- okolje
- ethereum
- omrežje ethereum
- Obraz
- prva
- prilagodljivost
- Osredotočite
- obrazec
- brezplačno
- polno
- funkcija
- dobro
- hash
- mešanje
- HTTPS
- ia
- identiteta
- Podatki
- IP
- IT
- Ključne
- Zadnji
- Knjižnica
- lokalna
- srednje
- mreža
- vozlišča
- ponudba
- Ponudbe
- na spletu
- odprite
- open source
- operacije
- zasebna
- zasebni ključ
- projekti
- javnega
- javni ključ
- pregleda
- Run
- nastavite
- Enostavno
- So
- trdnost
- po delih
- shranjevanje
- trgovina
- Strategija
- sistem
- Test
- Testiranje
- testi
- Vir
- us
- Preverjanje
- denarnica
- Wikipedia
- v
- delo
- deluje