Kas me saame genereerida juhuslikke numbreid, kui me ei usalda ĂŒksteist? Osa 1

Tere, Habr!

Selles artikkel rÀÀgin tĂ”enĂ€osuslike numbrite genereerimisest osalejate poolt, kes ĂŒksteisesse ei usalda. Nagu allpool nĂ€eme, on "peaaegu" hea generaatori rakendamine suhteliselt lihtne, kuid vĂ€ga hea loomine on keeruline.

Miks on ĂŒldse vajalik genereerida juhuslikke numbreid osalejatele, kes ĂŒksteisesse ei usalda? Üks rakenduse valdkondi on detsentraliseeritud rakendused. NĂ€iteks rakendus, mis vĂ”tab osalejalt panuse ja kas kahekordistab summa 49% tĂ”enĂ€osusega vĂ”i vĂ”tab 51%, töötab ainult siis, kui see suudab erapooletult saada juhuslikku numbrit. Kui kĂŒberkurjategija saab mĂ”jutada juhuslike numbrite generaatori tulemust ja isegi vĂ€hesel mÀÀral suurendada oma vĂ”imalust saada rakenduses vĂ€ljamakse, vĂ”ib ta selle kergesti tĂŒhjaks teha.

Kui arendame jaotatud protokolli juhuslike numbrite genereerimiseks, soovime, et see omaks kolme omadust:

  1. See peab olema erapooletu. TeisisĂ”nu, ĂŒkski osaleja ei tohiks mingil viisil mĂ”jutada juhuslike numbrite generaatori tulemust.

  2. See peab olema ettearvamatu. TeisisĂ”nu, ĂŒkski osaleja ei tohi suuta prognoosida, milline number genereeritakse (vĂ”i sellega seotud omadusi) enne, kui see on genereeritud.

  3. Protokoll peab olema elujĂ”uline, st vastupidav sellele, et teatud protsent osalejatest lĂŒlitub vĂ€lja vĂ”i ĂŒritab teadlikult protokolli peatada.

Selles artiklis vaatleme kahte lĂ€henemist: RANDAO + VDF ja lĂ€henemine, mis pĂ”hineb kustutavatel koodidel. JĂ€rgmisel osal kĂ€sitleme ĂŒksikasjalikult lĂ€henemist, mis pĂ”hineb piirimĂŒĂŒgialustel.

Aga kÔigepealt vaatame lihtsat ja sageli kasutatavat algoritmi, mis on elujÔuline, ettearvamatu, kuid kallutatud.

RANDAO

RANDAO on vĂ€ga lihtne ja seetĂ”ttu ĂŒsna sageli kasutatav lĂ€henemine juhuslikkuse saamiseks. KĂ”ik vĂ”rgu osalejad valivad kĂ”igepealt kohalikult pseudojuhuslikku arvu, seejĂ€rel saadab iga osaleja valitud arvu rĂ€simise. SeejĂ€rel avavad osalejad kordamööda oma valitud arvud ja teevad nende avatud arvudega XOR-operatsiooni, mille tulemusest saab protokolli tulemus.

Avaldamisprotsessi esimene samm enne numberite avamist on vajalik, et rĂŒndajal ei oleks vĂ”imalik valida oma numbrit pĂ€rast seda, kui ta on nĂ€inud teiste osalejate numbreid. See vĂ”imaldaks tal tegelikult ĂŒksi mÀÀrata juhuslike numbrite generaatori vĂ€ljundi.

Protokolli kĂ€igus peavad osalejad kaks korda jĂ”udma ĂŒhisotsusele (nn konsensusele): millal alustada valitud numbrite avamist ja seega lĂ”petada hashide vastuvĂ”tt, ning millal lĂ”petada valitud numbrite vastuvĂ”tt ja arvutada vĂ€lja tulemuslik juhuslik number. Selliste otsuste vastuvĂ”tmine osalejate vahel, kes ĂŒksteise usaldusvÀÀrsuses ei ole kindlad, on iseenesest keeruline ĂŒlesanne, ja me tuleme selle juurde tagasi tulevastes artiklites; praeguses artiklis eeldame, et selline konsensusalgoritm on meile kergesti kĂ€ttesaadav.

