Äau Habr!
Å ajÄ rakstÄ es runÄÅ”u par pseidogadÄ«juma skaitļu Ä£enerÄÅ”anu, ko veic dalÄ«bnieki, kuri neuzticas viens otram. KÄ redzÄsim tÄlÄk, āgandrÄ«zā laba Ä£eneratora ievieÅ”ana ir diezgan vienkÄrÅ”a, bet ļoti laba ir sarežģīta.
KÄpÄc bÅ«tu nepiecieÅ”ams Ä£enerÄt nejauÅ”us skaitļus starp dalÄ«bniekiem, kuri neuzticas viens otram? Viena lietojuma joma ir decentralizÄtas lietojumprogrammas. PiemÄram, lietojumprogramma, kas pieÅem likmi no dalÄ«bnieka un vai nu dubulto summu ar 49% varbÅ«tÄ«bu vai atÅem ar 51% varbÅ«tÄ«bu, darbosies tikai tad, ja tÄ var objektÄ«vi saÅemt nejauÅ”u skaitli. Ja uzbrucÄjs var ietekmÄt nejauÅ”o skaitļu Ä£eneratora iznÄkumu un pat nedaudz palielinÄt savu iespÄju saÅemt izmaksu aplikÄcijÄ, viÅÅ” to viegli izpostÄ«s.
IzstrÄdÄjot sadalÄ«tu nejauÅ”o skaitļu Ä£enerÄÅ”anas protokolu, mÄs vÄlamies, lai tam bÅ«tu trÄ«s Ä«paŔības:
-
ViÅam jÄbÅ«t objektÄ«vam. Citiem vÄrdiem sakot, neviens dalÄ«bnieks nekÄdÄ veidÄ nedrÄ«kst ietekmÄt nejauÅ”o skaitļu Ä£eneratora rezultÄtu.
-
ViÅam jÄbÅ«t neparedzamam. Citiem vÄrdiem sakot, neviens dalÄ«bnieks nedrÄ«kst paredzÄt, kÄds skaitlis tiks Ä£enerÄts (vai izsecinÄt kÄdu no tÄ Ä«paŔībÄm), pirms tas tiek Ä£enerÄts.
-
Protokolam ir jÄbÅ«t dzÄ«votspÄjÄ«gam, tas ir, izturÄ«gam pret to, ka noteikta daļa dalÄ«bnieku atvienojas no tÄ«kla vai apzinÄti mÄÄ£ina apturÄt protokolu.
Å ajÄ rakstÄ mÄs aplÅ«kosim divas pieejas: RANDAO + VDF un dzÄÅ”anas kodu pieeju. NÄkamajÄ daÄ¼Ä mÄs detalizÄti apskatÄ«sim pieeju, kuras pamatÄ ir sliekÅ”Åa paraksti.
Bet vispirms apskatÄ«sim vienkÄrÅ”u un plaÅ”i izmantotu algoritmu, kas ir dzÄ«votspÄjÄ«gs, neparedzams, bet neobjektÄ«vs.
RANDAO
RANDAO ir ļoti vienkÄrÅ”a un tÄpÄc diezgan bieži izmantota pieeja nejauŔības Ä£enerÄÅ”anai. Visi tÄ«kla dalÄ«bnieki vispirms lokÄli izvÄlas pseidogadÄ«juma numuru, pÄc tam katrs dalÄ«bnieks nosÅ«ta izvÄlÄtÄ numura jaucÄjkodu. TÄlÄk dalÄ«bnieki pÄrmaiÅus atklÄj savus izvÄlÄtos skaitļus un veic XOR operÄciju atklÄtajiem skaitļiem, un Ŕīs darbÄ«bas rezultÄts kļūst par protokola rezultÄtu.
JaucÄjkodu publicÄÅ”ana pirms skaitļu atklÄÅ”anas ir nepiecieÅ”ama, lai uzbrucÄjs nevarÄtu izvÄlÄties savu numuru pÄc tam, kad ir redzÄjis citu dalÄ«bnieku numurus. Tas ļautu viÅam praktiski vienpersoniski noteikt nejauÅ”o skaitļu Ä£eneratora izvadi.
Protokola laikÄ dalÄ«bniekiem divreiz ir jÄpieÅem kopÄ«gs lÄmums (tÄ sauktais konsenss): kad sÄkt atklÄt atlasÄ«tos skaitļus un lÄ«dz ar to pÄrtraukt jaukÅ”anas pieÅemÅ”anu, un kad pÄrtraukt pieÅemt izvÄlÄtos skaitļus un aprÄÄ·inÄt iegÅ«to nejauŔību. numuru. Å Ädu lÄmumu pieÅemÅ”ana starp dalÄ«bniekiem, kuri neuzticas viens otram, pats par sevi nav viegls uzdevums, un mÄs pie tÄ atgriezÄ«simies nÄkamajos rakstos, Å”ajÄ rakstÄ pieÅemsim, ka Å”Äds konsensa algoritms mums ir pieejams.
KurÄm no iepriekÅ” aprakstÄ«tajÄm Ä«paŔībÄm piemÄ«t RANDAO? Tas ir neparedzams, tam ir tÄds pats vitalitÄte kÄ pamatÄ esoÅ”ajam konsensa protokolam, taÄu tas ir neobjektÄ«vs. KonkrÄti, uzbrucÄjs var novÄrot tÄ«klu, un pÄc tam, kad citi dalÄ«bnieki atklÄj savus numurus, viÅÅ” var aprÄÄ·inÄt savu XOR un izlemt, vai atklÄt savu numuru, lai ietekmÄtu rezultÄtu. Lai gan tas neļauj uzbrucÄjam vienam paÅ”am noteikt nejauÅ”o skaitļu Ä£eneratora izvadi, tas viÅam joprojÄm dod 1 bitu ietekmes. Un, ja uzbrucÄji kontrolÄ vairÄkus dalÄ«bniekus, tad viÅu kontrolÄto bitu skaits bÅ«s vienÄds ar viÅu kontrolÄ esoÅ”o dalÄ«bnieku skaitu.
UzbrucÄju ietekmi var ievÄrojami samazinÄt, pieprasot dalÄ«bniekiem atklÄt skaitļus secÄ«bÄ. Tad uzbrucÄjs varÄs ietekmÄt iznÄkumu tikai tad, ja tas tiks atvÄrts pÄdÄjais. Lai gan ietekme ir ievÄrojami mazÄka, algoritms joprojÄm ir neobjektÄ«vs.
RANDAO+VDF
Viens no veidiem, kÄ padarÄ«t RANDAO objektÄ«vu, ir Å”Äds: pÄc tam, kad visi skaitļi ir atklÄti un XOR ir aprÄÄ·inÄts, tÄ rezultÄts tiek ievadÄ«ts funkcijas ievadÄ, kas aizÅem ļoti ilgu laiku, lai aprÄÄ·inÄtu, bet ļauj pÄrbaudÄ«t skaitļu pareizÄ«bu. aprÄÄ·ins ļoti Ätri.
(vdf_output, vdf_proof) = VDF_compute(input) // ŃŃŠ¾ Š¾ŃŠµŠ½Ń Š¼ŠµŠ“Š»ŠµŠ½Š½Š¾
correct = VDF_verify(input, vdf_output, vdf_proof) // ŃŃŠ¾ Š¾ŃŠµŠ½Ń Š±ŃŃŃŃŠ¾
Å o funkciju sauc par verificÄjamo aizkaves funkciju jeb VDF. Ja gala rezultÄta aprÄÄ·inÄÅ”ana aizÅem ilgÄku laiku nekÄ numura izpauÅ”anas stadija, tad uzbrucÄjs nevarÄs paredzÄt sava numura parÄdÄ«Å”anas vai slÄpÅ”anas efektu un lÄ«dz ar to viÅÅ” zaudÄs iespÄju ietekmÄt rezultÄtu.
Labu VDF izstrÄde ir ÄrkÄrtÄ«gi sarežģīta. PÄdÄjÄ laikÄ ir bijuÅ”i vairÄki izrÄvieni, piem.
Å Ä«s pieejas lielÄkais izaicinÄjums ir VDF iestatÄ«Å”ana tÄ, ka pat dalÄ«bnieks ar ļoti dÄrgu specializÄtu aparatÅ«ru nespÄs aprÄÄ·inÄt VDF pirms atklÄÅ”anas fÄzes beigÄm. IdeÄlÄ gadÄ«jumÄ algoritmam vajadzÄtu bÅ«t pat ievÄrojamai droŔības rezervei, piemÄram, 10x. ZemÄk esoÅ”ajÄ attÄlÄ ir parÄdÄ«ts aktiera uzbrukums, kuram ir specializÄts ASIC, kas ļauj viÅam palaist VDF ÄtrÄk nekÄ laiks, kas atvÄlÄts RANDAO apstiprinÄjuma atklÄÅ”anai. Å Äds dalÄ«bnieks joprojÄm var aprÄÄ·inÄt gala rezultÄtu, izmantojot vai neizmantojot savu numuru, un pÄc tam, pamatojoties uz aprÄÄ·inu, izvÄlÄties, vai to rÄdÄ«t vai nÄ.
IepriekÅ” minÄtajai VDF saimei speciÄlÄ ASIC veiktspÄja var bÅ«t 100+ reižu augstÄka nekÄ parastajai aparatÅ«rai. TÄtad, ja izvietoÅ”anas fÄze ilgst 10 sekundes, tad VDF, kas aprÄÄ·inÄts, izmantojot Å”Ädu ASIC, ir nepiecieÅ”ams vairÄk nekÄ 100 sekundes, lai iegÅ«tu 10 reizes lielÄku droŔības rezervi, un tÄdÄjÄdi tam paÅ”am VDF, kas aprÄÄ·inÄts, izmantojot preÄu aparatÅ«ru, ir nepiecieÅ”ams 100 x 100 sekundes = ~3 stundas.
Ethereum fonds plÄno atrisinÄt Å”o problÄmu, izveidojot savus publiski pieejamos bezmaksas ASIC. Kad tas notiks, arÄ« visi citi protokoli var izmantot Ŕīs tehnoloÄ£ijas priekÅ”rocÄ«bas, taÄu lÄ«dz tam RANDAO+VDF pieeja nebÅ«s tik dzÄ«votspÄjÄ«ga protokoliem, kuri nevar ieguldÄ«t savu ASIC izstrÄdÄ.
Ir apkopoti daudzi raksti, video un cita informÄcija par VDF
MÄs izmantojam dzÄÅ”anas kodus
Å ajÄ sadaÄ¼Ä mÄs apskatÄ«sim nejauÅ”o skaitļu Ä£enerÄÅ”anas protokolu, kas tiek izmantots
Protokola galvenÄ ideja ir Å”Äda. VienkÄrŔības labad pieÅemsim, ka ir tieÅ”i 100 dalÄ«bnieki. PieÅemsim arÄ«, ka visiem dalÄ«bniekiem lokÄli ir kÄda privÄtÄ atslÄga un visu dalÄ«bnieku publiskÄs atslÄgas ir zinÄmas visiem dalÄ«bniekiem:
-
Katrs dalÄ«bnieks lokÄli izdomÄ garu virkni, sadala to 67 daļÄs, izveido dzÄÅ”anas kodus, lai iegÅ«tu 100 koplietojumu, lai ar 67 pietiktu virknes atkopÅ”anai, pieŔķir katru no 100 koplietojumiem vienam no dalÄ«bniekiem un Å”ifrÄ tos ar tÄ paÅ”a dalÄ«bnieka publiskÄ atslÄga. PÄc tam tiek publicÄtas visas kodÄtÄs daļas.
-
DalÄ«bnieki izmanto zinÄmu vienprÄtÄ«bu, lai panÄktu vienoÅ”anos par kodÄtiem komplektiem no konkrÄtiem 67 dalÄ«bniekiem.
-
Kad tiek panÄkta vienprÄtÄ«ba, katrs dalÄ«bnieks Åem kodÄtÄs daļas katrÄ no 67 kopÄm, kas Å”ifrÄtas ar savu publisko atslÄgu, atÅ”ifrÄ visas Å”Ädas koplietoÅ”anas un publicÄ visas Å”Ädas atÅ”ifrÄtÄs daļas.
-
Kad 67 dalÄ«bnieki ir pabeiguÅ”i 3. darbÄ«bu, visas saskaÅotÄs kopas var pilnÄ«bÄ atÅ”ifrÄt un rekonstruÄt dzÄÅ”anas kodu Ä«paŔību dÄļ, un galÄ«go skaitli var iegÅ«t kÄ sÄkotnÄjo rindu XOR, ar kurÄm dalÄ«bnieki sÄka darbÄ«bu (1). .
Var pierÄdÄ«t, ka Å”is protokols ir objektÄ«vs un neparedzams. RezultÄtÄ iegÅ«tais nejauÅ”ais skaitlis tiek noteikts pÄc vienprÄtÄ«bas sasniegÅ”anas, taÄu tas nevienam nav zinÄms, lÄ«dz ā dalÄ«bnieku atÅ”ifrÄ daļas, kas Å”ifrÄtas ar viÅu publisko atslÄgu. TÄdÄjÄdi nejauÅ”ais skaitlis tiek noteikts, pirms tiek publicÄta informÄcija, kas ir pietiekama tÄ rekonstrukcijai.
Kas notiek, ja 1. darbÄ«bÄ viens no dalÄ«bniekiem nosÅ«tÄ«s citiem dalÄ«bniekiem kodÄtus koplietojumus, kas nav pareizais dzÄÅ”anas kods kÄdai virknei? Bez papildu izmaiÅÄm dažÄdi dalÄ«bnieki vai nu vispÄr nevarÄs atgÅ«t virkni, vai arÄ« atgÅ«s dažÄdas virknes, kÄ rezultÄtÄ dažÄdi dalÄ«bnieki saÅems atŔķirÄ«gu nejauŔības skaitli. Lai to novÄrstu, varat rÄ«koties Å”Ädi: katrs dalÄ«bnieks papildus kodÄtajÄm daļÄm arÄ« aprÄÄ·ina
Kad (4) darbÄ«bÄ dalÄ«bnieks noteiktai virknei atÅ”ifrÄ 67 sitienus un mÄÄ£ina no tiem rekonstruÄt sÄkotnÄjo virkni, ir iespÄjama viena no iespÄjÄm:
-
Virkne tiek atjaunota, un, ja tÄ pÄc tam tiek vÄlreiz kodÄta ar dzÄÅ”anas kodu un tiek aprÄÄ·inÄts Merkles koks lokÄli aprÄÄ·inÄtajÄm daļÄm, sakne sakrÄ«t ar to, par kuru tika panÄkta vienprÄtÄ«ba.
-
Rinda tiek atjaunota, bet lokÄli aprÄÄ·inÄtÄ sakne neatbilst tai, kurÄ tika panÄkta vienprÄtÄ«ba.
-
Rinda netiek atjaunota.
Ir viegli parÄdÄ«t, ka, ja (1) variants noticis vismaz vienam dalÄ«bniekam, tad (1) variants noticis visiem dalÄ«bniekiem un otrÄdi, ja (2) vai (3) variants noticis vismaz vienam dalÄ«bniekam, tad visiem dalÄ«bniekiem bÅ«s iespÄja (2) vai (3). TÄdÄjÄdi katrai komplekta rindai vai nu visi dalÄ«bnieki to veiksmÄ«gi atgÅ«s, vai arÄ« neizdosies to atgÅ«t visiem dalÄ«bniekiem. RezultÄtÄ iegÅ«tais nejauÅ”ais skaitlis ir XOR tikai tÄm rindÄm, kuras dalÄ«bnieki varÄja atgÅ«t.
Parakstu slieksnis
VÄl viena pieeja nejauŔībai ir izmantot tÄ sauktos BLS sliekÅ”Åa parakstus. NejauÅ”o skaitļu Ä£eneratoram, kura pamatÄ ir sliekÅ”Åa paraksti, ir tieÅ”i tÄdas paÅ”as garantijas kÄ iepriekÅ” aprakstÄ«tajam uz dzÄÅ”anas kodu balstÄ«tam algoritmam, taÄu tam ir ievÄrojami mazÄks tÄ«klÄ nosÅ«tÄ«to ziÅojumu asimptotiskais skaits katram Ä£enerÄtajam numuram.
BLS paraksti ir dizains, kas ļauj vairÄkiem dalÄ«bniekiem izveidot vienu kopÄ«gu parakstu ziÅojumam. Å os parakstus bieži izmanto, lai ietaupÄ«tu vietu un joslas platumu, neprasot nosÅ«tÄ«t vairÄkus parakstus.
IzplatÄ«ta BLS parakstu lietojumprogramma blokÄ·Ädes protokolos, papildus nejauÅ”u skaitļu Ä£enerÄÅ”anai, ir bloku parakstÄ«Å”ana BFT protokolos. PieÅemsim, ka 100 dalÄ«bnieki izveido blokus, un bloks tiek uzskatÄ«ts par galÄ«gu, ja 67 no viÅiem to paraksta. ViÅi visi var iesniegt savas BLS paraksta daļas un izmantot kÄdu konsensa algoritmu, lai vienotos par 67 no tiem un pÄc tam apvienotu tos vienÄ BLS parakstÄ. Lai izveidotu galÄ«go parakstu, var izmantot jebkuras 67 (vai vairÄk) daļas, kas bÅ«s atkarÄ«gas no tÄ, kuri 67 paraksti tika apvienoti, un tÄpÄc var atŔķirties, lai gan dažÄdas 67 dalÄ«bnieku izvÄles radÄ«s atŔķirÄ«gu parakstu , jebkurÅ” Å”Äds paraksts bÅ«s derÄ«gs. paraksts blokam. PÄc tam atlikuÅ”ajiem dalÄ«bniekiem tÄ«klÄ ir jÄsaÅem un jÄpÄrbauda tikai viens paraksts, nevis 67, kas ievÄrojami samazina tÄ«kla slodzi.
IzrÄdÄs, ja privÄtÄs atslÄgas, kuras dalÄ«bnieki izmanto, tiek Ä£enerÄtas noteiktÄ veidÄ, tad neatkarÄ«gi no tÄ, kuri 67 paraksti (vai vairÄk, bet ne mazÄk) tiek apkopoti, iegÅ«tais paraksts bÅ«s vienÄds. To var izmantot kÄ nejauŔības avotu: dalÄ«bnieki vispirms vienojas par kÄdu ziÅojumu, ko viÅi parakstÄ«s (tas varÄtu bÅ«t RANDAO izvade vai tikai pÄdÄjÄ bloka jaucÄjvÄrds, tam nav Ä«sti nozÄ«mes, ja tas mainÄs katru reizi un ir konsekventa) un izveidojiet tam BLS parakstu. Paaudzes rezultÄts bÅ«s neprognozÄjams, lÄ«dz savas daļas nodroÅ”inÄs 67 dalÄ«bnieki, un pÄc tam iznÄkums jau ir iepriekÅ” noteikts un nevar bÅ«t atkarÄ«gs no neviena dalÄ«bnieka darbÄ«bÄm.
Å Ä« pieeja nejauŔībai ir dzÄ«votspÄjÄ«ga, kamÄr vismaz ā tieÅ”saistes dalÄ«bnieku ievÄro protokolu, un tÄ ir objektÄ«va un neparedzama, kamÄr vismaz ā dalÄ«bnieku ievÄro protokolu. Ir svarÄ«gi atzÄ«mÄt, ka uzbrucÄjs, kurÅ” kontrolÄ vairÄk nekÄ ā , bet mazÄk nekÄ ā dalÄ«bnieku, var apturÄt protokolu, bet nevar paredzÄt vai ietekmÄt tÄ izvadi.
PaÅ”i sliekÅ”Åa paraksti ir ļoti interesanta tÄma. Raksta otrajÄ daÄ¼Ä mÄs detalizÄti analizÄsim, kÄ tie darbojas un kÄ tieÅ”i nepiecieÅ”ams Ä£enerÄt dalÄ«bnieku atslÄgas, lai sliekÅ”Åa parakstus varÄtu izmantot kÄ nejauÅ”o skaitļu Ä£eneratoru.
NoslÄgumÄ
Å is raksts ir pirmais emuÄra tehnisko rakstu sÄrijÄ
Protokola kods ir atvÄrts, mÅ«su realizÄcija ir rakstÄ«ta RustÄ, to var atrast
JÅ«s varat redzÄt, kÄ izskatÄs NEAR izstrÄde, un eksperimentÄt tieÅ”saistes IDE
Visiem jaunumiem krievu valodÄ var sekot lÄ«dzi plkst
Uz drÄ«zu redzÄÅ”anos!
Avots: www.habr.com