Įvadas į „zk-SNARK“

1 dienoraštisNewsDevelopersEnterpriseBlockchain ExplainedEvents and ConferencesPressNaujienlaiškiai

Užsiprenumeruokite mūsų naujienlaiškį.

Elektroninio pašto adresas

Mes gerbiame jūsų privatumą

Pagrindinis dienoraštisBlokavimo grandinės plėtra

Įvadas į „zk-SNARK“

„Zinių žinių įrodymų“ apžvalga ir kaip integruoti „zk-SNARK“ į „Ethereum“. paskelbta „ConsenSys“ 2017 m. kovo 27 d. Paskelbta 2017 m. kovo 27 d

namų herojus

Šiame įraše siekiame apžvelgti „zk-SNARK“ praktiškai. Tikrąją matematiką traktuosime kaip juodą langelį ir bandysime sukurti keletą intuicijų, kaip jas panaudoti. Taip pat pateiksime paprastą naujausio darbo pritaikymą integruojant „zk-SNARK“ į „Ethereum“.

Nulinių žinių įrodymai

Neapibrėžtų žinių įrodymų tikslas yra tai, kad tikrintojas galėtų įtikinti save, jog patarlė turi žinių apie slaptą parametrą, vadinamą liudytoju, tenkinantį tam tikrus santykius, neatskleidžiant liudytojo tikrintojui ar kam nors kitam.

Galime tai galvoti konkrečiau, turėdami programą, pažymėtą C, atsižvelgiant į dvi įvestis: C (x, w). Įvestis x yra viešoji įvestis, o w – slapta liudytojo įvestis. Programos išvestis yra loginė, t. Y. Teisinga arba klaidinga. Tada tikslui suteikiamas konkretus viešas įėjimas x, įrodykite, kad patarėjas žino slaptą įvestį w, kad C (x, w) == true.

Mes specialiai ketiname aptarti neinteraktyvius „nulinės“ žinių įrodymus. Tai reiškia, kad pats įrodymas yra duomenų dėmė, kurią galima patikrinti be jokios patarėjo sąveikos.

Programos pavyzdys

Tarkime, kad Bobui suteikiamas tam tikros vertės maišas H, ir jis nori turėti įrodymą, kad Alisa žino reikšmę s, kuri maišo H. Paprastai Alisa tai įrodytų duodama s Bobui, po kurio Bobas apskaičiuotų maišos ir patikrintų, ar jis lygus H.

Tačiau tarkime, kad Alisa nenori atskleisti vertės Bobui, o nori tiesiog įrodyti, kad žino vertę. Tam ji gali naudoti zk-SNARK.

Alice scenarijų galime apibūdinti naudodami šią programą, čia parašytą kaip „Javascript“ funkciją:

funkcija C (x, w) {return (sha256 (w) == x);} Kodo kalba: „JavaScript“ (javascript)

Kitaip tariant: programa įima viešą maišos x ir slaptą reikšmę w ir grąžina teisingą vertę, jei SHA – 256 maiša w lygi x.

Išvertę Alisos problemą naudodami funkciją C (x, w), matome, kad Alisa turi sukurti įrodymą, kad ji turi s, kad C (H, s) == tiesa, nereikėtų atskleisti s. Tai yra bendra problema, kurią sprendžia „zk-SNARK“.

Zk-SNARK apibrėžimas

„Zk-SNARK“ sudaro trys algoritmai G, P, V, apibrėžti taip:

Raktų generatorius G ima slaptą parametrą lambda ir programą C ir sukuria du viešai prieinamus raktus, įrodantįjį raktą pk ir patvirtinimo raktą vk. Šie raktai yra vieši parametrai, kuriuos tam tikrai programai C reikia sukurti tik vieną kartą.