Milliseid eelnevalt kirjeldatud omadusi omab RANDAO? See on ettearvamatu, omab sama elujĂ”udu kui selle aluseks olev konsensusprotokoll, kuid on siiski kallutatud. Eriti kui rĂŒndaja jĂ€lgib vĂ”rku, vĂ”ib ta pĂ€rast seda, kui teised osalejad oma numbreid avaldavad, arvutada nende XOR ja otsustada, kas oma numbri avaldamine mĂ”jutab tulemust. Kuigi see ei luba rĂŒndajal ĂŒksi mÀÀrata juhusliku arvu generaatori vĂ€ljundit, annab see siiski 1 bitti mĂ”ju. Kui rĂŒndajad kontrollivad mitmeid osalejaid, siis kontrollitavate bitide arv vastab nende halduses olevate osalejate arvule.

Kas me saame genereerida juhuslikke numbreid, kui me ei usalda ĂŒksteist? Osa 1

RĂŒndajate mĂ”ju saab oluliselt vĂ€hendada, kui nĂ”uda, et osalejad avalikustaksid numbreid jĂ€rjekorras. Sellisel juhul saab rĂŒndaja mĂ”jutada tulemust ainult juhul, kui ta avaldab oma numbri viimase. Kuigi mĂ”ju on oluliselt vĂ€iksem, on algoritm endiselt kallutatud.

RANDAO + VDF

Üks vĂ”imalus, kuidas muuta RANDAO erapooletuks, on jĂ€rgmine: pĂ€rast kĂ”igi numbrite avamist ja XOR-i arvutamist esitatakse selle tulemus funktsioonile, mille arvutamine vĂ”tab vĂ€ga palju aega, kuid mis vĂ”imaldab arvutuse Ă”igsust kiiresti kontrollida.

(vdf_output, vdf_proof) = VDF_compute(input) // see on vÀga aeglane
correct = VDF_verify(input, vdf_output, vdf_proof) // see on vÀga kiire

Sellist funktsiooni nimetatakse Verifiable Delay Function ehk VDF. Kui lÔpptulemuse arvutamine vÔtab rohkem aega kui numbrite avamise etapp, siis ei saa kurjategija ennustada, milline mÔju tagab tema numbri esitlemine vÔi varjamine, seega kaotab ta vÔimaluse tulemusele mÔjutada.

Heade VDF-de vÀljatöötamine on ÀÀrmiselt keeruline. Viimasel ajal on tehtud mitmeid lÀbimurdeid, nÀiteks seda ja see, mille, mis muudavad VDF rakendamise praktilisemaks ning Ethereum 2.0 plaanib pikaajalises perspektiivis kasutada RANDAO-d koos VDF-ga juhuslike numbrite allikana. Lisaks sellele, et see lÀhenemine on ettearvamatu ja erapooletu, on sellel ka tÀiendav eelis, mis seisneb elujÔulisuses, kui vÀhemalt kaks osalist on vÔrku saadaval (tingimusel, et kasutatav konsensuse protokoll toimib nii vÀikeses osalejate arvus).

Selle lĂ€henemise suurim keerukus seisneb VDF seadistamises nii, et isegi osaline, kellel on vĂ€ga kallis spetsialiseeritud varustus, ei suudaks VDF-d arvutada enne avalikustamise etapi lĂ”ppu. Ideaalis peaks algoritmil olema isegi mĂ€rkimisvÀÀrne varu, ĂŒtleme 10x. Alloleval joonisel on kujutatud osalise rĂŒnnakut, kellel on spetsialiseeritud ASIC, mis vĂ”imaldab tal kĂ€ivitada VDF-d kiiremini kui aeg, mis on mÀÀratud RANDAO kinnituste avalikustamiseks. Selline osaline suudab ikkagi arvutada lĂ”pptulemust, kasutades oma numbrit ja ilma selleta, ning seejĂ€rel oma arvutuste pĂ”hjal otsustada, kas seda nĂ€idata vĂ”i mitte.

