Tere, Habr!
Selles artiklis rÀÀgin ma pseudojuhuslike arvude genereerimisest osalistele, kes ei usalda ĂŒksteist. Nagu allpool nĂ€eme, on 'peaaegu' head generaatorit lihtsalt rakendada, kuid vĂ€ga hea valmistamine on keeruline.
Miks ĂŒldse on vaja osalistel genereerida juhuslikke numbreid, kui nad ei usalda ĂŒksteist? Ăks rakenduse valdkond on detsentraliseeritud rakendused. NĂ€iteks rakendus, mis vĂ”tab panuse osaliselt ja kas kahekordistab summa 49% tĂ”enĂ€osusega vĂ”i vĂ”tab 51%, toimib ainult siis, kui see suudab erapooletult saada juhusliku arvu. Kui kĂŒberkurjategija suudab mĂ”jutada juhuslike arvude generaatori tulemusi ja isegi vĂ€hesel mÀÀral suurendada oma vĂ”imalusi rakenduses makse saada, tĂŒhjendab ta selle kergesti.
Kui me arendame jagatud protokolli juhuslike arvude genereerimiseks, soovime, et see omaks kolme omadust:
See peab olema erapooletu. TeisisĂ”nu, ĂŒkski osaline ei tohi mingil moel mĂ”jutada juhuslike arvude generaatori tulemust.
See peab olema ettearvamatu. TeisisĂ”nu, ĂŒkski osaline ei tohi suuta ennustada, milline number genereeritakse (vĂ”i tuletada selle omadusi) enne, kui see on genereeritud.
Protokoll peab olema elujĂ”uline, st resistentne selle suhtes, et mingi osakaal osalistest lahkub vĂ”rgust vĂ”i ĂŒritab tahtlikult protokolli peatada.
Selles artiklis kÀsitleme kahte lÀhenemist: RANDAO + VDF ja lÀhenemist, mis pÔhineb kustutuskoodidel. JÀrgmises osas kÀsitleme pÔhjalikult lÀhenemist, mis pÔhineb lÀve allkirjadel.
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 liikmed valivad esmalt kohapeal pseudojuhusliku arvu, seejĂ€rel saadab iga osaline valitud arvu rĂ€sivÀÀrtuse. Edasi avavad osalised kordamööda oma valitud numbrid, ja nende avatud numbrite ĂŒle viiakse lĂ€bi XOR tehe, mille tulemusena saadakse protokolli tulemus.
Hash publikatsiooni samm enne arvu avamist on vajalik, et rĂŒndaja ei saaks valida oma numbrit pĂ€rast seda, kui ta on nĂ€inud teiste osalejate arve. See vĂ”imaldaks tal tegelikult ĂŒksi mÀÀrata juhuslike numbrite generaatori vĂ€ljundi.
Protokolli kĂ€igus peavad osalejad kaks korda jĂ”udma ĂŒhisele otsusele (nn konsensus): millal alustada valitud numbrite avamist ja seega lĂ”petada hashede vastuvĂ”tmine, ja millal lĂ”petada valitud numbrite vastuvĂ”tmine ning arvutada lĂ”plik juhuslik number. Nende otsuste vastuvĂ”tmine osalejate vahel, kes ei usalda ĂŒksteist, on iseenesest keeruline ĂŒlesanne, ja me pöördume selle teema juurde tulevastes artiklites, kĂ€esolevas artiklis eeldame, et meil on selline konsensus algoritm olemas.
Millised omadused, millest me eespool rÀÀkisime, on RANDAO-l? See on ettearvamatu, omades sama elujĂ”udlust kui selle pĂ”hjal olev konsensusprotokoll, kuid see on kallutatud. EelkĂ”ige vĂ”ib rĂŒndaja jĂ€lgida vĂ”rgustikku ja pĂ€rast seda, kui teised osalejad oma numbrid avavad, suudab ta arvutada nende XOR-i ja otsustada, kas avada oma number vĂ”i mitte, et tulemusele mĂ”ju avaldada. Kuigi see ei luba rĂŒndajal ĂŒksi mÀÀrata juhuslike numbrite generaatori vĂ€ljundit, annab see talle siiski 1 bitti mĂ”ju. Ja kui rĂŒndajad kontrollivad mitmeid osalejaid, siis kontrollitud bitite arv on sama, mis nende kĂ€es oleva osalejate arv.