Patarlė P kaip įvestį naudoja įrodomąjį raktą pk, viešąjį įvestį x ir privatų liudytoją w. Algoritmas sukuria įrodymą prf = P (pk, x, w), kad patarėjas pažįsta liudytoją w ir kad liudytojas tenkina programą.

Tikrintojas V apskaičiuoja V (vk, x, prf), kuris grąžina true, jei įrodymas yra teisingas, o klaidingas – kitaip. Taigi ši funkcija grąžinama kaip teisinga, jei patarėjas pažįsta liudytoją, kuris tenkina C (x, w) == tiesa.

Čia atkreipkite dėmesį į slaptą parametrą lambda, naudojamą generatoriuje. Šis parametras kartais apsunkina zk-SNARK naudojimą realiose programose. To priežastis yra ta, kad visi, kurie žino šį parametrą, gali sukurti netikrus įrodymus. Konkrečiai, atsižvelgiant į bet kurią programą C ir viešą įvestį x, asmuo, žinantis lambda, gali sugeneruoti „fake_prf“ įrodymą, kurį V (vk, x, fake_prf) įvertins kaip „true“, nežinodamas paslapties w.

Taigi, norint iš tikrųjų paleisti generatorių, reikia labai saugaus proceso, kad niekas nežinotų ir neišsaugotų parametro. Tai buvo priežastis itin įmantri ceremonija „Zcash“ komanda atliko norėdama sugeneruoti patvirtinimo raktą ir patvirtinimo raktą, tuo pačiu įsitikindama, kad proceso metu „toksinių atliekų“ parametras lambda buvo sunaikintas.

Zk-SNARK Mūsų pavyzdinei programai

Kaip Alisa ir Bobas praktikoje naudos zk-SNARK, kad Alisa įrodytų, kad ji žino slaptą vertę aukščiau pateiktame pavyzdyje?

Visų pirma, kaip aptarta aukščiau, naudosime programą, apibrėžtą šia funkcija:

funkcija C (x, w) {return (sha256 (w) == x); } Kodo kalba: „JavaScript“ (javascript)

Pirmiausia Bobas turi paleisti generatorių G, kad būtų sukurtas įrodomasis raktas pk ir patvirtinimo raktas vk. Pirma, atsitiktinai sugeneruokite lambda ir naudokite tai kaip įvestį:

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

Su lambda parametru elkitės atsargiai, nes jei Alisa sužinos lambda vertę, ji galės sukurti netikrus įrodymus. Bobas dalinsis pk ir vk su Alice.

Alisa dabar atliks patarėjos vaidmenį. Ji turi įrodyti, kad žino s vertę, kuri maišo žinomą maišos H. Ji naudoja įrodomąjį algoritmą P naudodama įvestis pk, H ir s, kad generuotų įrodomąjį prf:

prf = P (pk, H, s)

Toliau Alisa pateikia įrodomąją prf Bobui, vykdančiam tikrinimo funkciją V (vk, H, prf), kuri šiuo atveju būtų teisinga, nes Alisa tinkamai žinojo paslaptį s. Bobas gali būti tikras, kad Alisa žinojo paslaptį, tačiau Alisai nereikėjo paslapties Bobui atskleisti.

Daugkartinio naudojimo įrodymo ir patvirtinimo raktai

Aukščiau pateiktame pavyzdyje zk-SNARK negalima naudoti, jei Bobas nori įrodyti Alisai, kad žino paslaptį, nes Alisa negali žinoti, kad Bobas neišsaugojo lambda parametro. Bobas galėjo patikimai padirbti įrodymus.

Jei programa yra naudinga daugeliui žmonių (pvz., „Zcash“ pavyzdys), patikima nepriklausoma grupė, atskirta nuo Alice ir Bob, galėtų paleisti generatorių ir sukurti įrodomąjį raktą pk ir patvirtinimo raktą vk taip, kad niekas nesužinotų apie lambda.

Kiekvienas, kuris tiki, kad grupė neapgavo, gali naudoti šiuos raktus būsimai sąveikai.

