Vitalik Buterin kaudu Vitalik Buterini ajaveeb
See on postituse peegel aadressil https://medium.com/@VitalikButerin/zk-snarks-under-the-hood-b33151a013f6
See on kolmas osa artiklite seeriast, mis selgitab, kuidas zk-SNARKi tehnoloogia töötab; eelmised artiklid teemal ruutarvulised aritmeetilised programmid ja elliptiliste kõverate paarid on kohustuslik lugemine ja see artikkel eeldab mõlema mõiste tundmist. Eeldatakse ka elementaarseid teadmisi selle kohta, mis on zk-SNARKid ja mida nad teevad. Vaata ka Christian Reitwiessneri artikkel siin teiseks tehniliseks sissejuhatuseks.
Eelmistes artiklites tutvustasime ruutaritmeetikaprogrammi, mis tahes arvutusülesannete esitamise viisi polünoomvõrrandiga, mis on palju paremini vastuvõetav erinevatele matemaatilise trikitamise vormidele. Võtsime kasutusele ka elliptiliste kõverate sidumised, mis võimaldavad väga piiratud ühesuunalist homomorfset krüptimist, mis võimaldab teil võrdsust kontrollida. Nüüd alustame sealt, kus pooleli jäime, ja kasutame elliptiliste kõverate sidumist koos mõne muu matemaatilise nipiga, et võimaldada tõestajal tõestada, et ta teab konkreetse QAP-i lahendust, ilma et ta selle kohta midagi muud avaldaks. tegelik lahendus.
See artikkel keskendub Pinocchio protokoll Parno, Gentry, Howell ja Raykova aastast 2013 (nimetatakse sageli PGHR13-ks); põhimehhanismil on mõned variatsioonid, nii et praktikas rakendatav zk-SNARK skeem võib veidi teisiti töötada, kuid põhiprintsiibid jäävad üldiselt samaks.
Alustuseks käsitleme peamist krüptograafilist eeldust, mis on aluseks kasutatava mehhanismi turvalisusele: *eksponenti tundmine* oletus.
Põhimõtteliselt, kui saad punktide � ja � paari, kus �⋅�=� ja saad punkti �, siis ei ole võimalik �⋅� välja mõelda, kui � ei ole mingil viisil “tuletatud” et sa tead. See võib tunduda intuitiivselt ilmselge, kuid seda eeldust ei saa tegelikult tuletada ühestki teisest eeldusest (nt diskreetne logi kõvadus), mida me tavaliselt kasutame elliptilisel kõveral põhinevate protokollide turvalisuse tõestamisel, ja seega tuginevad zk-SNARK-id tegelikult mingil määral raputavam alus kui elliptilise kõvera krüptograafia üldisemalt – kuigi see on siiski piisavalt vastupidav, et enamikule krüptograafidele see sobib.
Nüüd uurime, kuidas seda kasutada. Eeldatakse, et taevast langeb punktipaar (�,�), kus �⋅�=�, kuid keegi ei tea, mis on � väärtus. Oletame nüüd, et leian punktipaari (�,�), kus �⋅�=�. Seejärel eeldab KoE eeldus, et ainus viis, kuidas oleksin saanud selle punktipaari teha, oli võtta � ja � ning korrutada mõlemad mõne teguriga r mida ma isiklikult tean. Pange tähele ka seda, et tänu elliptiliste kõverate sidumise võludele saate kontrollida, kas �=�⋅� ei nõua tegelikult teadmist � – selle asemel saate lihtsalt kontrollida, kas �(�,�)=�(�,�).
Teeme midagi huvitavamat. Oletame, et meil langeb taevast kümme paari punkte: (�1,�1),(�2,�2)…(�10,�10). Kõigil juhtudel ��⋅�=��. Oletame, et ma esitan teile punktipaari (�,�), kus �⋅�=�. Mida sa nüüd tead? Teate, et � on mingi lineaarne kombinatsioon �1⋅�1+�2⋅�2+…+�10⋅�10, kus ma tean koefitsiente �1,�2…�10. See tähendab, et ainus viis sellise punktipaari (�,�) saavutamiseks on võtta �1,�2…�10 kordsed ja liita need kokku ning teha sama arvutus �1,�2... �10.
Pange tähele, et arvestades mis tahes konkreetset �1…�10 punkti komplekti, mille puhul võiksite lineaarseid kombinatsioone kontrollida, ei saa te tegelikult luua kaasnevat �1…�10 punkti, teadmata, mis see on ja kui teate, mida � on siis saate luua paari (�,�), kus �⋅�=� kõige jaoks, mida soovite, ilma et peaksite nägema vaeva lineaarse kombinatsiooni loomisega. Seetõttu on selle toimimiseks hädavajalik, et igaüks, kes need punktid loob, oleks usaldusväärne ja kustutaks need pärast kümne punkti loomist. Siit pärineb "usaldusväärse seadistuse" kontseptsioon.
Pidage meeles, et QAP-i lahendus on polünoomide (�,�,�) kogum nii, et �(�)⋅�(�)−�(�)=�(�)⋅�(�), kus:
- � on polünoomide hulga lineaarne kombinatsioon {�1…��}
- � on lineaarne kombinatsioon {�1…��} samade koefitsientidega
- � on lineaarne kombinatsioon {�1…��} samade koefitsientidega
Hulgad {�1…��},{�1…��} ja {�1…��} ning polünoom � on osa ülesandepüstitusest.
Kuid enamikul tegelikel juhtudel on �,� ja � äärmiselt suured; millegi puhul, millel on tuhandeid ahela väravaid, nagu räsifunktsioon, võib polünoomidel (ja lineaarsete kombinatsioonide teguritel) olla palju tuhandeid liikmeid. Seega, selle asemel, et tõestaja esitaks otse lineaarsed kombinatsioonid, kasutame ülaltoodud nippi, et tõestaja tõestaks, et nad pakuvad midagi, mis on lineaarne kombinatsioon, kuid midagi muud paljastamata.
Võib-olla olete märganud, et ülaltoodud trikk töötab elliptiliste kõverate punktide, mitte polünoomide puhul. Seega, mis tegelikult juhtub, on see, et lisame usaldusväärsele seadistusele järgmised väärtused:
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
Võite mõelda t-st kui "salajast punktist", kus polünoomi hinnatakse. � on "generaator" (mõni juhuslik elliptilise kõvera punkt, mis on määratud protokolli osana) ja �,��,�� ja �� on "mürgised jäätmed", numbrid, mis tuleb kindlasti iga hinna eest kustutada, või muidu Kellel need on, saab teha võltstõendeid. Kui keegi annab teile punktipaari �, � nii, et �⋅��=� (meeldetuletus: me ei pea �� seda kontrollima, sest saame teha sidumiskontrolli), siis teate, et on lineaarne kombinatsioon �� polünoomidest, mille väärtus on �.
Seega peab vanasõna senini andma:
- ��=�⋅�(�),��′=�⋅�(�)⋅��
- ��=�⋅�(�),��′=�⋅�(�)⋅��
- ��=�⋅�(�),��′=�⋅�(�)⋅��
Pange tähele, et tõestaja ei pea nende väärtuste arvutamiseks teadma (ja ei peaks teadma!) �,��,�� või ��; pigem peaks tõestaja suutma need väärtused arvutada just nende punktide põhjal, mille me usaldusväärsesse seadistusse lisame.
Järgmine samm on veenduda, et kõigil kolmel lineaarsel kombinatsioonil on samad koefitsiendid. Seda saame teha, lisades usaldusväärsele seadistusele veel ühe väärtuste komplekti: �⋅(��(�)+��(�)+��(�))⋅�, kus � on teine arv, mida tuleks pidada mürgiseks. jäätmed” ja visatakse ära niipea, kui usaldusväärne seadistus on lõpetatud. Seejärel saame lasta tõestajal luua lineaarse kombinatsiooni nende väärtustega samade koefitsientidega ja kasutada sama sidumistrikki nagu ülal, et kontrollida, kas see väärtus vastab esitatud �+�+�-le.
Lõpuks peame tõestama, et �⋅�−�=�⋅�. Teeme seda veel kord sidumiskontrolliga:
�(��,��)/�(��,�)?=�(�ℎ,�⋅�(�))
Kus �ℎ=�⋅�(�). Kui seos selle võrrandi ja �⋅�−�=�⋅� vahel pole teie jaoks mõistlik, minge tagasi ja lugege artikkel paaristamise kohta.
Eespool nägime, kuidas teisendada �,� ja � elliptiliste kõverate punktideks; � on lihtsalt generaator (st elliptilise kõvera punkti ekvivalent number üks). Saame lisada usaldusväärsele seadistusele �⋅�(�). � on raskem; � on lihtsalt polünoom ja me ennustame väga vähe enne tähtaega, millised on selle koefitsiendid iga üksiku QAP-lahenduse jaoks. Seetõttu peame usaldusväärsesse seadistusse lisama veel rohkem andmeid; täpsemalt järjestus:
�,�⋅�,�⋅�2,�⋅�3,�⋅�4….
Zcashi usaldusväärse seadistuse korral ulatub siinne jada umbes 2 miljonini; nii palju võimsusi � vajate, et saaksite alati arvutada �(�), vähemalt konkreetse QAP-i eksemplari puhul, millest nad hoolivad. Ja sellega saab tõestaja anda kontrollijale kogu teabe lõpliku kontrolli tegemiseks.
On veel üks detail, mida peame arutama. Enamasti ei taha me lihtsalt abstraktselt tõestada, et mõne konkreetse probleemi jaoks on mingi lahendus olemas; pigem tahame tõestada kas mõne konkreetse lahenduse õigsust (nt tõestades, et kui võtta sõna “lehm” ja SHA3 räsitakse seda miljon korda, algab lõpptulemus 0x73064fe5) või et lahendus on olemas, kui piirad. mõned parameetrid. Näiteks krüptovaluuta eksemplaris, kus tehingusummad ja kontojäägid on krüpteeritud, soovite tõestada, et teate mõnda dekrüpteerimisvõtit k, näiteks:
decrypt(old_balance, k) >= decrypt(tx_value, k)
decrypt(old_balance, k) - decrypt(tx_value, k) = decrypt(new_balance, k)
Krüpteeritud old_balance
, tx_value
ja new_balance
tuleks täpsustada avalikult, kuna need on konkreetsed väärtused, mida me sel konkreetsel ajal kontrollime; ainult dekrüpteerimisvõti tuleks peita. "Kohandatud kinnitusvõtme" loomiseks, mis vastab teatud sisendite piirangutele, on protokollis vaja teha mõningaid muudatusi.
Nüüd astume natuke tagasi. Esiteks, siin on kinnitusalgoritm tervikuna, tänu Benile Sasson, Tromer, Virza ja Chiesa:
Esimene rida käsitleb parametriseerimist; sisuliselt võite selle funktsiooniks pidada "kohandatud kinnitusvõtme" loomist. probleemi konkreetse juhtumi jaoks kus mõned argumendid on täpsustatud. Teine rida on �,� ja � lineaarse kombinatsiooni kontroll; kolmas rida kontrollib, kas lineaarsetel kombinatsioonidel on samad koefitsiendid, ja neljas rida on korrutise kontroll �⋅�−�=�⋅�.
Kokkuvõttes koosneb kontrolliprotsess mõnest elliptilise kõvera korrutamisest (üks iga avaliku sisendmuutuja kohta) ja viiest sidumiskontrollist, millest üks sisaldab täiendavat sidumiskorrutamist. Tõestus sisaldab kaheksat elliptilise kõvera punkti: paar punkti �(�),�(�) ja �(�), punkt �� jaoks �⋅(�(�)+�(�)+�(� )) ja punkt �ℎ �(�) eest. Neist seitse punkti on kõveral (igaüks 32 baiti, kuna saate � koordinaadi üheks bitiks tihendada) ja Zcashi teostuses on üks punkt (��) kõveral ��2 (64 baiti), seega on tõestuse kogumaht ~288 baiti.
Tõendi loomise kaks arvutuslikult raskeimat osa on järgmised:
- Jagamine (�⋅�−�)/�, et saada � (algoritmid, mis põhinevad Kiire Fourier' teisendus saab seda teha alamruutilise ajaga, kuid see on siiski üsna arvutusmahukas)
- Elliptilise kõvera korrutamise ja liitmise tegemine �(�),�(�),�(�) ja �(�) väärtuste ning neile vastavate paaride loomiseks
Peamine põhjus, miks tõestuse loomine on nii raske, on tõsiasi, et see, mis algses arvutuses oli üksainus binaarne loogikavärav, muutub toiminguks, mida tuleb krüptograafiliselt töödelda elliptilise kõvera toimingute kaudu, kui teeme sellest nullteadmiste tõestust. . See asjaolu koos kiirete Fourier' teisenduste superlineaarsusega tähendab, et tõestuse loomine võtab Zcashi tehingu puhul ~20–40 sekundit.
Teine väga oluline küsimus on: kas me saame proovida muuta usaldusväärse seadistuse veidi... vähem usaldust nõudvaks? Kahjuks ei saa me muuta seda täiesti usaldamatuks; KoE eeldus ise välistab sõltumatute paaride (��,��⋅�) loomise, teadmata, mis � on. Siiski saame turvalisust oluliselt suurendada, kui kasutame mitme osapoole arvutust – see tähendab usaldusväärse seadistuse loomist osapoolte vahel nii, et seni, kuni vähemalt üks osalejatest oma mürgised jäätmed kustutab, on kõik korras. .
Et saada natukene aimu, kuidas seda teha, on siin lihtne algoritm olemasoleva komplekti (�,�⋅�,�⋅�2,�⋅�3…) võtmiseks ja oma saladuse lisamiseks. nii et vajate petmiseks nii oma saladust kui ka eelmist saladust (või eelmist saladuste komplekti).
Väljundkomplekt on lihtne:
�,(�⋅�)⋅�,(�⋅�2)⋅�2,(�⋅�3)⋅�3…
Pange tähele, et saate selle komplekti luua, teades ainult algset komplekti ja s-i ning uus komplekt toimib samamoodi nagu vana komplekt, välja arvatud juhul, kui nüüd kasutatakse "mürgiste jäätmetena" � asemel �⋅�. Niikaua kui teie ja eelmise komplekti loonud isik (või inimesed) ei jäta oma mürgiseid jäätmeid kustutamata ega hiljem kokku leppida, on komplekt "ohutu".
Täieliku usaldusväärse seadistuse jaoks on seda üsna raske teha, kuna tegemist on mitme väärtusega ja algoritmi tuleb osapoolte vahel teha mitmes voorus. See on aktiivse uurimistöö valdkond, et näha, kas mitme osapoole arvutusalgoritmi saab veelgi lihtsustada ja muuta nii, et see nõuab vähem ringe või muuta paralleelsemaks, sest mida rohkem saate seda teha, seda rohkem osapooli on võimalik usaldusväärsesse häälestusprotseduuri kaasata. . On mõistlik mõista, miks kuue osaleja vahel, kes kõik tunnevad üksteist ja töötavad koos, võib usaldatud seadistus mõnele inimesele ebamugavust tekitada, kuid tuhandete osalejatega usaldusväärne seadistus on peaaegu eristamatu usalduse puudumisest – ja kui olete tõesti paranoiline. , saate ise häälestusprotseduuri siseneda ja selles osaleda ning olla kindel, et kustutasite oma väärtuse isiklikult.
Teine aktiivse uurimistöö valdkond on muude lähenemisviiside kasutamine, mis ei kasuta sama eesmärgi saavutamiseks paaristamist ja sama usaldusväärset seadistusparadigmat; vaata Eli ben Sassoni hiljutine ettekanne ühe alternatiivi jaoks (kuigi hoiatage, see on matemaatiliselt vähemalt sama keeruline kui SNARK-id!)
Eriline tänu Ariel Gabizonile ja Christian Reitwiessnerile arvustuse eest.
- SEO-põhise sisu ja PR-levi. Võimenduge juba täna.
- PlatoData.Network Vertikaalne generatiivne Ai. Jõustage ennast. Juurdepääs siia.
- PlatoAiStream. Web3 luure. Täiustatud teadmised. Juurdepääs siia.
- PlatoESG. Süsinik, CleanTech, Energia, Keskkond päikeseenergia, Jäätmekäitluse. Juurdepääs siia.
- PlatoTervis. Biotehnoloogia ja kliiniliste uuringute luureandmed. Juurdepääs siia.
- BlockOffsets. Keskkonnakompensatsiooni omandi ajakohastamine. Juurdepääs siia.
- Allikas: Platoni andmete intelligentsus.