Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 1

Hoi Habr!

Yn dit artikel sil ik prate oer it generearjen fan pseudo-willekeurige nûmers troch dielnimmers dy't elkoar net fertrouwe. Lykas wy hjirûnder sille sjen, is it útfieren fan in "hast" goede generator frij ienfâldich, mar in heul goede is lestich.

Wêrom soe it nedich wêze om willekeurige nûmers te generearjen ûnder dielnimmers dy't elkoar net fertrouwe? Ien tapassingsgebiet is desintralisearre applikaasjes. Bygelyks, in applikaasje dy't akseptearret in weddenskip fan in dielnimmer en of ferdûbelet it bedrach mei in 49% kâns of nimt fuort mei in kâns fan 51% sil allinnich wurkje as it kin unbiased ûntfange in willekeurich getal. As in oanfaller kin beynfloedzje de útkomst fan de willekeurige getallengenerator, en sels in bytsje fergrutsje syn kâns op in ûntfange in útkearing yn de applikaasje, hy sil maklik ferneatigje it.

As wy in ferspraat protokol foar generaasje fan willekeurige nûmers ûntwerpe, wolle wy dat it trije eigenskippen hat:

  1. Hy moat unbiased wêze. Mei oare wurden, gjin dielnimmer moat op ien of oare manier ynfloed hawwe op it resultaat fan 'e willekeurige getallengenerator.

  2. Hy moat ûnfoarspelber wêze. Mei oare wurden, gjin dielnimmer moat by steat wêze om te foarsizze hokker getal wurdt oanmakke (of ôfliede ien fan syn eigenskippen) foardat it wurdt generearre.

  3. It protokol moat libbensfetber wêze, dat is resistint foar it feit dat in bepaald persintaazje dielnimmers loskeppele fan it netwurk of bewust besykje it protokol te stopjen.

Yn dit artikel sille wy nei twa oanpak sjen: RANDAO + VDF en de oanpak fan wissingen. Yn it folgjende diel sille wy de oanpak yn detail ûndersykje basearre op drompelhantekeningen.

Mar earst litte wy sjen nei in ienfâldich en gewoan brûkt algoritme dat libbensfetber, ûnfoarspelber, mar bias is.

RANDAO

RANDAO is in heul ienfâldige en dêrom frij algemien brûkte oanpak foar it generearjen fan willekeur. Alle dielnimmers fan it netwurk selektearje earst lokaal in pseudorandom nûmer, dan stjoert elke dielnimmer in hash fan it selektearre nûmer. Dêrnei nimme de dielnimmers om beurten har keazen nûmers te iepenjen en in XOR-operaasje op 'e iepenbiere nûmers út te fieren, en it resultaat fan dizze operaasje wurdt it resultaat fan it protokol.

De stap fan it publisearjen fan de hashes foar it iepenbierjen fan de nûmers is nedich, sadat de oanfaller syn nûmer net kieze kin nei't hy de nûmers fan 'e oare dielnimmers sjoen hat. Dit soe tastean him in frijwol ien-handedly bepale de útfier fan de willekeurige getallengenerator.

Yn 'e rin fan it protokol moatte dielnimmers twa kear ta in mienskiplik beslút komme (saneamde konsensus): wannear't de selekteare sifers begjinne te iepenbierjen, en dus stopje mei it akseptearjen fan hashes, en wannear't se stopje mei it akseptearjen fan de selektearre nûmers en it berekkenjen fan it resultaat willekeurich nûmer. Sokke besluten meitsje tusken dielnimmers dy't inoar net fertrouwe, is op himsels gjin maklike taak, en wy sille der yn takomstige artikels op weromkomme; yn dit artikel sille wy oannimme dat sa'n konsensusalgoritme foar ús beskikber is.

Hokker fan 'e eigenskippen dy't wy hjirboppe beskreaun hawwe, hat RANDAO? It is ûnfoarspelber, hat deselde fitaliteit as it ûnderlizzende konsensusprotokol, mar it is biased. Spesifyk kin in oanfaller it netwurk observearje, en nei't oare dielnimmers har nûmers iepenbierje, kin hy har XOR berekkenje, en beslute om syn nûmer al of net te iepenbierjen om de útkomst te beynfloedzjen. Hoewol't dit foarkomt dat de oanfaller sels de útfier fan 'e willekeurige getalgenerator bepaalt, jout it him noch 1 bytsje ynfloed. En as oanfallers ferskate dielnimmers kontrolearje, dan sil it oantal bits dat se kontrolearje lyk wêze oan it oantal dielnimmers ûnder har kontrôle.

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 1

