TL;DR
A zéróismeretes bizonyítás lehetővé teszi az egyik fél (a hitelesítő) számára, hogy megállapítsa egy másik fél (a bizonyító) által adott állítás érvényességét anélkül, hogy ismerné az állítás tartalmát. A Binance például bizonyíthatja, hogy a felhasználók pénzeszközei teljes mértékben fedezve vannak tartalékokkal anélkül, hogy felfedné az összes egyéni felhasználói egyenleget.
A „Proof of Reserve” egy Merkle-fa segítségével építhető fel, amely védelmet nyújt a belső adatok, ebben az esetben a teljes nettó ügyfélegyenlegek, azaz a tőzsde felhasználókkal szembeni kötelezettségeinek meghamisítása ellen. Ez majd kombinálható egy zk-SNARK-kal (zéróismeretes bizonyítási protokoll), amely biztosítja, hogy a felhasználók az egyéni egyenlegek ismerete nélkül ellenőrizni tudják, hogy egyenlegük a teljes nettó felhasználói eszközegyenleg részét képezi.
Bevezetés
A piaci események fényében a letétbe helyezett kriptoeszközök biztonsága kritikus témává vált. A blokklánc felhasználók nagyra értékelik az átláthatóságot és a nyitottságot, de támogatják az adatvédelmet és a titoktartást is. Ez dilemmát okoz a letétkezelők által őrzött pénzeszközök tartalékainak bizonyításakor. Gyakran kompromisszumot kell kötni az átláthatóság, a bizalom és az adatok bizalmas kezelése között.
Ennek azonban nem kell így lennie. A zk-SNARK-hoz hasonló zéróismeretes bizonyítási protokollok és Merkle-fák kombinálásával minden fél számára hatékony megoldást találhatunk.
Mi az a zéróismeretes bizonyítás?
A zéróismeretes bizonyítás lehetővé teszi az egyik fél (a hitelesítő) számára, hogy megállapítsa egy másik fél (a bizonyító) által adott állítás érvényességét anélkül, hogy ismerné az állítás tartalmát. Lássunk egy rövid példát.
Van egy zárt széf, amelynek csak Ön tudja a kódját. A példa kedvéért a széfet nem lehet más módon feltörni vagy kinyitni, csak a kombináció ismeretében. Ezt a tényt a kísérletben részt vevő barátja is megállapította, ellenőrizte és tudja.
Ön elmondja a barátjának, hogy tudja a kombinációt, de nem akarja elárulni vagy kinyitni a dobozt a barátja előtt. A doboz tetején van egy lyuk, amin keresztül a barátja be tud helyezni egy üzenetet. Ahhoz, hogy ez egy zéróismeretes bizonyítás legyen, a barátjának a megadott állításon kívül semmilyen további információval nem szabad rendelkeznie a folyamatról.
Bebizonyíthatja a barátjának, hogy ismeri a kombinációt azáltal, hogy kinyitja a dobozt, elmondja, mi volt a cetlire írva, majd újra bezárja azt. Ön azonban egy pillanatra sem fedte fel a kombinációt.
Részletesebb példaért tekintse meg Mi az a zéróismeretes bizonyítás és hogyan hat a blokkláncra? című cikkünket.
Miért használjunk zéróismeretes bizonyítást?
A zéróismeretes bizonyítások alkalmasak valaminek a bizonyítására anélkül, hogy érzékeny információkat vagy részleteket fednénk fel. Ez hasznos lehet akkor, ha nem akarja átadni pénzügyi vagy személyes adatait, amelyeket helytelenül használhatnának fel.
A kriptók esetében bizonyíthatja, hogy rendelkezik a privátkulccsal anélkül, hogy felfedné vagy digitálisan aláírna valamit. Egy kriptovaluta-tőzsde a tartalékai állapotát is bizonyíthatja anélkül, hogy bizalmas információkat fedne fel a felhasználókról, beleértve az egyéni számlaegyenlegüket is.
Ezekben az esetekben (és sok másban) a zéróismeretes bizonyítás olyan algoritmusokat használna, amelyek fognak egy adatbemenetet, és kimenetként „igaz” vagy „hamis” értéket adnak vissza.
A zéróismeretes bizonyítás technikai meghatározása
A zéróismeretes bizonyítás technikailag egy bizonyos kritériumoknak megfelelő struktúrát követ. A bizonyító és a hitelesítő szerepével már foglalkoztunk, de van még három kritérium, amelyet egy zéróismeretes bizonyításnak le kell fednie:
Teljesség. Amennyiben az állítás igaz, a megadott bizonyíték meggyőzi a hitelesítőt, anélkül, hogy további információra vagy ellenőrzésre lenne szükség.
Megbízhatóság. Amennyiben az állítás hamis, a megadott bizonyíték nem fogja meggyőzni a hitelesítőt az állítás igazságáról.
Zéróismeretes. Amennyiben az állítás igaz, a hitelesítő nem szerez tudomást semmilyen információról azon kívül, hogy az állítás igaz.
Mi az a zk-SNARK?
A zk-SNARK (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) egy olyan bizonyítási protokoll, amely a korábban vázolt zéróismeretes elveket követi. A zk-SNARK segítségével bebizonyíthatja, hogy ismeri az eredeti hashelt értéket (erről bővebben alább) anélkül, hogy felfedné, mi az. Egy tranzakció érvényességét is bizonyíthatja anélkül, hogy bármilyen információt felfedne a konkrét összegekről, értékekről vagy címekről.
A zk-SNARK-okat gyakran használják és vitatják meg a blokklánc és a kriptovaluták világában. De elgondolkodhat azon, hogy miért használna valaki zk-SNARK-ot, amikor egy egyszerű nyilvános és privátkulcs párt alkalmazó módszerrel is biztosíthatja az információkat. Azonban nem tudnánk végrehajtani a matematikai bizonyítást annak biztosítására, hogy ne szerepeljenek benne negatív egyenlegek és a Merkle-fa összege.
A tőzsdei tartalékok esetében az ügyfelek egyenlegeinek 1:1 arányú fedezetét szeretnénk bizonyítani anélkül, hogy az egyes számlák azonosítói és egyenlegei nyilvánosságra kerülnének. Ezenkívül a zk-SNARK technológia még valószínűtlenebbé teszi az adatok meghamisítását.
Mi az a Merkle-fa?
A Binance felhasználókhoz tartozó számlák összegzett alapjainak bemutatása nagy adatkészlettel való munkát igényel. E nagy mennyiségű adat kriptográfiai bemutatásának egyik módja a Merkle-fa használata. Hatalmas mennyiségű információ tárolható benne hatékonyan, és kriptográfiai jellege miatt integritása könnyen ellenőrizhető.
Hash függvények
Egy bemenet tömör kódolásához a Merkle-fa hash-függvényeket használ. Röviden, a hashelés azt a folyamatot jelenti, amelynek során egy változó méretű bemenetből egy fix méretű kimenetet állítunk elő. Más szóval, ha egy tetszőleges hosszúságú bemenetet egy algoritmuson keresztül hashelünk, az egy titkosított, fix hosszúságú kimenetet fog eredményezni.
Amíg a bemenet ugyanaz marad, addig a kimenet sem változik. Ez azt jelenti, hogy hatalmas mennyiségű tranzakciós adatot tudunk kezelhető kimenetté hashelni. A kimenet teljesen más lesz, ha bármilyen információ megváltozik a bemenetben.
Vegyük például 100 könyv tartalmát, és futtassuk le őket az SHA-256 hash-függvényen. Valami ilyesmit kapnánk kimenetként:
801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea
Ha ezután megváltoztatnánk a bemenet (a 100 könyv) egyetlen karakterét, a hash teljesen más lenne, például:
abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410
Ez egy fontos tulajdonsága a hash-függvényeknek, mivel lehetővé teszi az adatok pontosságának könnyű ellenőrzését. Ha bárki megismétli ugyanannak a 100 könyvnek az SHA-256 algoritmussal történő hashelését, pontosan ugyanazt a hash-t fogja kapni kimenetként. Ha a kimenet más, akkor biztosan állíthatjuk, hogy a bemenet megváltozott. Ez azt jelenti, hogy nem kell egyenként vagy manuálisan ellenőrizni a bemenetek közötti különbségeket, ami munkaigényes lehet.
Merkle-fák a kriptovaluták világában
A tranzakciós adatok blokkláncon történő tárolásakor minden új tranzakciót egy hash-függvényen keresztül küldenek be, amely egyedi hash-értékeket generál. Tegyük fel, hogy van nyolc tranzakciónk (A-tól H-ig), amelyeket egyenként hashelünk, hogy megkapjuk a hashelt kimenetüket. Ezeket hívjuk Merkle-levél csomópontoknak. Az alábbi képen látható az egyes betűk egyedi hash-értéke: hA az A, hB a B, hC a C, stb.
Ezután foghatjuk a hashelt kimenetek párjait, kombinálhatjuk őket, és egy új hashelt kimenetet kapunk. A hA és hB hashek összevont hashelése révén például egy új, Merkle-ágként ismert, hAB hashelt kimenetet kapunk. Ne feledje, hogy minden alkalommal, amikor egy új kimenet generálódik, az a használt hash-függvénynek megfelelően fix hosszúságú és méretű lesz.
Most már egyesítve vannak két tranzakció (pl. A és B) adatai egy hashben (hAB). Ne feledje, hogy ha bármilyen információt megváltoztatunk A-ban vagy B-ben, és megismételjük a folyamatot, a hAB hash-kimenetünk teljesen más lesz.
A folyamat folytatódik, ahogy új hash-párokat kombinálunk, hogy újra hasheljük őket (lásd az alábbi képet). A hAB-t a hCD-vel hasheljük, hogy egy egyedi hABCD hash-t kapjunk, és ugyanezt tesszük a hEF-fel és a hGH-val, hogy megkapjuk a hEFGH-t. Végül egyetlen hash-t kapunk, amely az összes előző tranzakció hash-értékének hashelt kimenetét képviseli. Más szóval, a hashelt hABCDEFGH kimenet az összes előtte lévő információt képviseli.
A fent látható gráfot Merkle-fának hívják, és a hABCDEFGH hashelt kimenet a Merkle-gyökér. A blokk fejlécekben Merkle-gyökereket használunk, mivel ezek kriptográfiailag tömören összefoglalják a blokkban lévő összes tranzakciós adatot. Gyorsan ellenőrizni tudjuk azt is, hogy a blokkban nem történt-e bármilyen adathamisítás vagy módosítás.
A Merkle-fák korlátai
Térjünk vissza a CEX-tartalékokra vonatkozó példánkhoz. Egy CEX bizonyítani akarja ügyfelei összes eszközének 1:1 arányú fedezetét, és felépít egy Merkle-fát, amely tokenszinten hasheli az ügyfelek UID-it a nettó eszközállományukkal (eszközök és kötelezettségek nettósítása). Miután kiadták (és aláírták, hogy bizonyítsák a Merkle-gyökér feletti tulajdonjogot), az egyes felhasználóknak nincs módjuk ellenőrizni, hogy a Merkle-fa érvényes-e anélkül, hogy hozzáférnének az összes bemenetéhez.
Előfordulhat, hogy egy tőzsde kihagyott néhány bemenetet. Hamis számlákat is létrehozhat negatív egyenleggel, hogy megváltoztassa a teljes kötelezettséget. Például, bár lehet, hogy az ügyfelek vagyona összesen 1 000 000 USD, hozzáadható egy hamis számla - 500 000 USD egyenleggel. Ez mindössze 500 000 dolláros tartalékcélt jelentene.
A proof of reserves esete eltér egy blokk Merkle-gyökerétől, mivel a felhasználók egy blokkláncfelfedezőben láthatják az összes tranzakciót, amelyet egy blokk tartalmaz. A CEX azonban biztonsági és adatvédelmi okokból nem szeretné nyilvánosságra hozni az egyes számlák egyenlegét. Az ügyfelek sem örülnének, ha a számlaegyenlegük nyilvánosságra kerülne. Ebben az esetben a CEX nem tudja bizonyítani, hogy a felhasználói egyenlegek összege helyes, anélkül, hogy más felhasználói egyenlegek láthatóvá válnának.
Az egyik megoldás, amelyet a tőzsdék fontolóra vehetnek, egy megbízható külső auditor alkalmazása. Az auditor ellenőrizheti az egyes számlákat és tartalékokat, mielőtt véglegesen igazolná az adott Merkle-gyökér érvényességét. A felhasználók számára azonban ez a módszer megköveteli az auditorba és az audithoz használt adatokba vetett bizalmat. Nem kell harmadik félre támaszkodnia, ha megbízhat az adatokban.
A zk-SNARK és a Merkle-fák kombinálása
A fenti probléma tökéletes eset a zk-SNARK-ok használatára. Bizonyítani akarjuk, hogy a tartalékok teljes mértékben fedezik a felhasználói kötelezettségeket, és nem hamisítottak. Adatvédelmi és biztonsági okokból azonban nem szeretnénk megmutatni a hitelesítőnek a felhasználói egyenlegek és tartalékok pontos összetételét.
A zk-SNARK használatával egy kriptotőzsde bizonyítani tudja, hogy a Merkle-fa összes levélcsomópontjának egyenlegkészlete (azaz a felhasználói számlák egyenlegei) szerepel a tőzsde állítólagos teljes felhasználói eszközegyenlegében. A felhasználók könnyedén hozzáférhetnek a saját levélcsomópontjaikhoz, mivel benne voltak a folyamatban. A zk-SNARK azt is biztosítja, hogy a generált Merkle-fa ne tartalmazzon negatív teljes nettó eszközegyenleggel rendelkező felhasználókat (ami adathamisítást jelentene, mivel minden hitel túlfedezett). A Binance globális állapotának kiszámítása is használatos, azaz az egyes Binance-ügyfelek minden eszközének teljes nettó egyenlegét tartalmazó lista.
Nézzük meg, hogyan közelíti meg a Binance ezt a helyzetet. Először is, a Binance meghatározza a bizonyítani kívánt számítási kikötéseket, és programozható körként definiálja azokat. Az alábbiakban a Binance modelljében használt három kikötést mutatjuk be.
Minden felhasználó egyenlegkészletére (Merkle-fa levélcsomópontja) a körünk biztosítja, hogy:
A felhasználók eszközegyenlegei beszámításra kerülnek a teljes nettó felhasználói egyenlegek összegének kiszámításába a Binance-nél.
A felhasználó teljes nettó egyenlege nagyobb vagy egyenlő nullával.
A Merkle-fa gyökerének módosítása érvényes (azaz nem használ hamisított információt), miután egy felhasználó adatait frissítette a levélcsomópont hashére.
A Binance ezután a körnek megfelelően zk-SNARK bizonyítékot tud generálni a Merkle-fa felépítéséhez. Ez azzal jár, hogy a tőzsde elvégzi a felhasználók azonosítóinak és egyenlegeinek hashelésével járó nehéz számításokat, miközben biztosítja, hogy a bizonyíték megfeleljen a kikötéseknek.
A hitelesítő megvizsgálja a bizonyítékot (és annak publikusan közzétett nyílt forráskódját), hogy meggyőződjön arról, hogy a számítás minden kikötésnek eleget téve kerül végrehajtásra. A hitelesítési számítás a bizonyítási időhöz képest rendkívül rövid időt vesz igénybe.
A tőzsde minden Proof of Reserves kiadáskor közzéteszi a következőket:
1. A Merkle-bizonyíték minden felhasználó számára.
2. A kör zk-SNARK bizonyítéka és publikus bemenete (az egyes eszközök és Merkle-gyökerek teljes nettó egyenleglistájának a hash-e) az összes felhasználó számára.
Az érintett felek ellenőrizhetik a Merkle-bizonyítékot, biztosítva, hogy egyéni egyenlegeik szerepelnek a Merkle-fa gyökerében. A zk-SNARK bizonyítékot is ellenőrizhetik, hogy a Merkle-fa konstrukciója megfelel-e a körben meghatározott kikötéseknek. A zk-SNARK megoldásról és annak teljesítményéről részletesebb leírást a Hogyan javítják a zk-SNARK-ok a Binance Proof-of-Reserves rendszerét? blogon olvashat.
Záró gondolatok
A zk-SNARK-ok biztosítják az adatintegritás és az adatvédelem egyidejű biztosításához szükséges technológiát. Alkalmazása a tartalékok bizonyítására és a CEX átláthatóságának növelésére segíthet a blokklánciparba vetett bizalom kiépítésében. Sokan régóta vártak már egy ilyen fejlesztésre, amely a CEX-ek számára kulcsfontosságú időpontban érkezik.
Ez a zk-SNARK-unk első verziója, és várjuk a közösség visszajelzéseit, hogy tovább fejleszthessük a rendszert.