zk-SNARKs Ethereum

Kūrėjai jau pradėjo integruoti „zk-SNARK“ į „Ethereum“. Kaip tai atrodo? Konkrečiai, jūs galite pridėti tikrinimo algoritmo sudėtines dalis prie „Ethereum“ iš anksto sudarytų sutarčių forma. Štai kaip: paleiskite generatorių iš grandinės, kad gautumėte įrodymo raktą ir patvirtinimo raktą. Bet kuris patarėjas gali naudoti įrodomąjį raktą, kad sukurtų įrodymą, taip pat ne grandinę. Tada galite paleisti bendrą patikrinimo algoritmą išmaniosios sutarties viduje, naudodami įrodymą, patvirtinimo raktą ir viešąjį įvestį kaip įvesties parametrus. Tada galite naudoti patvirtinimo algoritmo rezultatus, kad suaktyvintumėte kitą grandinės veiklą.

Pavyzdys: konfidencialūs sandoriai

Štai paprastas pavyzdys, kaip „zk-SNARKs“ gali padėti apsaugoti privatumą „Ethereum“. Tarkime, kad mes turime paprastą simbolinę sutartį. Paprastai simbolinės sutarties esmė turėtų būti adresų ir likučių susiejimas:

kartografavimas (adresas => uint256) balansai; Kodo kalba: „JavaScript“ (javascript)

Mes išlaikysime tą patį pagrindinį pagrindą, išskyrus tai, kad balansą pakeisime balanso maišu:

kartografavimas (adresas => baitai32) balanceHashes; Kodo kalba: „JavaScript“ (javascript)

Mes neketiname slėpti operacijų siuntėjo ar gavėjo. Bet mes paslėpsime likučius ir išsiųstas sumas. Ši savybė kartais vadinama konfidencialūs sandoriai.

Norėdami naudoti žetonus iš vienos paskyros į kitą, naudosime du „zk-SNARK“. Vieną įrodymą sukuria siuntėjas, o kitą – gavėjas.

Paprastai žetoninėje sutartyje, kad dydžio vertės sandoris būtų galiojantis, turime patikrinti:

likučiai [fromAddress] >= vertė

Mūsų „zk-SNARK“ turi įrodyti, kad tai galioja, taip pat kad atnaujinti maišos atitinka atnaujintus likučius.

Pagrindinė mintis yra ta, kad siuntėjas pradinį balansą ir operacijos vertę naudos kaip asmeninius įvestis. Kaip viešą informaciją jie naudoja pradinio balanso, pabaigos balanso ir vertės maišos. Panašiai imtuvas pradinį balansą ir vertę naudos kaip slaptus įėjimus. Kaip viešą informaciją jie naudoja pradinio balanso, pabaigos balanso ir vertės maišos.

Žemiau yra programa, kurią naudosime siuntėjui zk-SNARK, kur, kaip ir anksčiau, x reiškia viešąjį įvestį, o w – privatų įvestį.

function senderFunction (x, w) {return (w.senderBalanceBefore > w.vertė && sha256 (w.value) == x.hashValue && sha256 (w.senderBalanceBefore) == x.hashSenderBalanceBefore && sha256 (w.senderBalanceBefore – w.value) == x.hashSenderBalanceAfter)} Kodo kalba: „JavaScript“ (javascript)

Imtuvo naudojama programa yra žemiau:

function receiverFunction (x, w) {return (sha256 (w.value) == x.hashValue && sha256 (w.receiverBalanceBefore) == x.hashReceiverBalanceBefore && sha256 (w.receiverBalanceBefore + w.value) == x.hashReceiverBalanceAfter)} Kodo kalba: „JavaScript“ (javascript)