Kas me saame genereerida juhuslikke numbreid, kui me ei usalda ĂŒksteist? Osa 1

KĂ€ideldava VDF perekonna puhul vĂ”ib spetsialiseeritud ASIC-i tootlikkus olla ĂŒle 100 korra suurem kui tavalise varustuse puhul. Seega, kui avalikustamise faas kestab 10 sekundit, peab sellisel ASIC-il arvutatud VDF vĂ”tma aega ĂŒle 100 sekundi, et olla 10-kordne ohutusvaru, ning seega, tavalise varustuse puhul arvutatud VDF peab kestma 100 x 100 sekundit = umbes 3 tundi.

Ethereum Foundation plaanib selle probleemi lahendada, luues oma tasuta avalikud ASIC-id. Kui see juhtub, saavad kÔik muud protokollid samuti kasutada selle tehnoloogia eeliseid, kuid seni ei ole RANDAO + VDF lÀhenemine sama elujÔuline protokollide jaoks, mis ei saa investeerida oma ASIC-ide arendamisse.

Palju artikleid, videoid ja muud teavet VDF kohta on kogutud sellel veebilehel.

Kasutame kustutuskoode

Selles jaotises vaatleme juhuslike arvude genereerimise protokolli, mis kasutab kustutuskoode. Ta suudab taluda kuni ⅓ pahatahtlikest osalejatest, jÀÀdes samas elujĂ”uliseks, ja lubab kuni ⅔ pahatahtlike olemasolu, enne kui nad suudavad ennustada vĂ”i mĂ”jutada tulemust.

Protokolli pÔhidee on jÀrgmine. Lihtsuse huvides oletame, et selles on tÀpselt 100 osalejat. Eeldame ka, et kÔigil osalejatel on kohalikult teatud privaatne vÔti ja kÔigi osalejate avalikud vÔtmed on kÔigile osalejatele teada.

  1. Iga osaleja mĂ”tleb kohalikult vĂ€lja pika stringi, jagab selle 67 ossa, loob kustutuskoodid, et saada 100 osakest, nii et mistahes 67 on piisavad stringi taastamiseks, mÀÀrab iga 100 osakese ĂŒhele osalejale ja krĂŒpteerib need selle osaleja avaliku vĂ”tmega. SeejĂ€rel avalikustatakse kĂ”ik kodeeritud osakesed.

  2. Osalejad kasutavad mingit konsensust, et saavutada ĂŒksmeel konkreetsete 67 osaleja kodeeritud komplektide ĂŒle.

  3. Kuna konsensus on saavutatud, vĂ”tab iga osaleja igast 67 komplektist oma avaliku vĂ”tme abil krĂŒpteeritud osakesed, dekrĂŒpteerib kĂ”ik sellised osakesed ja avalikustab kĂ”ik sellised dekrĂŒpteeritud osakesed.

  4. Kui 67 osalejat on lÀbinud etapi (3), saab kÔik kokku lepitud komplektid tÀielikult dekodeerida ja taastada kustutamise koodide omaduste tÔttu, ja lÔplik number saab kÀtte XOR-iga algsetest ridadest, millega osalejad alustasid (1).

Kas me saame genereerida juhuslikke numbreid, kui me ei usalda ĂŒksteist? Osa 1

On vĂ”imalik nĂ€idata, et see protokoll on erapooletu ja ettearvamatu. Tulemuse juhuslik number mÀÀratletakse pĂ€rast konsensuse saavutamist, kuid ei ole veel kellelegi teada, kuni ⅔ osalejat ei dekodeeri osi, mis on nende avaliku vĂ”tmega krĂŒpteeritud. Seega on juhuslik number mÀÀratletud enne, kui teave, mis on vajalik selle taastamiseks, avalikustatakse.

