Uvod v zk-SNARKs

blog 1NewsDevelopersEnterpriseBlockchain ExplainedDogodki in konferencePressGlasila

Naročite se na naše novice.

Email naslov

Spoštujemo vašo zasebnost

DomovBlogBlockchain razvoj

Uvod v zk-SNARKs

Pregled dokazov o ničnem znanju in kako integrirati zk-SNARK v Ethereum. avtor ConsenSys 27. marec 2017 Objavljeno 27. marca 2017

domači junak

V tem prispevku želimo s praktičnega vidika podati pregled zk-SNARK. Dejansko matematiko bomo obravnavali kot črno škatlo in poskušali razviti nekaj intuicij, kako jih lahko uporabimo. Dali bomo tudi preprosto uporabo nedavnega dela o integracija zk-SNARK-ov v Ethereum.

Dokazi o ničelnem znanju

Cilj dokazov o ničelnem znanju je, da se lahko preveritelj prepriča, da ima preizkuševalec znanje o tajnem parametru, imenovanem priča, ki izpolnjuje neko zvezo, ne da bi pričevalca ali koga drugega razkril..

To lahko mislimo bolj konkretno, da imamo program, označen s C, ki ima dva vhoda: C (x, w). Vhod x je javni vnos, w pa vnos tajne priče. Rezultat programa je logična vrednost, tj. Nato cilj dobi določen javni vnos x, dokažite, da izvajalec pozna tajni vhod w, tako da je C (x, w) == true.

Posebej bomo razpravljali o neinteraktivnih dokazih o ničnem znanju. To pomeni, da je sam dokaz blob podatkov, ki ga je mogoče preveriti brez kakršne koli interakcije s strani preizkuševalca.

Primer programa

Recimo, da Bob dobi heš H neke vrednosti in želi imeti dokaz, da Alice pozna vrednost s, ki se zgosti v H. Običajno bi Alice to dokazala tako, da bi dala Bobu, nato pa bi Bob izračunal hash in preveril, da enako H.

Recimo, da Alice ne želi razkriti vrednosti s Bobu, ampak namesto tega želi le dokazati, da pozna vrednost. Za to lahko uporabi zk-SNARK.

Alicein scenarij lahko opišemo z naslednjim programom, ki je tukaj zapisan kot funkcija Javascript:


funkcija C (x, w) {return (sha256 (w) == x);} Jezik kode: JavaScript (javascript)

Z drugimi besedami: program vzame javno hash x in skrivno vrednost w ter vrne true, če je SHA-256 hash w enak x.

Pri prevajanju Aliceinega problema s funkcijo C (x, w) vidimo, da mora Alice ustvariti dokaz, da ima s tako, da je C (H, s) == resnična, ne da bi ji bilo treba razkriti s. To je splošni problem, ki ga rešujejo zk-SNARKs.

Opredelitev zk-SNARK

Zk-SNARK je sestavljen iz treh algoritmov G, P, V, opredeljenih na naslednji način:

Generator ključev G vzame tajni parameter lambda in program C ter ustvari dva javno dostopna ključa, dokazni ključ pk in preveritveni ključ vk. Ti ključi so javni parametri, ki jih je treba za določen program C ustvariti le enkrat.

Preverjevalnik P za vhod vzame preskusni ključ pk, javni vnos x in zasebno pričo w. Algoritem ustvari dokaz prf = P (pk, x, w), da izvajalec pozna pričo w in da priča izpolnjuje program.

Preverjevalnik V izračuna V (vk, x, prf), ki vrne true, če je dokaz pravilen, in false sicer. Tako ta funkcija vrne true, če izvajalec pozna pričo w, ki izpolnjuje C (x, w) == true.

Tukaj upoštevajte skrivni parameter lambda, ki se uporablja v generatorju. Zaradi tega parametra je včasih težko uporabljati zk-SNARK v resničnih aplikacijah. Razlog za to je, da lahko vsak, ki pozna ta parameter, ustvari lažne dokaze. Natančneje, glede na kateri koli program C in javni vnos x lahko oseba, ki pozna lambdo, ustvari dokaz fake_prf, tako da V (vk, x, fake_prf) oceni kot true brez vedenja o skrivnosti w.

Tako dejansko zagon generatorja zahteva zelo varen postopek, s katerim se prepriča, da nihče ne izve in shrani parameter kjer koli. To je bil razlog za izjemno dodelana slovesnost skupina Zcash izvedla, da bi ustvarila dokazni ključ in verifikacijski ključ, hkrati pa zagotovila, da je bil v procesu uničen parameter lambda “strupeni odpadki”.