RĂŒndajate mĂ”ju vĂ”ib oluliselt vĂ€hendada, kui nĂ”uda, et osalejad avavad numbrid jĂ€rjestikku. Siis saab rĂŒndaja tulemusele mĂ”ju avaldada ainult juhul, kui ta avab viimase. Kuigi mĂ”ju on mĂ€rkimisvÀÀrselt vĂ€iksem, on algoritm siiski kallutatud.
RANDAO + VDF
Ăks vĂ”imalus, kuidas teha RANDAO mitte kallutatud, on jĂ€rgmine: pĂ€rast seda, kui kĂ”ik numbrid on avatud ja XOR arvutatud, antakse selle tulemus sisendiks funktsioonile, mille arvutamine vĂ”tab vĂ€ga kaua aega, kuid mille Ă”igsuse kontrollimine on vĂ€ga kiire.
(vdf_output, vdf_proof) = VDF_compute(input) // see on vÀga aeglane
correct = VDF_verify(input, vdf_output, vdf_proof) // see on vÀga kiireSee funktsioon on tuntud kui Verifiable Delay Function ehk VDF. Kui lÔpliku tulemuse arvutamine vÔtab rohkem aega kui numbrite avamise etapp, ei saa kurjategija ennustada efekti, kui ta oma numbrit demonstreerib vÔi varjab, ning seetÔttu kaotab ta vÔimaluse tulemusele mÔju avaldada.
Hea VDF arendamine on ÀÀrmiselt keeruline. Viimase aja jooksul on tehtud mitu lĂ€bimurret, nĂ€iteks ja mis on teinud VDF-de rakendamise praktikas lihtsamaks, ja Ethereum 2.0 plaanib pikaajaliselt kasutada RANDAO-d VDF-ga juhuslike numbrite allikana. Lisaks sellele, et see lĂ€henemine on ettearvamatu ja erapooletu, on sellel lisaks veel ĂŒks eelis, mis seisneb töökindluses, kui vĂ€hemalt kaks osalejat on vĂ”rgus (eeldusel, et kasutatav konsensusprotokoll on toimiv nii vĂ€ikese osalejate arvu puhul).
Selle lĂ€henemise suurim vĂ€ljakutse on VDF seadistamine nii, et isegi osaleja, kellel on vĂ€ga kallis spetsialiseeritud varustus, ei suudaks VDF-d arvutada enne, kui avamise faas on lĂ”ppenud. Ideaalis peaks algoritm olema isegi mĂ€rkimisvÀÀrse varu, ĂŒtleme, 10x. Alloleval joonisel on kujutatud osa, kus osaleja, kellel on spetsialiseeritud ASIC, suudab kĂ€ivitada VDF-d kiiremini, kui on RANDAO kinnituse avamiseks ettenĂ€htud aeg. Selline osaleja vĂ”ib siiski arvutada lĂ”pptulemuse, kasutades vĂ”i mitte kasutades oma numbrit, ja seejĂ€rel, lĂ€htudes arvutustest, valima, kas nĂ€idata seda vĂ”i mitte.

Ălepool toodud VDF perekonna puhul vĂ”ib spetsialiseeritud ASIC-i jĂ”udlus olla ĂŒle 100 korda parem kui tavaliste seadmete omast. Seega, kui avamise faas kestab 10 sekundit, peab sellisel ASIC-il arvutatud VDF vĂ”tma rohkem kui 100 sekundit, et omada 10-kordset ohutusvaru, ja seega sama VDF, mis arvutatakse tavalise varustuse abil, peab vĂ”tma 100 x 100 sekundit = ~ 3 tundi.
Ethereum Foundation kavatseb selle probleemi lahendada, luues enda avalikud tasuta ASIC-id. Kui see juhtub, saavad kÔik teised protokollid samuti seda tehnoloogiat kasutada, kuid kuni selle ajani ei ole RANDAO + VDF lÀhenemine sama elujÔuline protokollide jaoks, kes ei saa investeerida oma ASIC-ide arendamisse.
Palju artikleid, videoid ja muud teavet VDF kohta on kogutud .
Kasutame kustutuskode
Selles osas vaatleme juhuslike arvude genereerimise protokolli, mis kasutab . See suudab taluda kuni â pahatahtlikest osalejatest ja lubab kuni â pahatahtlikku osalejat, enne kui nad suudavad tulemust ennustada vĂ”i sellele mĂ”ju avaldada.
Protokolli pÔhijÔud on jÀrgmine. Lihtsuse huvides eeldame, et selles osaleb tÀpselt 100 liiget. Eeldame ka, et kÔigil liikmetel on kohalikult olemas mÔni privaatvÔti ning kÔigi liikmete avalikud vÔtmed on kÔigile osalejatele teada:
Iga liige mĂ”tleb kohalikult vĂ€lja pika stringi, jagab selle 67 osaks, loob kustutuskoodid 100 osaleja saamiseks, nii et igast 67-st piisab stringi taastamiseks, mÀÀrab iga 100 osast ĂŒhe osalejale ja krĂŒpteerib need sama osaleja avaliku vĂ”tmega. SeejĂ€rel avalikustatakse kĂ”ik krĂŒpteeritud osad.
Osalejad kasutavad mingit konsensust, et jĂ”uda kokkuleppele konkreetsete 67 osaleja krĂŒpteeritud kogumite ĂŒle.
Kui konsensus on saavutatud, vĂ”tab iga liige iga 67 kogumi krĂŒpteeritud osad, mis on krĂŒpteeritud nende avaliku vĂ”tmega, dekrĂŒpteerib kĂ”ik sellised osad ja avalikustab kĂ”ik dekrĂŒpteeritud osad.
Kui 67 osalejat on lÀbinud sammu (3), saab kÔiki kokkulepitud kogumeid tÀielikult dekodeerida ja taastada kustutuskoodide omaduste tÔttu, ning lÔplik number vÔib olla saadud algsete stringide XOR-iga, millega osalejad alustasid (1).

