Vitalik Buterin keresztül a Vitalik Buterin Blog
Ez a bejegyzés tükre a címen https://medium.com/@VitalikButerin/zk-snarks-under-the-motor-b33151a013f6
Ez a harmadik része annak a cikksorozatnak, amely elmagyarázza a zk-SNARK mögött meghúzódó technológia működését; a korábbi cikkek másodfokú aritmetikai programok és a elliptikus görbe párosítások kötelező olvasmány, és ez a cikk mindkét fogalom ismeretét feltételezi. Alapvető ismereteket is feltételeznek arról, hogy mik a zk-SNARK-ok és mit csinálnak. Lásd még Christian Reitwiessner cikke itt egy újabb technikai bevezetéshez.
Az előző cikkekben bemutattuk a másodfokú aritmetikai programot, egy olyan módszert, amellyel bármilyen számítási problémát ábrázolhatunk polinom egyenletekkel, amely sokkal jobban alkalmas a matematikai trükközés különféle formáira. Bevezettük az elliptikus görbepárosításokat is, amelyek lehetővé teszik az egyirányú homomorf titkosítás nagyon korlátozott formáját, amely lehetővé teszi az egyenlőségellenőrzést. Most onnan kezdjük, ahol abbahagytuk, és elliptikus görbepárosításokat használunk néhány más matematikai trükkel együtt, hogy lehetővé tegyük a bizonyító számára, hogy bebizonyítsa, hogy tud egy adott QAP megoldást anélkül, hogy bármi mást is elárulna a tényleges megoldás.
Ez a cikk a Pinokkió protokoll Parno, Gentry, Howell és Raykova 2013-tól (gyakran PGHR13 néven); Az alapmechanizmusnak van néhány változata, így a gyakorlatban megvalósított zk-SNARK séma kissé eltérően működhet, de az alapelvek általában ugyanazok maradnak.
Kezdésként nézzük meg a kulcsfontosságú kriptográfiai feltevést, amely az általunk használt mechanizmus biztonságának hátterében áll: *exponens ismerete* feltételezés.
Alapvetően, ha kapsz egy � és � pontpárt, ahol �⋅�=�, és kapsz egy pontot �, akkor nem lehet �⋅�-t kitalálni, hacsak a � valamilyen módon nem „származik” hogy tudod. Ez intuitívan nyilvánvalónak tűnhet, de ez a feltevés valójában nem vezethető le semmilyen más feltételezésből (pl. diszkrét log keménység), amelyet általában az elliptikus görbe alapú protokollok biztonságának bizonyításakor használunk, így a zk-SNARK-ok valójában egy bizonyos mértéken alapulnak. ingatagabb alap, mint az elliptikus görbe kriptográfia általánosabban – bár még mindig elég szilárd ahhoz, hogy a legtöbb kriptográfus rendben van vele.
Most nézzük meg, hogyan használható ez. Tételezzük fel, hogy egy pontpár (�,�) esik le az égből, ahol �⋅�=�, de senki sem tudja, hogy mennyi a � értéke. Most tegyük fel, hogy kitalálok egy olyan pontot (�,�), ahol �⋅�=�. Ezután a KoE-feltevés azt sugallja, hogy az egyetlen módja annak, hogy ezt a pontpárt � és � felvéve, és mindkettőt megszorozva valamilyen r tényezővel hogy személyesen ismerem. Vegye figyelembe azt is, hogy az elliptikus görbepárosítások varázslatának köszönhetően annak ellenőrzése, hogy �=�⋅� valójában nem kell tudnia � – ehelyett egyszerűen ellenőrizheti, hogy �(�,�)=�(�,�).
Csináljunk valami érdekesebbet. Tegyük fel, hogy tíz pár pontunk esik le az égből: (�1,�1),(�2,�2)…(�10,�10). Minden esetben ��⋅�=��. Tegyük fel, hogy akkor megadok neked egy olyan pontot (�,�), ahol �⋅�=�. Mit tudsz most? Tudja, hogy a � egy lineáris kombináció �1⋅�1+�2⋅�2+…+�10⋅�10, ahol ismerem az �1,�2…�10 együtthatókat. Vagyis az egyetlen módja annak, hogy egy ilyen pontpárt (�,�) kapjunk, ha vegyük �1,�2…�10 többszörösét, és ezeket összeadjuk, és ugyanazt a számítást végezzük �1,�2… �10.
Ne feledje, hogy adott �1…�10 pontból álló halmaz, amelynél érdemes ellenőrizni a lineáris kombinációkat, valójában nem hozhatja létre a kísérő 1…�10 pontot anélkül, hogy tudná, mi az, és ha tudja, mit � akkor létrehozhat egy párt (�,�), ahol �⋅�=� bármihez �, anélkül, hogy lineáris kombinációt kellene létrehoznia. Ezért ahhoz, hogy ez működjön, feltétlenül szükséges, hogy aki létrehozza ezeket a pontokat, az megbízható legyen, és ténylegesen törölje a �, miután létrehozta a tíz pontot. Innen származik a „megbízható beállítás” fogalma.
Ne feledje, hogy a QAP megoldása polinomok halmaza (�,�,�), így �(�)⋅�(�)−�(�)=�(�)⋅�(�), ahol:
- � az {�1…��} polinomok lineáris kombinációja
- � az {�1…��} lineáris kombinációja azonos együtthatókkal
- � az {�1…��} lineáris kombinációja azonos együtthatókkal
Az {�1…��},{�1…��} és {�1…��} halmazok, valamint a � polinom a problémafelvetés részét képezik.
Azonban a legtöbb valós esetben a �,� és � rendkívül nagyok; sok ezer áramköri kapunál, például egy hash függvénynél, a polinomoknak (és a lineáris kombinációk tényezőinek) sok ezer tagja lehet. Ezért ahelyett, hogy a bizonyító közvetlenül adná meg a lineáris kombinációkat, a fent bemutatott trükköt fogjuk használni, hogy a bizonyító bebizonyítsa, hogy valami lineáris kombinációt szolgáltat, de anélkül, hogy bármi mást felfednénk.
Talán észrevette, hogy a fenti trükk elliptikus görbe pontjain működik, nem polinomokon. Ezért valójában az történik, hogy a következő értékeket adjuk a megbízható beállításhoz:
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
A t-t egy „titkos pontnak” tekintheti, ahol a polinom kiértékelése történik. A � egy „generátor” (valamilyen véletlenszerű elliptikus görbe pont, amely a protokoll részeként van megadva), a �,��,�� és �� pedig „mérgező hulladék”, számok, amelyeket feltétlenül törölni kell minden áron, vagy különben aki rendelkezik velük, az képes lesz hamis bizonyítékokat készíteni. Nos, ha valaki ad neked egy � pontpárt, � úgy, hogy �⋅��=� (emlékeztető: nem kell ��-t ellenőriznünk, mivel tudjuk párosítást ellenőrizni), akkor tudod, hogy amit adunk, az �� polinomok lineáris kombinációja, amelyek értéke �.
Ennélfogva a példabeszédnek eddig meg kell adnia:
- ��=�⋅�(�),��′=�⋅�(�)⋅��
- ��=�⋅�(�),��′=�⋅�(�)⋅��
- ��=�⋅�(�),��′=�⋅�(�)⋅��
Vegye figyelembe, hogy a bizonyítónak valójában nem kell tudnia (és nem is szabad tudnia!) �,��,�� vagy �� ezeknek az értékeknek a kiszámításához; inkább a hitelesítőnek képesnek kell lennie arra, hogy ezeket az értékeket csak azokból a pontokból számítsa ki, amelyeket a megbízható beállításhoz adunk.
A következő lépés annak biztosítása, hogy mindhárom lineáris kombinációnak azonos az együtthatója. Ezt úgy tehetjük meg, hogy egy másik értékkészletet adunk a megbízható beállításhoz: �⋅(��(�)+��(�)+��(�))⋅�, ahol a � egy másik szám, amelyet „mérgezőnek” kell tekinteni. hulladék”, és el kell dobni, amint a megbízható beállítás befejeződött. Ezután a prover létrehozhat egy lineáris kombinációt ezekkel az értékekkel azonos együtthatókkal, és ugyanazt a párosítási trükköt használhatja, mint a fenti, annak ellenőrzésére, hogy ez az érték megegyezik-e a megadott �+�+� értékkel.
Végül be kell bizonyítanunk, hogy �⋅�−�=�⋅�. Ezt ismét megtesszük egy párosítási ellenőrzéssel:
�(��,��)/�(��,�)?=�(�ℎ,�⋅�(�))
Ahol �ℎ=�⋅�(�). Ha az egyenlet és a �⋅�−�=�⋅� közötti kapcsolat nem értelmezhető Önnek, menjen vissza, és olvassa el a cikk a párosításokról.
Fentebb láthattuk, hogyan lehet �,� és �-t elliptikus görbe pontokká alakítani; � csak a generátor (azaz az elliptikus görbe pontjának megfelelője az egyes számnak). Hozzáadhatjuk a �⋅�(�)-t a megbízható beállításhoz. � nehezebb; � csak egy polinom, és nagyon keveset jósolunk előre arról, hogy milyen együtthatói lesznek az egyes QAP-megoldások esetében. Ezért még több adatot kell hozzáadnunk a megbízható beállításhoz; konkrétan a sorrend:
�,�⋅�,�⋅�2,�⋅�3,�⋅�4….
A Zcash megbízható beállításban a sorozat itt körülbelül 2 millióig terjed; ennyi � hatványra van szüksége ahhoz, hogy mindig ki tudja számítani a �(�) értéket, legalábbis a számukra fontos QAP-példány esetében. És ezzel a hitelesítő minden információt megadhat a hitelesítő számára a végső ellenőrzés elvégzéséhez.
Van még egy részlet, amit meg kell beszélnünk. Legtöbbször nem csak absztrakt módon akarjuk bizonyítani, hogy létezik valamilyen megoldás valamilyen konkrét problémára; inkább vagy valamilyen konkrét megoldás helyességét akarjuk bizonyítani (pl. annak bizonyítása, hogy ha a „tehén” szót és az SHA3-at milliószor kivonatolja, akkor a végeredmény 0x73064fe5-tel kezdődik), vagy azt, hogy létezik megoldás, ha korlátozza. néhány paramétert. Például egy kriptovaluta példányban, ahol a tranzakciós összegek és a számlaegyenlegek titkosítva vannak, azt szeretné bizonyítani, hogy ismer valamilyen k visszafejtő kulcsot, például:
decrypt(old_balance, k) >= decrypt(tx_value, k)
decrypt(old_balance, k) - decrypt(tx_value, k) = decrypt(new_balance, k)
A titkosított old_balance
, tx_value
és a new_balance
nyilvánosan kell megadni, mivel ezek azok a konkrét értékek, amelyeket az adott időpontban ellenőrizni szeretnénk; csak a visszafejtő kulcsot szabad elrejteni. Kisebb módosításokra van szükség a protokollon egy „egyéni ellenőrző kulcs” létrehozásához, amely megfelel a bemenetekre vonatkozó bizonyos korlátozásoknak.
Most lépjünk vissza egy kicsit. Először is itt van az ellenőrző algoritmus a maga teljességében, ben jóvoltából Sasson, Tromer, Virza és Chiesa:
Az első sor a parametrizálással foglalkozik; lényegében úgy képzelheti el a funkcióját, mint egy „egyéni ellenőrző kulcs” létrehozását. a probléma adott esetére ahol az argumentumok egy része meg van adva. A második sor a �,� és � lineáris kombinációjának ellenőrzése; a harmadik sor annak ellenőrzése, hogy a lineáris kombinációk azonos együtthatójúak-e, a negyedik sor pedig a �⋅�−�=�⋅� szorzatellenőrzés.
Összességében az ellenőrzési folyamat néhány elliptikus görbe szorzásából áll (egy minden „nyilvános” bemeneti változóhoz), és öt párosítási ellenőrzésből áll, amelyek közül az egyik további párosítási szorzást tartalmaz. A bizonyítás nyolc elliptikus görbepontot tartalmaz: egy-egy pontpár �(�),�(�) és �(�), egy �� pont �⋅(�(�)+�(�)+�(�) )), és egy pontot �ℎ a �(�)-re. E pontok közül hét a �� görbén található (mindegyik 32 bájt, mivel a koordinátát egyetlen bitre tömörítheti), a Zcash implementációban pedig egy pont (��) a ��2 (64) csavart görbén található. bájt), így a bizonyítás teljes mérete ~288 bájt.
A bizonyítás két számítási szempontból legnehezebb része a következő:
- Osztva (�⋅�−�)/�, hogy megkapjuk � (algoritmusok Gyors Fourier transzformáció ezt szubkvadratikus időben is megteheti, de ez még mindig meglehetősen számításigényes)
- Az elliptikus görbe szorzása és összeadása a �(�),�(�),�(�) és �(�) értékek és a hozzájuk tartozó párok létrehozásához
Az alapvető ok, amiért olyan nehéz egy bizonyítást létrehozni, az a tény, hogy ami az eredeti számításban egyetlen bináris logikai kapu volt, az olyan műveletté válik, amelyet kriptográfiailag elliptikus görbe műveletekkel kell feldolgozni, ha nulla tudású bizonyítást készítünk belőle. . Ez a tény a gyors Fourier-transzformációk szuperlinearitásával együtt azt jelenti, hogy egy Zcash-tranzakció esetén a bizonyíték létrehozása ~20-40 másodpercet vesz igénybe.
Egy másik nagyon fontos kérdés: meg tudjuk-e próbálni a megbízható beállítást egy kicsit… kevésbé bizalomigényessé tenni? Sajnos nem tehetjük teljesen megbízhatatlanná; maga a KoE-feltevés kizárja a független párok (��,��⋅�) létrehozását anélkül, hogy tudná, mi az. A biztonságot azonban nagymértékben növelhetjük, ha több résztvevős számítást használunk – vagyis úgy alakítjuk ki a megbízható beállítást a felek között, hogy amíg legalább az egyik résztvevő törölte a mérgező hulladékot, akkor nincs semmi baj. .
Hogy kicsit átérezhesse, hogyan csinálná ezt, íme egy egyszerű algoritmus egy létező halmaz (�,�⋅�,�⋅�2,�⋅�3…) felvételéhez, és a saját titkának „hozzáadásához”. így szüksége van a titkodra és az előző titokra (vagy a korábbi titokkészletre) a csaláshoz.
A kimeneti készlet egyszerűen a következő:
�,(�⋅�)⋅�,(�⋅�2)⋅�2,(�⋅�3)⋅�3…
Vegye figyelembe, hogy ezt a készletet úgy állíthatja elő, hogy csak az eredeti készletet és s-eket ismeri, és az új készlet ugyanúgy működik, mint a régi készlet, kivéve, hogy a �⋅�-t használja „mérgező hulladékként” a „mérgező hulladék” helyett. Mindaddig, amíg Ön és az előző készletet létrehozó személy (vagy emberek) nem mulasztja el törölni a mérgező hulladékot, és később összejátszik, a készlet „biztonságos”.
A teljes megbízható beállításhoz ezt kicsit nehezebb megtenni, mivel több értékről van szó, és az algoritmust több körben kell elvégezni a felek között. Ez egy aktív kutatási terület, amely azt vizsgálja, hogy a több résztvevős számítási algoritmus tovább egyszerűsíthető-e, és kevesebb kört igényelne-e, vagy jobban párhuzamosíthatóvá tehető-e, mivel minél többet tehet erről, annál több felet lehet bevonni a megbízható beállítási eljárásba. . Ésszerű belátni, hogy a hat résztvevő között, akik mindannyian ismerik és együttműködnek egymással, miért okozhat néhány ember kényelmetlenséget, de a több ezer résztvevőt magában foglaló megbízható összeállítás szinte megkülönböztethetetlen a bizalom hiányától – és ha valóban paranoiás vagy. , saját maga is beléphet és részt vehet a beállítási folyamatban, és biztos lehet benne, hogy személyesen törölte az értékét.
Az aktív kutatás másik területe más megközelítések alkalmazása, amelyek nem használnak párosítást és ugyanazt a megbízható beállítási paradigmát ugyanazon cél elérése érdekében; lát Eli ben Sasson legutóbbi előadása az egyik alternatíva (bár figyelem, ez matematikailag legalább olyan bonyolult, mint a SNARK-ok!)
Külön köszönet Ariel Gabizonnak és Christian Reitwiessnernek az értékelésért.
- SEO által támogatott tartalom és PR terjesztés. Erősödjön még ma.
- PlatoData.Network Vertical Generative Ai. Erősítse meg magát. Hozzáférés itt.
- PlatoAiStream. Web3 Intelligence. Felerősített tudás. Hozzáférés itt.
- PlatoESG. Carbon, CleanTech, Energia, Környezet, Nap, Hulladékgazdálkodás. Hozzáférés itt.
- PlatoHealth. Biotechnológiai és klinikai vizsgálatok intelligencia. Hozzáférés itt.
- BlockOffsets. A környezetvédelmi ellentételezési tulajdon korszerűsítése. Hozzáférés itt.
- Forrás: Platón adatintelligencia.