Pradžia
Straipsniai
Kriptografijos skaidrumo gerinimas naudojant įrodymus neatskleidžiant informacijos

Kriptografijos skaidrumo gerinimas naudojant įrodymus neatskleidžiant informacijos

Paskelbta Feb 10, 2023Naujinta Jan 5, 2024
10m

Trumpai

Įrodymas neatskleidžiant informacijos leidžia vienai šaliai (tikrintojui) nustatyti kitos šalies (įrodytojo) pateikto teiginio pagrįstumą, nežinant teiginio turinio. Pavyzdžiui, „Binance“, neatskleisdama visų atskirų vartotojų likučių, gali norėti įrodyti, kad visas savo vartotojų lėšas atidėjo rezervuose.

„Rezervų įrodymą“ galima sukurti naudojant Merkle medį, kuris apsaugo nuo jo vidinių duomenų, šiuo atveju bendrų grynųjų klientų likučių, kurie yra biržos įsipareigojimai savo vartotojams, klastojimo. Tuomet tai galima derinti su zk-SNARK (įrodymų neatskleidžiant informacijos protokolu), užtikrinant, kad vartotojai galėtų patikrinti savo likutį, kuris sudaro viso grynojo vartotojo turto likučio dalį, nežinodami atskirų likučių.

Įvadas

Atsižvelgiant į rinkos įvykius, saugomo kriptografinio turto saugumas tapo svarbia tema. Blokų grandinių vartotojai labai vertina skaidrumą ir atvirumą, bet taip pat palaiko privatumą ir konfidencialumą. Tai sukuria dilemą įrodant saugotojų laikomus lėšų rezervus. Dažnai yra kompromisas tarp skaidrumo, pasitikėjimo ir duomenų konfidencialumo.

Tačiau taip nebūtinai turi būti. Derinant įrodymų neatskleidžiant informacijos protokolus, pvz., zk-SNARK, su Merkle medžiais, galima rasti visoms šalims veiksmingą sprendimą.

Kas yra įrodymai neatskleidžiant informacijos?

Įrodymas neatskleidžiant informacijos leidžia vienai šaliai (tikrintojui) nustatyti kitos šalies (įrodytojo) pateikto teiginio pagrįstumą, nežinant teiginio turinio. Pažvelkime į pavyzdį.

Turite užrakintą seifą, kurio kombinaciją žinote tik jūs. Seifo, naudojamo kaip pavyzdžio, negalima paimti, paveikti ar atidaryti kitaip, kaip tik žinant kombinaciją. Šį faktą taip pat pripažino, patikrino ir žino jūsų eksperimente dalyvaujantis draugas.

Savo draugui pareiškiate, kad žinote kombinaciją, bet nenorite jos atskleisti ar atidaryti seifą jam matant. Seifo viršuje yra skylė, per kurią jūsų draugas gali įkišti raštelį. Kad tai būtų įrodymas neatskleidžiant informacijos, jūsų draugas neturėtų turėti jokios papildomos informacijos apie procesą, išskyrus pateiktą teiginį.

Įrodyti savo draugui, kad žinote kombinaciją, galite atidarę seifą, pasakę, kas parašyta raštelyje, ir vėl jį uždarę. Tačiau kombinacijos niekada neatskleidę.

Jei reikia išsamesnio pavyzdžio, žr. mūsų straipsnį Kas yra įrodymai neatskleidžiant informacijos ir kaip tai veikia blokų grandinę?.

Kodėl naudojame įrodymus neatskleidžiant informacijos?

Įrodymai neatskleidžiant informacijos tinka siekiant ką nors įrodyti, neatskleidžiant jautrios informacijos ar detalių. Taip gali būti, jei nenorite perduoti savo finansinės ar asmeninės informacijos, kuri gali būti panaudota netinkamai.

Kriptografijos atveju galite įrodyti, kad jums priklauso privatus raktas, jo neatskleidę arba nieko nepasirašę skaitmeniniu būdu. Kriptovaliutų birža taip pat gali norėti įrodyti savo rezervų būseną, neatskleisdama konfidencialios informacijos apie savo vartotojus, įskaitant jų asmeninių sąskaitų likučius. 

Šiems pavyzdžiams (ir daugeliui kitų) įrodymai neatskleidžiant informacijos naudotų algoritmus, kurie paima duomenų įvestį ir grąžina „teisinga“ arba „klaidinga“ kaip išvestį. 