Zk-SNARK za naš primer programa

Kako bi Alice in Bob v praksi uporabila zk-SNARK, da bi Alice dokazala, da pozna skrivno vrednost v zgornjem primeru?

Najprej bomo, kot smo že omenili, uporabili program, ki ga določa naslednja funkcija:

funkcija C (x, w) {return (sha256 (w) == x); } Jezik kode: JavaScript (javascript)

Prvi korak je, da Bob zažene generator G, da ustvari preizkusni ključ pk in preveritveni ključ vk. Najprej naključno generirajte lambdo in jo uporabite kot vhod:

(pk, vk) = G (C, lambda)

S parametrom lambda ravnajte previdno, kajti če se Alice nauči vrednosti lambde, bo lahko ustvarila lažne dokaze. Bob bo delil pk in vk z Alice.

Alice bo zdaj igrala vlogo preizkuševalke. Dokazati mora, da pozna vrednost s, ki zgošča znano razpršitev H. Zažene dokazni algoritem P z uporabo vhodov pk, H in s za generiranje dokaza prf:

prf = P (pk, H, s)

Nato Alice predloži dokaz prf Bobu, ki zažene funkcijo preverjanja V (vk, H, prf), ki bi se v tem primeru vrnila v resnico, saj je Alice pravilno poznala skrivnost s. Bob je lahko prepričan, da je Alice skrivnost vedela, toda Alice ji skrivnosti ni bilo treba razkriti.

Ključi za preverjanje in preverjanje za večkratno uporabo

V našem zgornjem primeru zk-SNARK ni mogoče uporabiti, če želi Bob dokazati Alice, da pozna skrivnost, ker Alice ne more vedeti, da Bob ni shranil parametra lambda. Bob bi verjetno lahko ponaredil dokaze.

Če je program koristen marsikomu (na primer Zcash), lahko zaupanja vredna neodvisna skupina, ločena od Alice in Boba, zažene generator in ustvari preizkusni ključ pk in preveritveni ključ vk tako, da nihče ne izve za lambdo.

Kdor zaupa, da skupina ni varala, lahko te ključe uporabi za prihodnje interakcije.

zk-SNARKs v Ethereumu

Razvijalci so že začeli integrirati zk-SNARKs v Ethereum. Kako je to videti? Konkretno lahko gradnike algoritma za preverjanje dodate Ethereumu v obliki vnaprej sestavljenih pogodb. Takole: zaženite generator zunaj verige, da izdelate dokazni ključ in ključ za preverjanje. Vsak preizkuševalec lahko nato s preizkusnim ključem ustvari dokaz, tudi zunaj verige. Nato lahko v pametni pogodbi zaženete splošni algoritem za preverjanje, pri čemer kot vhodne parametre uporabite dokaz, ključ za preverjanje in javni vnos. Nato lahko izid algoritma za preverjanje uporabite za sprožitev drugih dejavnosti v verigi.

Primer: Zaupne transakcije

Tu je preprost primer, kako lahko zk-SNARKs pomagajo pri zasebnosti v Ethereumu. Recimo, da imamo preprosto žetonsko pogodbo. Običajno bi imela simbolična pogodba v svojem jedru preslikavo od naslovov do ravnotežij:

preslikava (naslov => uint256) tehtnice; Jezik kode: JavaScript (javascript)

Ohranili bomo isto osnovno jedro, razen da bi tehtnico zamenjali s zgoščeno tehtnico:

preslikava (naslov => bytes32) balanceHashes; Jezik kode: JavaScript (javascript)

Pošiljatelja ali prejemnika transakcij ne bomo skrivali. Vendar bomo skrili stanja in poslane zneske. Ta lastnost se včasih imenuje tudi zaupne transakcije.

Za pošiljanje žetonov z enega računa na drugega bomo uporabili dve zk-SNARK. En dokaz ustvari pošiljatelj, enega pa prejemnik.

Običajno moramo v žetonski pogodbi, da je transakcija vrednosti velikosti veljavna, preveriti naslednje:

stanja [fromAddress] >= vrednost

Naši zk-SNARK morajo dokazati, da to drži, pa tudi, da posodobljeni zgoščeni podatki ustrezajo posodobljenim stanjem.