On vĂ”imalik nĂ€idata, et see protokoll on erapooletu ja ettearvamatu. Tulemuslik juhuslik number mÀÀratakse pĂ€rast konsensuse saavutamist, kuid kellelegi see ei ole teada, kuni â osalejatest ei dekrĂŒpteeri osi, mis on nende avaliku vĂ”tmega krĂŒptitud. Seega on juhuslik number mÀÀratud enne, kui teave, mis on piisav selle taastamiseks, on avaldatud.
Mis juhtub, kui sammu (1) jooksul saadab ĂŒks osalejatest teistele osalejatele kodeeritud osad, mis ei ole mĂ”ne rea korrektne kustutuskood? Ilma tĂ€iendavate muudatusteta ei suuda erinevad osalejad kas tĂ€ielikult rida taastada vĂ”i taastavad nad erinevaid ridu, mis viib selleni, et erinevad osalejad saavad erineva juhusliku numbri. Selle vĂ€ltimiseks saab teha jĂ€rgmist: iga osaleja arvutab peale kodeeritud osade ka , ja saadab igale osalejale nii kodeeritud osa kui Merkle puu juure ja tĂ”endi osa sisestamise kohta Merkle puusse. Konsensuse sammul (2) nĂ”ustuvad osalejad siis mitte lihtsalt mitme komplektiga, vaid mitme konkreetse sellise puu juurega (kui mĂ”ni osaleja on protokollist kĂ”rvalekaldunud ja on saatnud erinevaid Merkle puude juuri erinevatele osalejatele, ja kaks sellist juurt nĂ€idatakse konsensuse ajal, siis ei kaasata tema rida tulemuste komplekti). Konsensuse lĂ”puks on meil 67 kodeeritud rida ja nendega seotud Merkle puude juured, nii et vĂ€hemalt 67 osalejat (mitte tingimata need, kes esitasid vastavad read) saavat igas 67 reas sĂ”numi kustutuskoodiga osast ja tĂ”endi nende osa vastavuses Merkle puusse.
Kui sammu (4) jooksul osaleja dekrĂŒpteerib 67 osa mĂ”ne rea jaoks ja proovib neid jĂ€rgi taastada, on vĂ”imalik ĂŒks jĂ€rgmistest variantidest:
Rida taastatakse, ja kui seda seejĂ€rel uuesti kustutuskoodide abil kodeerida ja arvutada Merkle puu lokaalsete osade jaoks, siis juur vastab sellele, mille ĂŒle on saavutatud konsensus.
Rida taastatakse, kuid lokaalsetelt arvutatud juurt ei vastata sellele, mille ĂŒle on saavutatud konsensus.
Rida ei taastata.
Lihtne on nĂ€idata, et kui vĂ€hemalt ĂŒhel osalejal juhtus variant (1), siis toimub see kĂ”igil osalejatest ja vastupidi, kui vĂ€hemalt ĂŒhel osalejal juhtus variant (2) vĂ”i (3), siis toimub see samuti kĂ”igil osalejatest. Seega, iga rida andmestikus kas suudavad kĂ”ik osalejad selle taastada vĂ”i mitte. Seega, tulemuseks olev juhuslik number on XOR vaid nende ridade jaoks, mida osalejad suudavad taastada.
PiirvÀÀrtuste allkirjad
Teine lĂ€henemine juhuslikkusele hĂ”lmab nn BLS-i piirvÀÀrtuste allkirju. PiirvÀÀrtuste pĂ”hjal genereeritud juhuslike arvude generaatoril on tĂ€pselt samasugused garantiid nagu eelnevalt kirjeldatud kustutuskoodide pĂ”hine algoritm, kuid sellel on mĂ€rkimisvÀÀrselt vĂ€iksem sĂ”numite edastamise asĂŒmptootika vĂ”rreldes iga genereeritud numbri kohta.
BLS-i allkirjad on konstruktsioon, mis vĂ”imaldab mitmel osalejal luua ĂŒhe ĂŒhise allkirja sĂ”numile. Selliseid allkirju kasutatakse tihti ruumi ja ribalaiuse kokkuhoiuks, kuna need ei nĂ”ua mitme allkirja saatmist.Â
BLS-allkirjade sage rakendamine plokiahela protokollides, peale juhuslike arvude genereerimise, on plokkide allkirjastamine BFT protokollides. Oletame, et 100 osalejat loovad plokke, ja plokk loetakse lĂ”plikuks, kui 67 neist allkirjastavad selle. KĂ”ik nad saavad esitada oma BLS-allkirja osi ja kasutada mingit konsensusalgoritmi, et koondada 67 neist ja seejĂ€rel kombineerida need ĂŒheks BLS-allkirjaks. Igasuguseid 67 (vĂ”i rohkem) osa saab kasutada lĂ”pliku allkirja loomiseks, mis sĂ”ltub sellest, millised tĂ€psed 67 allkirja on kokku pandud, ja seetĂ”ttu vĂ”ib see varieeruda, kuid hoolimata sellest, et erinevad valikud 67 osalejast tekitavad erineva allkirja, on iga selline allkiri valideeritud allkiri ploki jaoks. ĂlejÀÀnud osalejatele on seejĂ€rel piisav, et saada vĂ”rgust ainult ĂŒks allkiri iga ploki kohta, mitte 67, mis oluliselt vĂ€hendab vĂ”rgu koormust.
Selgus on, et kui osalejate kasutatavad privaatvĂ”tmed genereeritakse teatud viisil, siis olenemata sellest, kui palju 67 allkirja (vĂ”i rohkem, kuid mitte vĂ€hem) kokku liidetakse, on tulemusena saadud allkiri sama. Seda saab kasutada juhuslikkuse allikana: osalejad lepivad esmalt kokku mingis sĂ”numis, mille 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) ning loovad sellele BLS-allkirja. Generatsiooni tulemus on ennustamatu, kuni 67 osalejat ei esita oma osi, ja pĂ€rast seda on vĂ€ljund juba ette mÀÀratud ega saa sĂ”ltuda ĂŒhegi osaleja toimingutest.
Selline lĂ€henemine juhuslikkusele on elujĂ”uline, kui vĂ€hemalt â osalejatest on online ja jĂ€rgivad protokolli, ning on objektiivne ja ettearvamatu, kuni vĂ€hemalt â osalejatest jĂ€rgivad protokolli. Oluline on tĂ€hele panna, et kurjategija, kes kontrollib rohkem kui â , kuid vĂ€hem kui â osalejat, vĂ”ib protokolli peatada, kuid ei saa ennustada ega mĂ”jutada selle vĂ€ljundit.
Piiratud allkirjad iseenesest on vĂ€ga huvitav teema. Artikli teises osas uurime ĂŒksikasjalikult, kuidas need töötavad ja kuidas osalejate vĂ”tmeid tuleb genereerida, et piiratud allkirju saaks kasutada juhuslike arvude generaatorina.
KokkuvÔtteks
See artikkel on esimene tehniliste artiklite seerias blogis . NEAR on plokiahela protokoll ja platvorm detsentraliseeritud rakenduste arendamiseks, keskendudes arenduse lihtsusele ja lÔppkasutajate hÔlpsusele.
Protokolli kood on avatud, meie teostus on kirjutatud Rustis, seda saab leida .
Vaata, kuidas NEAR-i arendus vÀlja nÀeb ja eksperimentida saad veebipÔhises IDE-s .
KÔiki uudiseid vene keeles saab jÀlgida ja , ja inglise keeles ametlikus .
JÔuame taas kokku!
Allikas: habr.com