Įrodymų neatskleidžiant informacijos apibrėžimas techniniais terminais

Technine prasme įrodymai neatskleidžiant informacijos yra tam tikra struktūra, atitinkanti tam tikrus kriterijus. Jau aptarėme įrodytojo ir tikrintojo vaidmenis, tačiau dar yra trys kriterijai, kuriuos turėtų apimti įrodymai neatskleidžiant informacijos:

  1. Užbaigtumas. Jei teiginys yra teisingas, tikrintojas įsitikins pateiktu įrodymu, nereikalaudamas jokios kitos informacijos ar tikrinimo.

  2. Teisingumas. Jei teiginys yra klaidingas, pateiktas įrodymas neįtikins tikrintojo, kad teiginys teisingas.

  3. Informacijos neatskleidimas. Jei teiginys teisingas, tikrintojas nesužino jokios kitos informacijos, išskyrus tai, kad teiginys yra teisingas.

Kas yra zk-SNARK?

zk-SNARK (informacijos neatskleidžiantis glaustas neinteraktyvus informacinis argumentas (angl. „Zero-Knowledge Succinct Non-Interactive Argument of Knowledge“) yra įrodymo protokolas, veikiantis pagal anksčiau aprašytus informacijos neatskleidimo principus. Naudodami zk-SNARK galite įrodyti, kad žinote pradinę maišos reikšmę (apie tai toliau), neatskleisdami jos. Taip pat galite įrodyti transakcijos galiojimą neatskleisdami jokios informacijos apie konkrečias susijusias sumas, vertes ar adresus.

zk-SNARK yra dažniausiai naudojami ir aptariami blokų grandinių ir kriptovaliutų pasaulyje. Tačiau jums gali kilti klausimas, kodėl kas nors vargintųsi naudodamas zk-SNARK, kai informacijai apsaugoti galėtų naudoti paprastą viešojo ir privačiojo raktų poros metodą. Tačiau tuomet negalėtume realizuoti matematinio įrodymo, užtikrinant, kad nebūtų neigiamų likučių, ir Merkle medžio sumą. 

Biržos rezervų atveju norime įrodyti klientų likučių padengimą santykiu 1:1, neviešinant kiekvienos sąskaitos identifikatorių ir likučių. Be to, naudojant zk-SNARK technologiją, duomenų klastojimas tampa dar mažiau tikėtinas.

Kas yra Merkle medis?

Pateikiant Binance vartotojų sąskaitų lėšų sumas, reikia dirbti su dideliu duomenų rinkiniu. Vienas iš būdų pateikti šį didelį duomenų kiekį kriptografiškai yra naudoti Merkle medį. Jame galima efektyviai saugoti didžiulį informacijos kiekį, o dėl kriptografinio pobūdžio jos vientisumą galima lengvai patikrinti.

Maišos funkcijos

Siekiant glaustai koduoti įvestį, Merkle medyje remiamasi maišos funkcijų naudojimu. Trumpai tariant, maiša yra fiksuoto dydžio išvesties generavimo iš kintamo dydžio įvesties procesas. Kitaip tariant, kai bet kokio ilgio įvestis sumaišoma naudojant algoritmą, ji sukuria šifruotą fiksuoto ilgio išvestį.

Kol įvestis yra ta pati, išvestis taip pat bus tokia pati. Tai reiškia, kad galime paimti didelius transakcijų duomenų kiekius ir, atlikę maišą, gauti valdomą išvestį. Išvestis iš esmės skirsis, jei įvestyje bus pakeista kokia nors informacija.

Pavyzdžiui, galėtume paimti 100 knygų turinį ir įvesti jį į SHA-256 maišos funkciją. Gautume kokią nors panašią į šią išvestį:

801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea

Tuomet, jei pakeistume vieną įvesties simbolį (tose 100 knygų), maiša būtų visiškai kitokia, pavyzdžiui:

abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410

Tai svarbi maišos funkcijų savybė, leidžianti lengvai patikrinti duomenų tikslumą. Jei kas nors pakartos tų pačių 100 knygų maišos procesą naudodamas SHA-256 algoritmą, jis gaus lygiai tokią pat maišą kaip ir išvestis. Jei išvestis skiriasi, galime tvirtai teigti, kad įvestis buvo pakeista. Tai reiškia, kad nereikia atskirai ar rankiniu būdu tikrinti, ar nėra įvesčių skirtumų, nes tai gali reikalauti daug darbo.

Merkle medžiai kriptovaliutų pasaulyje

Saugant transakcijų duomenis blokų grandinėje, kiekviena nauja transakcija pateikiama per maišos funkciją, kuri generuoja unikalias maišos reikšmes. Įsivaizduokite, kad turime aštuonias operacijas (nuo A iki H), kurias atskirai sumaišome, kad gautume maišos išvestis. Tai mes vadiname Merkle lapų mazgais. Toliau paveikslėlyje matote unikalią kiekvienos raidės maišos reikšmę: hA – A, hB – B, hC – C ir t. t.

Tada galime paimti maišos išvesčių poras, jas sujungti ir gauti naują maišos išvestį. Pavyzdžiui, hA ir hB sumaišytos kartu duotų naują hAB maišos išvestį, vadinamą Merkle šaka. Atminkite, kad kiekvieną kartą, kai sukuriama nauja išvestis, jos ilgis ir dydis yra fiksuotas, atsižvelgiant į naudojamą maišos funkciją.

Dabar turime dviejų transakcijų (pvz., A ir B) duomenis, sujungtus į vieną maišą (hAB). Atkreipkite dėmesį, kad jei pakeistume kokią nors informaciją A arba B ir pakartotume procesą, mūsų maišos išvestis hAB būtų visiškai kitokia.

Procesas tęsiamas jungiant naujas maišos poras, kad jos vėl būtų maišomos (žr. paveikslėlį žemiau). Sumaišome hAB su hCD, kad gautume unikalią maišą hABCD, tą patį darome su hEF ir hGH, kad gautume hEFGH. Galų gale gauname vieną maišą, atspindinčią visų ankstesnių transakcijų maišų išvestis. Kitaip tariant, maišos išvestis hABCDEFGH atspindi visą iki jos buvusią informaciją.

Aukščiau pateikta diagrama vadinama Merkle medžiu, o maišos išvestis hABCDEFGH yra Merkle šaknis. Merkle šaknis naudojame antraštės blokuose, nes jos kriptografiškai glaustai apibendrina visus operacijų duomenis bloke. Taip pat galime greitai patikrinti, ar bloke nebuvo sugadinti ar pakeisti duomenys.

Merkle medžio apribojimai

Grįžkime prie mūsų CEX rezervų pavyzdžio. CEX nori įrodyti, kad visą savo klientų turtą dengia santykiu 1:1, ir sukuria Merkle medį, kuris maišomas kartu su klientų UID su jų grynaisiais aktyvais (atskaičius turtą ir įsipareigojimus) žetono lygiu. Išleidus (ir pasirašius įrodant nuosavybės teisę į pateiktą Merkle šaknį), atskiras vartotojas negalės patikrinti, ar Merkle medis galioja, nepasiekęs visų jo įvesčių.

Birža gali neįtraukti kai kurių įvesčių. Taip pat gali sukurti fiktyvių sąskaitų su neigiamais likučiais, kad pasikeistų bendrasis įsipareigojimas. Pavyzdžiui, jei bendras klientų turtas yra 1 000 000 JAV dolerių, galima pridėti fiktyvią sąskaitą, kurios likutis –500 000 JAV dolerių. Tai lemtų tik 500 000 JAV dolerių rezervo tikslą.

Rezervų įrodymo atvejis skiriasi nuo bloko Merkle šaknies, nes vartotojai gali matyti visas bloko transakcijas blokų grandinės naršyklėje. Tačiau saugumo ir duomenų privatumo sumetimais CEX nenori atskleisti kiekvienos sąskaitos likučio. Klientai taip pat nebūtų patenkinti, jei jų sąskaitų likučiai būtų paviešinti. Šiuo atveju, neparodydami kitų naudotojų likučių, CEX negali įrodyti, kad vartotojų likučių suma yra teisinga.

Vienas iš sprendimų, kurį biržos gali svarstyti, yra naudoti patikimą trečiosios šalies auditorių. Prieš galutinai patvirtindamas pateiktos Merkle šaknies galiojimą, auditorius gali patikrinti individualias sąskaitas ir rezervus. Tačiau naudotojams šis metodas reikalauja pasitikėjimo auditoriumi ir atliekant auditą naudojamais duomenimis. Jums nereikia pasikliauti trečiąja šalimi, kai galite pasitikėti duomenimis.

zk-SNARK derinimas su Merkle medžiais

Anksčiau aprašyta problema – puikus zk-SNARK panaudojimo atvejis. Norime įrodyti, kad rezervai visiškai padengia vartotojo įsipareigojimus ir nėra falsifikuoti. Tačiau privatumo ir saugumo sumetimais nenorime rodyti tikrintojui tikslios naudotojų likučių ir rezervų sudėties. 

Naudojant zk-SNARK, kriptografinė birža gali įrodyti, kad visi Merkle medžio lapų mazgų likučių rinkiniai (t. y. vartotojo sąskaitos likučiai) sudaro biržos nurodytą bendrą vartotojų turto likutį. Kiekvienas vartotojas gali lengvai pasiekti savo lapo mazgą, kuris buvo įtrauktas į procesą. zk-SNARK taip pat užtikrina, kad jokiame sugeneruotame Merkle medyje nebūtų vartotojų, kurių bendras grynojo turto likutis yra neigiamas (tai reikštų duomenų klastojimą, nes visos paskolos yra garantuotos pertekliniu turtu). Taip pat naudojamas „Binance“ pasaulinės būsenos skaičiavimas, t. y. kiekvieno „Binance“ kliento turimo turto bendrų grynųjų likučių sąrašas.

Pažvelkime, kaip „Binance“ sprendžia situaciją. Norint pradėti, „Binance“ apibrėžia skaičiavimo, kurį nori įrodyti, apribojimus ir apibrėžia juos kaip programuojamą grandinę. Žemiau yra trijų apribojimų, kuriuos „Binance“ naudoja savo modelyje, rinkinys. 

Kiekvieno vartotojo likučių rinkiniui (Merkle medžio lapo mazgui) mūsų grandinė užtikrina, kad:

  1. vartotojo turto likučiai būtų įtraukiami į bendrų grynųjų vartotojo likučių „Binance“ sumos apskaičiavimą;

  2. bendras vartotojo grynasis likutis būtų didesnis arba lygus nuliui;

  3. Merkle medžio šaknies pakeitimas galiotų (t. y. nenaudojama suklastota informacija) atnaujinus vartotojo informaciją lapo mazgo maišoje.

Tada „Binance“ gali generuoti Merkle medžio konstrukcijos zk-SNARK įrodymą pagal grandinę. Tai reiškia, kad birža atlieka intensyvų vartotojų ID ir likučių maišos skaičiavimą ir kartu užtikrina, kad įrodymas atitiktų apribojimus.

Tikrintojas išnagrinės įrodymą (ir jo viešai paskelbtą atvirojo kodo kodą), kad įsitikintų, jog skaičiavimas atliktas laikantis visų apribojimų. Tikrinimo skaičiavimas trunka labai trumpai, palyginti su įrodymo trukme.

Kiekvieną kartą išleidžiant rezervų įrodymą birža paskelbs:

1. Kiekvieno vartotojo Merkle įrodymą.

2. zk-SNARK įrodymą ir viešąją grandinės įvestį (kiekvieno turto bendro grynojo likučio sąrašą ir Merkle šaknies maišą) visiems vartotojams.

Suinteresuotosios šalys gali patikrinti Merkle įrodymą, užtikrindamos, kad jų individualus likutis būtų pridėtas prie Merkle medžio šaknies. Jie taip pat gali patikrinti zk-SNARK įrodymą ir įsitikinti, jog Merkle medžio konstrukcija atitinka grandinėje apibrėžtus apribojimus. Išsamesnį zk-SNARK sprendimo ir jo veikimo paaiškinimą rasite mūsų tinklaraštyje Kaip zk-SNARK patobulina „Binance“ „Proof-of-Reserves“ sistemą.

Baigiamosios mintys

zk-SNARK suteikia technologiją, reikalingą siekiant tuo pačiu metu užtikrinti tiek duomenų vientisumą, tiek privatumą. Šis taikymas, skirtas rezervams įrodyti ir CEX skaidrumui didinti, turėtų padėti kurti pasitikėjimą blokų grandinių pramone. Daugeliui tokia plėtotė buvo ilgai laukta ir ji ateina labai svarbiu CEX metu.

Tai pirmoji mūsų zk-SNARK versija – laukiame bendruomenės atsiliepimų, kad galėtume toliau tobulinti sistemą.

Papildoma literatūra