Programos patikrina, ar siuntimo likutis yra didesnis nei siunčiama vertė, taip pat patikrina, ar visi maišos sutampa. Patikimas žmonių rinkinys sugeneruos mūsų zk-SNARKs įrodymo ir patvirtinimo raktus. Pavadinkime juos confTxSenderPk, confTxSenderVk, confTxReceiverPk ir confTxReceiverVk.

Naudojant „zk-SNARK“ simbolinėje sutartyje, tai atrodytų maždaug taip:

funkcijos perkėlimas (adresas _to, baitai32 hashValue, baitai32 hashSenderBalanceAfter, baitai32 hashReceiverBalanceAfter, baitai zkProofSender, baitai zkProofReceiver) {baitai32 hashSenderBalanceBefore = balanceHashes [msg.sender]; baitai32 hashReceiverBalanceBefore = balanceHashes [_to]; bool senderProofIsCorrect = zksnarkverify (confTxSenderVk, [hashSenderBalanceBefore, hashSenderBalanceAfter, hashValue], zkProofSender); bool receiverProofIsCorrect = zksnarkverify (confTxReceiverVk, [hashReceiverBalanceBefore, hashReceiverBalanceAfter, hashValue], zkProofReceiver); jei (senderProofIsCorrect && receiverProofIsCorrect) {balanceHashes [msg.sender] = hashSenderBalanceAfter; balanceHashes [_to] = hashReceiverBalanceAfter; }} Kodo kalba: „JavaScript“ („javascript“)

Taigi vieninteliai „blockchain“ atnaujinimai yra likučių maišos, o ne patys likučiai. Tačiau mes galime žinoti, kad visi likučiai yra teisingai atnaujinti, nes galime patys patikrinti, ar įrodymai buvo patikrinti.

Išsami informacija

Aukščiau pateikta konfidencialių sandorių schema skirta pateikti praktinį pavyzdį, kaip galima naudoti „zk-SNARK“ „Ethereum“. Norėdami sukurti patikimą konfidencialių sandorių schemą, turėtume išspręsti keletą klausimų:

  • Vartotojai turės sekti savo balansą kliento pusėje, o jei prarasite balansą, šie žetonai nebus atkurti. Likučius galbūt galima laikyti užšifruotus grandinėje naudojant raktą, gautą iš pasirašymo rakto.
  • Likučiams reikia naudoti 32 baitus duomenų ir užkoduoti entropiją, kad būtų išvengta galimybės pakeisti maišus norint išsiaiškinti likučius.
  • Reikia spręsti krašto siuntimo nenaudojamu adresu atvejį.
  • Siuntėjas turi bendrauti su imtuvu, kad galėtų siųsti. Galima turėti sistemą, kurioje siuntėjas naudodamas savo įrodymus inicijuoja operaciją. Tada imtuvas gali matyti blokų grandinėje, kad turi „laukiančią gaunamą operaciją“, ir gali ją užbaigti.

Užsiprenumeruokite mūsų naujienlaiškį, kuriame rasite naujausias „Ethereum“ naujienas, įmonės sprendimus, kūrėjų išteklius ir dar daugiau. El. Pašto adresas Išskirtinis turinysKaip sukurti sėkmingą „Blockchain“ produktąInternetinis seminaras

Kaip sukurti sėkmingą „Blockchain“ produktą

Kaip nustatyti ir paleisti „Ethereum“ mazgąInternetinis seminaras

Kaip nustatyti ir paleisti „Ethereum“ mazgą

Kaip susikurti savo „Ethereum“ APIInternetinis seminaras

Kaip susikurti savo „Ethereum“ API

Kaip sukurti socialinį ženkląInternetinis seminaras

Kaip sukurti socialinį ženklą

Saugumo priemonių naudojimas kuriant išmanųjį kontraktąInternetinis seminaras

Saugumo priemonių naudojimas kuriant išmanųjį kontraktą

Finansų ateitis Skaitmeninis turtas ir „DeFi“Internetinis seminaras

Finansų ateitis: skaitmeninis turtas ir „DeFi“

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