Mis toimub, kui etapis (1) saadab ĂŒks osalejatest teistele osalejatele kodeeritud osad, mis ei ole mĂ”ne rea korrektne kustutamise kood? Ilma tĂ€iendavate muudatusteta ei suuda erinevad osalejad kas tĂ€ielikult taastada rida vĂ”i taastavad nad erinevaid ridasid, mille tulemusena saavad erinevad osalejad erineva juhusliku numbri. Selle vĂ€ltimiseks vĂ”ib teha jĂ€rgmist: iga osaleja, lisaks kodeeritud osadele, arvutab samuti Merkle puu kĂ”iki selliseid osi, ja iga osalejale saadetakse nii kooditud osa kui ka Merkle puu juur ja tĂ”end osa kuulumisest Merkle puusse. Konsensuse sammul (2) nĂ”ustuvad osalejad mitte ainult mitmete komplektide osas, vaid ka mitmete konkreetsete selliste puude juurte osas (kui mĂ”ni osaleja on protokollist kĂ”rvale lĂ€inud ja on saatnud erinevad Merkle puu juured erinevatele osalejatele ning kaks sellist juurt [
] konsensuse ajal on nĂ€idatud, ei kuulu tema rida lĂ”plikku komplekti). Konsensuse tulemusena saame 67 kodeeritud rida ja vastavad Merkle puu juured, nii et on vĂ€hemalt 67 osalejat (mitte tingimata need, kes esitasid vastavad read), kelle jaoks iga 67 rea puhul on sĂ”num kustutuskoodi osaga ning tĂ”end nende osade kuulumisest vastavasse Merkle puusse.

Kui sammul (4) osaleja dekrĂŒpteerib 67 osa mĂ”ne rea jaoks ja pĂŒĂŒab nende pĂ”hjal originaalset rida taastada, on vĂ”imalik ĂŒks jĂ€rgmistest variantidest:

  1. Rida taastatakse, ja kui seejÀrel kodeerida see uuesti kustutuskoodidega ning arvutada vÀlja Merkle'i puu kohalike osade jaoks, siis juur vastab sellele, millega on saavutatud konsensus.

  2. Rida taastatakse, kuid kohaliku arvutuse juur ei vasta sellele, millega on saavutatud konsensus.

  3. Rida ei taastata.

On lihtne nĂ€idata, et kui vĂ€hemalt ĂŒhe osalise puhul juhtus variant (1), siis juhtub see kĂ”igi osaliste puhul, ja vastupidi, kui vĂ€hemalt ĂŒhe osalise puhul juhtus variant (2) vĂ”i (3), siis juhtus see kĂ”igi osaliste puhul variant (2) vĂ”i (3). SeelĂ€bi, iga rida kogumis kas kĂ”ik osalised taastavad selle edukalt vĂ”i ei suuda seda taastada. Siis on tulemuslik juhuslik number – see on XOR ainult nende ridade osas, mida osalised suudavad taastada.

PiirvÀÀrsete allkirjad

Teine lÀhenemine juhuslikkusele seisneb nii-öelda lÀveallkirjade BLS kasutamises. LÀveallkirjadele pÔhinev juhusliku arvu generaator omab tÀpselt samu garantiisid nagu eespool kirjeldatud kustutuskoodide pÔhine algoritm, kuid sellel on tÔeliselt madalam asymptootika vÔrreldes vÔrgus edastatavate sÔnumite arvuga iga genereeritud arvu kohta.

BLS allkirjad on konstruktsioon, mis vĂ”imaldab mitmel osalejal luua ĂŒhe ĂŒhise allkirja sĂ”numile. Selliseid allkirju kasutatakse sageli ruumi ja ribalaiuse kokkuhoiu nimel, kuna need ei vaja mitme allkirja saatmist. 