De ynfloed fan oanfallers kin gâns fermindere wurde troch te fereaskje dat dielnimmers de nûmers yn oarder litte. Dan kin de oanfaller de útkomst allinich beynfloedzje as it as lêste iepene wurdt. Wylst de ynfloed signifikant minder is, is it algoritme noch altyd bias.

RANDAO+VDF

Ien manier om RANDAO unbiased te meitsjen is dit: nei't alle sifers iepenbiere binne en de XOR is berekkene, wurdt it resultaat yn 'e ynfier fan in funksje ynfierd, dy't in protte tiid duorret om te berekkenjen, mar jo kinne de krektens fan' e funksje kontrolearje. berekkening hiel fluch.

(vdf_output, vdf_proof) = VDF_compute(input) // это очень медленно
correct = VDF_verify(input, vdf_output, vdf_proof) // это очень быстро

Dizze funksje hjit Verifiable Delay Function, of VDF. As it berekkenjen fan it einresultaat langer duorret dan it poadium foar iepenbiering fan nûmers, dan sil de oanfaller it effekt fan it sjen of ferbergjen fan syn nûmer net kinne foarsizze, en dêrom sil hy de kâns ferlieze om it resultaat te beynfloedzjen.

It ûntwikkeljen fan goede VDF's is ekstreem lestich. Der binne de lêste tiid ferskate trochbraken west, û.o. dit и dit, dy't VDF praktysk makke yn 'e praktyk, en Ethereum 2.0 plannen om RANDAO te brûken mei VDF as in willekeurige nûmer boarne op' e lange termyn. Utsein it feit dat dizze oanpak ûnfoarspelber en unbiased is, hat it it ekstra foardiel fan libbensfetber te wêzen as op syn minst twa dielnimmers beskikber binne op it netwurk (oannommen dat it brûkte konsensusprotokol leefber is by it omgean mei sa'n lyts oantal dielnimmers).

De grutste útdaging fan dizze oanpak is it opsetten fan de VDF sa dat sels in dielnimmer mei heul djoere spesjalisearre hardware de VDF net foar it ein fan 'e ûntdekkingsfaze kin berekkenje. Idealiter soe it algoritme sels in signifikante feiligensmarzje moatte hawwe, sis 10x. De figuer hjirûnder lit in oanfal sjen troch in akteur dy't in spesjalisearre ASIC hat dy't him in VDF flugger kin útfiere as de tiid dy't tawiisd is om de RANDAO-befêstiging te iepenbierjen. Sa'n dielnimmer kin it einresultaat noch al of net mei syn nûmer berekkenje, en dan, op basis fan de berekkening, kieze oft se it sjen litte wol of net.

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 1

Foar de hjirboppe neamde VDF-famylje kin de prestaasjes fan in tawijd ASIC 100+ kear heger wêze as konvinsjonele hardware. Dus as de ynsetfaze 10 sekonden duorret, dan moat de VDF berekkene op sa'n ASIC mear dan 100 sekonden nimme om in 10x feiligensmarzje te hawwen, en dus moat deselde VDF berekkene op commodity hardware 100x 100 sekonden duorje = ~3 oeren.

De Ethereum Foundation is fan plan om dit probleem op te lossen troch har eigen iepenbier beskikbere, fergese ASIC's te meitsjen. Ienris dit bart, kinne alle oare protokollen ek profitearje fan dizze technology, mar oant dan sil de RANDAO + VDF-oanpak net sa leefber wêze foar protokollen dy't net kinne ynvestearje yn it ûntwikkeljen fan har eigen ASIC's.

In protte artikels, fideo's en oare ynformaasje oer VDF binne sammele op dizze side.

Wy brûke wiskje koades

Yn dizze seksje sille wy sjen nei in protokol foar generaasje fan willekeurige nûmers dy't brûkt erasing koades. It kin oant ⅓ oanfallers tolerearje, wylst se libbensfetber bliuwe, en lit oant ⅔ oanfallers bestean foardat se de útkomst kinne foarsizze of beynfloedzje.

It haadidee fan it protokol is as folget. Lit ús foar de ienfâld oannimme dat der krekt 100 dielnimmers binne. Lit ús ek oannimme dat alle dielnimmers lokaal wat privee kaai hawwe, en de iepenbiere kaaien fan alle dielnimmers binne bekend by alle dielnimmers:

  1. Elke dielnimmer komt lokaal mei in lange tekenrige, brekt it yn 67 dielen, makket wiskjeskoades om 100 oandielen te krijen sadat elke 67 genôch binne om de tekenrige te herstellen, jout elk fan 'e 100 oandielen oan ien fan 'e dielnimmers, en fersiferet se mei deselde dielnimmer syn iepenbiere kaai. Alle kodearre oandielen wurde dan publisearre.

  2. Dielnimmers brûke in soarte fan konsensus om oerienkomst te berikken oer kodearre sets fan spesifike 67 dielnimmers.

  3. Sadree't konsensus is berikt, nimt elke dielnimmer de kodearre oandielen yn elk fan 'e 67 sets fersifere mei har iepenbiere kaai, ûntsiferet al sokke oandielen, en publisearret al sokke ûntsifere oandielen.

  4. Sadree't 67 dielnimmers stap (3) hawwe foltôge, kinne alle ôfpraat sets folslein dekodearre en rekonstruearre wurde fanwegen de eigenskippen fan wiskjeskoades, en it definitive nûmer kin wurde krigen as in XOR fan 'e earste rigen wêrmei't de dielnimmers begûnen yn (1) .

Is it mooglik om willekeurige getallen te generearjen as wy inoar net fertrouwe? Diel 1

Dit protokol kin oantoand wurde dat it unbiased en ûnfoarspelber is. It resultearjende willekeurige getal wurdt bepaald neidat konsensus is berikt, mar is net bekend foar elkenien oant ⅔ fan 'e dielnimmers de dielen fersifere mei har iepenbiere kaai ûntsiferje. Sa wurdt it willekeurige getal bepaald foardat ynformaasje genôch is om it te rekonstruearjen wurdt publisearre.

Wat bart der as yn stap (1) ien fan 'e dielnimmers kodearre oandielen stjoerde nei de oare dielnimmers dy't net de juste wissingskoade binne foar guon tekenrige? Sûnder ekstra wizigingen kinne ferskate dielnimmers de snaar hielendal net weromhelje, of se sille ferskate snaren weromhelje, wat resultearret yn ferskate dielnimmers in oar willekeurich nûmer. Om dit foar te kommen, kinne jo it folgjende dwaan: elke dielnimmer berekkenet, neist de kodearre oandielen, ek Merkla tree al sokke oandielen, en stjoert elke dielnimmer sawol de kodearre oandiel sels en de woartel fan 'e merkle beam, en bewiis fan it opnimmen fan it oandiel yn' e merkle beam. Yn de konsensus yn stap (2), de dielnimmers dan net allinnich iens oer in set fan sets, mar oer in set fan spesifike woartels fan sokke beammen (as guon dielnimmers ôfwike fan it protokol, en stjoerde ferskillende merkle beam woartels oan ferskillende dielnimmers, en twa sokke woartels wurde toand tidens konsensus, syn de rige is net opnommen yn 'e resultaat set). As gefolch fan 'e konsensus sille wy 67 kodearre rigels hawwe en de oerienkommende woartels fan' e merklebeam, sadat d'r op syn minst 67 dielnimmers binne (net needsaaklik deselde dy't de oerienkommende rigels foarstelden), dy't foar elk fan 'e 67 rigels hawwe in berjocht mei in oandiel fan it wiskjen koade, en in bewiis fan it foarkommen fan harren oandiel yn de byhearrende beam faded.

Wannear't yn stap (4) de dielnimmer 67 beats ûntsiferet foar in bepaalde snaar en besiket de oarspronklike snaar fan har te rekonstruearjen, is ien fan 'e opsjes mooglik:

  1. De snaar wurdt restaurearre, en as it dan wer wiske-kodearre wurdt, en de Merkle-beam wurdt berekkene foar de lokaal berekkene oandielen, komt de woartel oerien mei dejinge dêr't konsensus oer berikt is.

  2. De rige wurdt restaurearre, mar de lokaal berekkene woartel komt net oerien mei de ien wêrby't konsensus waard berikt.

  3. De rige is net restaurearre.

It is maklik om te sjen dat as opsje (1) barde foar op syn minst ien dielnimmer hjirboppe, dan opsje (1) barde foar alle dielnimmers, en oarsom, as opsje (2) of (3) barde foar op syn minst ien dielnimmer, dan foar alle dielnimmers opsje (2) of (3) sil barre. Sa sille foar elke rige yn 'e set of alle dielnimmers it mei súkses weromhelje, of alle dielnimmers sille it net weromhelje. It resultearjende willekeurige nûmer is dan in XOR fan allinich de rigen dy't dielnimmers koenen weromhelje.

Drompel hântekeningen

In oare oanpak foar willekeur is it brûken fan wat wurde neamd BLS-drompelhântekeningen. In willekeurich getal generator basearre op drompel hântekeningen hat krekt deselde garânsjes as de wiskjen koade-basearre algoritme beskreaun hjirboppe, mar hat in gâns legere asymptotic oantal berjochten ferstjoerd oer it netwurk foar eltse oanmakke getal.

BLS-hântekeningen binne in ûntwerp wêrmei meardere dielnimmers ien mienskiplike hantekening kinne meitsje foar in berjocht. Dizze hantekeningen wurde faak brûkt om romte en bânbreedte te besparjen troch net te fereaskje dat meardere hantekeningen útstjoerd wurde. 

In mienskiplike applikaasje foar BLS-hântekeningen yn blockchain-protokollen, neist it generearjen fan willekeurige sifers, is blokûndertekening yn BFT-protokollen. Litte wy sizze dat 100 dielnimmers blokken meitsje, en in blok wurdt beskôge as definityf as 67 fan harren it tekenje. Se kinne allegear har dielen fan 'e BLS-hântekening yntsjinje en wat konsensus-algoritme brûke om 67 fan har iens te meitsjen en se dan te fusearje yn ien BLS-hântekening. Eltse 67 (of mear) dielen kinne brûkt wurde om de definitive hantekening te meitsjen, wat sil ôfhingje fan hokker 67 hantekeningen binne kombinearre en kin dêrom ferskille, hoewol ferskate karren troch de 67 dielnimmers in oare hantekening sille meitsje, sil elke sa'n hantekening in jildich wêze hantekening foar it blok. De oerbleaune dielnimmers hoege dan mar ien hantekening per blok te ûntfangen en te ferifiearjen, ynstee fan 67, oer it netwurk, wat de lading op it netwurk signifikant ferminderet.

It docht bliken dat as de partikuliere kaaien dy't dielnimmers brûke op in beskate manier generearre wurde, dan is it nettsjinsteande hokker 67 hantekeningen (of mear, mar net minder) aggregearre wurde, de resultearjende hantekening sil itselde wêze. Dit kin brûkt wurde as in boarne fan willekeurigens: dielnimmers geane earst akkoard oer in berjocht dat se sille ûndertekenje (dit kin de útfier fan RANDAO wêze of gewoan de hash fan it lêste blok, it makket neat út, salang't it elke kear feroaret en is konsekwint) en meitsje der in BLS-hântekening foar. It resultaat fan 'e generaasje sil ûnfoarspelber wêze oant 67 dielnimmers har dielen leverje, en dêrnei is de útfier al foarbepaald en kin net ôfhinklik wêze fan' e aksjes fan elke dielnimmer.

Dizze oanpak fan willekeurigens is libbensfetber sa lang as op syn minst ⅔ fan 'e dielnimmers online beide it protokol folgje, en is unbiased en ûnfoarspelber salang't op syn minst ⅓ fan 'e dielnimmers it protokol folgje. It is wichtich om te notearjen dat in oanfaller dy't mear as ⅓ mar minder as ⅔ fan 'e dielnimmers kontrolearret, it protokol stopje kin, mar syn útfier net kin foarsizze of beynfloedzje.

Drompelhantekeningen sels binne in heul ynteressant ûnderwerp. Yn it twadde diel fan it artikel sille wy analysearje yn detail hoe't se wurkje, en hoe krekt is it nedich om te generearjen dielnimmer kaaien sadat drompel hântekeningen kinne brûkt wurde as in willekeurige getallengenerator.

Yn ôfsluting

Dit artikel is it earste yn in searje technyske blogartikels TICHTBY. NEAR is in blockchain-protokol en platfoarm foar it ûntwikkeljen fan desintralisearre applikaasjes mei in klam op it gemak fan ûntwikkeling en it gemak fan gebrûk foar ein brûkers.

De protokolkoade is iepen, ús ymplemintaasje is skreaun yn Rust, it kin fûn wurde hjir.

Jo kinne sjen hoe't ûntwikkeling foar NEAR derút sjocht en eksperimintearje yn 'e online IDE hjir.

Jo kinne folgje al it nijs yn it Russysk by telegram groep en yn groep op VKontakte, en yn it Ingelsk yn 'e offisjele twitterje.

Oant sjen!

Boarne: www.habr.com

Add a comment