Glavna ideja je, da bo pošiljatelj izhodiščno stanje in vrednost transakcije uporabil kot zasebne vložke. Kot javni vložki uporabljajo zgoščene začetne bilance, končne bilance in vrednosti. Podobno bo sprejemnik uporabil začetno tehtnico in vrednost kot tajne vhode. Kot javni vložki uporabljajo zgoščene začetne bilance, končne bilance in vrednosti.

Spodaj je program, ki ga bomo uporabili za pošiljatelja zk-SNARK, kjer kot prej x predstavlja javni vložek, w pa zasebni vnos.

funkcija senderFunction (x, w) {return (w.senderBalanceBefore > w.vrednost && sha256 (w.value) == x.hashValue && sha256 (w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256 (w.senderBalanceBefore – w.value) == x.hashSenderBalanceAfter)} Jezik kode: JavaScript (javascript)

Program, ki ga uporablja sprejemnik, je spodaj:

funkcija receiverFunction (x, w) {return (sha256 (w.value) == x.hashValue && sha256 (w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256 (w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter)} Jezik kode: JavaScript (javascript)

Programi preverijo, ali je stanje pošiljanja večje od vrednosti, ki se pošlje, in preverijo, ali se vsa zgoščena ujemajo. Zaupanja vreden nabor ljudi bi ustvaril ključe za preverjanje in preverjanje za naše zk-SNARK-e. Poimenujmo jih confTxSenderPk, confTxSenderVk, confTxReceiverPk in confTxReceiverVk.

Uporaba zk-SNARK v pogodbi z žetoni bi izgledala nekako takole:

prenos funkcije (naslov _to, bytes32 hashValue, bytes32 hashSenderBalanceAfter, bytes32 hashReceiverBalanceAfter, bajti zkProofSender, bajti zkProofReceiver) {bytes32 hashSenderBalanceBefore = balanceHashes [msg.sender]; bytes32 hashReceiverBalanceBefore = balanceHashes [_to]; bool senderProofIsCorrect = zksnarkverify (confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify (confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); if (senderProofIsCorrect && sprejemnikProofIsCorrect) {balanceHashes [msg.sender] = hashSenderBalanceAfter; balanceHashes [_to] = hashReceiverBalanceAfter; }} Jezik kode: JavaScript (javascript)

Tako so edine posodobitve blokovne verige zgoščene bilance in ne same tehtnice. Lahko pa vemo, da so vsa stanja pravilno posodobljena, saj se lahko preverimo, ali je dokaz preverjen.

Podrobnosti

Zgornja shema zaupnih transakcij je namenjena predvsem praktičnemu primeru, kako lahko uporabimo zk-SNARKs na Ethereumu. Da bi ustvarili trdno shemo zaupnih transakcij, bi morali obravnavati številna vprašanja:

  • Uporabniki bi morali spremljati svoja stanja na strani odjemalca in če izgubite stanje, teh žetonov ni mogoče obnoviti. Tehtnice bi lahko shranili šifrirano v verigi s ključem, ki izhaja iz ključa za podpisovanje.
  • Tehtnice morajo uporabiti 32 bajtov podatkov in kodirati entropijo, da se prepreči možnost povratne razpršitve, da se ugotovijo stanja.
  • Treba se je spoprijeti s primerom pošiljanja na neuporabljeni naslov.
  • Pošiljatelj mora za pošiljanje sodelovati s prejemnikom. Lahko bi imel sistem, v katerem pošiljatelj s svojim dokazom sproži transakcijo. Prejemnik lahko nato na verigi blokov vidi, da ima “čakajočo dohodno transakcijo”, in jo lahko dokonča.

Na naše novice se naročite na najnovejše novice o Ethereumu, rešitve za podjetja, vire za razvijalce in še več.Kako zgraditi uspešen izdelek BlockchainSpletni seminar

Kako zgraditi uspešen izdelek Blockchain

Kako nastaviti in zagnati vozlišče EthereumSpletni seminar

Kako nastaviti in zagnati vozlišče Ethereum

Kako zgraditi lasten API za EthereumSpletni seminar

Kako zgraditi lasten API za Ethereum

Kako ustvariti socialni žetonSpletni seminar

Kako ustvariti socialni žeton

Uporaba varnostnih orodij pri razvoju pametnih pogodbSpletni seminar

Uporaba varnostnih orodij pri razvoju pametnih pogodb

Prihodnost financ Digitalna sredstva in DeFiSpletni seminar

Prihodnost financ: digitalna sredstva in DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map