BLS-allkirjade sagedane rakendamine plokiahela protokollides, lisaks juhuslike arvude genereerimisele, on BFT-protokollides plokkide allkirjastamine. Oletame, et 100 osalejat loovad blokke ja plokk loetakse lĂ”plikuks, kui 67 neist allkirjastab selle. KĂ”ik nad vĂ”ivad esitada oma BLS-allkirja osi ja kasutada mingit konsensuse algoritmi, et koondada 67 neist, ning seejĂ€rel ĂŒhendada need ĂŒheks BLS-allkiri. Igasugused 67 (vĂ”i enam) osa vĂ”ivad olla kasutatud lĂ”pliku allkirja loomisel, sĂ”ltudes sellest, millised konkreetsed 67 allkirja on ĂŒhendatud, ja seega vĂ”ivad need erineda, kuid vaatamata sellele, et erinev valik 67 osalejat tekitab erineva allkirja, on iga selline allkiri ploki jaoks korrektne. ÜlejÀÀnud osalejatele piisab siis, kui nad saavad vĂ”rgus ja kontrollivad iga ploki kohta vaid ĂŒhte allkirja, mitte 67, mis oluliselt vĂ€hendab vĂ”rgu koormust.

KĂŒsimus on selles, et kui osalejate kasutatavad privaatvĂ”tmed genereeritakse teatud viisil, siis sĂ”ltumata sellest, kui palju allkirju (67 vĂ”i rohkem, kuid mitte vĂ€hem) on kokku kogutud, saab tulemusena saadud allkiri olema sama. Seda saab kasutada juhuslikkuse allikana: osalejad lepivad esmalt kokku mingi sĂ”numi, mida nad allkirjastavad (see vĂ”ib olla RANDAO vĂ€ljund vĂ”i lihtsalt viimase ploki hash, tegelikult ei ole sellel tĂ€htsust, peaasi, et see iga kord muutuks ja oleks kooskĂ”lastatud), ja loovad sellele BLS-allkirja. Generatsiooni tulemus on unpredictable kuni 67 osalejat esitavad oma osalused, ja pĂ€rast seda on vĂ€ljund juba ette mÀÀratud ja ei saa sĂ”ltuda ĂŒhegi osaleja tegevusest.

Seda lĂ€henemine juhuslikkusele on elujĂ”uline, kui vĂ€hemalt ⅔ osalistest on online ja jĂ€rgivad protokolli, ning on erapooletud ja ettearvamatud, kuni vĂ€hemalt ⅓ osalistest jĂ€rgib protokolli. Oluline on mĂ€rkida, et kurjategija, kes kontrollib rohkem kui ⅓, kuid vĂ€hem kui ⅔ osalistest, vĂ”ib protokolli peatada, kuid ei saa ennustada ega mĂ”jutada selle vĂ€ljundit.

Piirangutega allkirjad iseenesest on vĂ€ga huvitav teema. Artikli teises osas kĂ€sitleme ĂŒksikasjalikult, kuidas need töötavad ja kuidas osaliste vĂ”tmeid genereerida, et piirangutega allkirju saaks kasutada juhuslike numbrite generaatorina.

KokkuvÔtteks

See artikkel on esimene tehniliste artiklite seerias blogis NEAR. NEAR on plokiahela protokoll ja platvorm detsentraliseeritud rakenduste arendamiseks, keskendudes arendamise lihtsusele ja lÔppkasutajate kasutusmugavusele.

Protokolli kood on avatud, meie teostus on kirjutatud Rustis, selle leiate siin.

Vaata, milline nÀeb vÀlja NEAR-i arendamine, ja katseta online-IDE-s. siit.

JÀlgi kÔiki uudiseid eesti keeles Telegrami grupis ja VKontakte grupis., aga inglise keeles ametlikul Twitteris.

Kohtumiseni!

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster