Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 1

Ehi Habr!

In questu articulu, parraraghju di a generazione di numeri pseudo-aleatoriu da i participanti chì ùn anu micca fiducia in l'altri. Comu avemu vistu quì sottu, implementà un generatore "quasi" bonu hè abbastanza simplice, ma un assai bonu hè difficiule.

Perchè averebbe bisognu di generà numeri aleatorii trà i participanti chì ùn anu micca fiducia? Una zona di applicazione hè applicazioni decentralizate. Per esempiu, una applicazione chì accetta una scumessa da un participante è sia radduppia a quantità cù una probabilità di 49% o sguassate cù una probabilità di 51% funziona solu s'ellu pò riceve imparzialmente un numeru aleatoriu. Se un attaccu pò influenzà u risultatu di u generatore di numeri aleatorii, è ancu aumentà ligeramente a so chance di riceve un pagamentu in l'applicazione, facilmente a devastà.

Quandu cuncepemu un protokollu di generazione di numeri aleatorii distribuiti, vulemu chì hà trè proprietà:

  1. Deve esse imparziale. In altri palori, nisun participante ùn deve in alcun modu influenzà u risultatu di u generatore di numeri aleatorii.

  2. Deve esse imprevisible. In altri palori, nisun participante ùn deve esse capace di predichendu quale numeru serà generatu (o inferisce qualcunu di e so proprietà) prima di esse generatu.

  3. U protokollu deve esse viable, vale à dì, resistente à u fattu chì un certu percentinu di i participanti disconnect da a reta o pruvate deliberatamente di piantà u protocolu.

In questu articulu avemu da fighjà dui approcci: RANDAO + VDF è l'approcciu di i codici di cancellazione. In a prossima parte, esamineremu in detail l'approcciu basatu nantu à e signature di u sogliu.

Ma prima, fighjemu un algoritmu simplice è cumunimenti utilizatu chì hè viable, imprevisible, ma biased.

RANDAO

RANDAO hè un approcciu assai simplice è dunque abbastanza cumunimenti utilizatu per generà casualità. Tutti i participanti di a rete prima selezziunate un numeru pseudoaleatoriu, dopu ogni participante manda un hash di u numeru sceltu. In seguitu, i participanti piglianu turnu chì palesanu i so numeri scelti è eseguisce una operazione XOR nantu à i numeri revelati, è u risultatu di sta operazione diventa u risultatu di u protocolu.

U passu di pubblicà i hashes prima di revelà i numeri hè necessariu per chì l'attaccu ùn pò micca sceglie u so numeru dopu avè vistu i numeri di l'altri participanti. Questu li permetterà di determinà virtualmente da una sola manu l'output di u generatore di numeri aleatorii.

Duranti u corsu di u protokollu, i participanti anu da vene à una decisione cumuna (così-chiamatu cunsensu) duie volte: quandu si principia à revelà i numeri selezziunati, è dunque smetta di accettà i hashes, è quandu smette di accettà i numeri selezziunati è di calculà u risultatu aleatoriu. numeru. Piglià tali decisioni trà i participanti chì ùn anu micca fiducia in l'altri ùn hè micca un compitu faciule in sè stessu, è avemu da vultà à questu in articuli futuri; in questu articulu assumeremu chì un tale algoritmu di cunsensu hè dispunibule per noi.

Quale di e proprietà chì avemu descrittu sopra hà RANDAO? Hè imprevisible, hà a listessa vitalità cum'è u protocolu di cunsensu sottostante, ma hè biased. In particulare, un attaccu pò osservà a reta, è dopu chì l'altri participanti palesanu i so numeri, pò calculà u so XOR, è decide di revelà o micca u so numeru per influenzà u risultatu. Mentre chì questu impedisce à l'attaccante di determinà da sola l'output di u generatore di numeri aleatorii, li dà sempre 1 bit d'influenza. È se l'attaccanti cuntrollanu parechji participanti, u numaru di bits chì cuntrullanu serà uguali à u numeru di participanti sottu u so cuntrollu.

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 1

L'influenza di l'attaccanti pò esse ridutta assai esigendu chì i participanti palesanu i numeri in ordine. Allora l'attaccante puderà influenzà u risultatu solu s'ellu hè apertu l'ultimu. Mentre l'influenza hè significativamente menu, l'algoritmu hè sempre biased.

RANDAO+VDF

Una manera di fà RANDAO imparziali hè questu: dopu chì tutti i numeri sò revelati è u XOR hè calculatu, u so risultatu hè alimentatu in l'input di una funzione, chì piglia assai tempu per calculà, ma permette di verificà a correttezza di a funzione. calculu assai prestu.

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

Sta funzione hè chjamata Funzione di Ritardo Verificabile, o VDF. Se u calculu di u risultatu finali pigghia più di u stadiu di divulgazione di u numeru, allura l'attaccante ùn serà micca capaci di predichendu l'effettu di mostrà o ammuccià u so numeru, è per quessa perde l'uppurtunità di influenzà u risultatu.

Sviluppà boni VDF hè assai difficiule. Ci hè statu parechje scuperte recentemente, per esempiu. questu и questu, chì hà fattu VDF più praticu in a pratica, è Ethereum 2.0 pensa à aduprà RANDAO cù VDF cum'è una fonte di numeru aleatoriu à longu andà. In più di u fattu chì questu approcciu hè imprevisible è imparziale, hà u benefiziu aghjuntu di esse viable se almenu dui participanti sò dispunibuli nantu à a reta (assumendu chì u protokollu di cunsensu utilizatu hè viable quandu si tratta di un numeru cusì chjucu di participanti).

U più grande sfida di questu approcciu hè a creazione di u VDF in modu chì ancu un participante cù hardware specializatu assai caru ùn serà micca capaci di calculà u VDF prima di a fine di a fase di scuperta. Ideale, l'algoritmu duveria ancu avè un marghjenu di sicurità significativu, dì 10x. A figura sottu mostra un attaccu da un attore chì hà un ASIC specializatu chì li permette di eseguisce un VDF più veloce di u tempu attribuitu per revelà a cunferma RANDAO. Un tali participante pò ancu calculà u risultatu finali usendu o micca u so numeru, è dopu, basatu nantu à u calculu, sceglie s'ellu si mostra o micca.

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 1

Per a famiglia VDF citata sopra, u rendiment di un ASIC dedicatu pò esse 100+ volte più altu ch'è l'hardware convenzionale. Allora se a fase di divulgazione dura 10 seconde, allora u VDF calculatu nantu à un tali ASIC deve piglià più di 100 seconde per avè un marghjenu di sicurezza 10x, è cusì u stessu VDF calculatu nantu à u hardware commodity deve piglià 100x 100 seconde = ~ 3 ore.

A Fundazione Ethereum pensa à risolve stu prublema creendu u so propiu ASIC gratuitu dispunibule publicamente. Quandu succede questu, tutti l'altri protokolli ponu ancu prufittà di sta tecnulugia, ma finu à quì l'approcciu RANDAO + VDF ùn serà micca viable per i protokolli chì ùn ponu micca investisce in u sviluppu di i so propri ASIC.

Parechji articuli, video è altre informazioni nantu à VDF sò stati cullati stu situ.

Avemu aduprà codici di sguassà

In questa sezione, guardemu un protokollu di generazione di numeri aleatorii chì usa sguassà i codici. Puderà tollerà finu à ⅓ attaccanti mentre resta viable, è permette à ⅔ attaccanti di esiste prima di pudè predicherà o influenzà u risultatu.

L'idea principale di u protocolu hè a siguenti. Per simplicità, supponemu chì ci sò esattamente 100 participanti. Assumimu ancu chì tutti i participanti in u locu anu una chjave privata, è i chjavi publichi di tutti i participanti sò cunnisciuti da tutti i participanti:

  1. Ogni participante vene in u locu cun una longa stringa, a rompe in 67 parte, crea codici di cancellazione per ottene 100 azzioni in modu chì qualsiasi 67 sò abbastanza per ricuperà a stringa, assigna ognuna di e 100 parte à unu di i participanti, è li cripta cù a chjave publica di u stessu participante. Tutte e parte codificate sò dopu publicate.

  2. I participanti utilizanu qualchì tipu di cunsensu per ghjunghje à un accordu nantu à setti codificati da 67 participanti specifichi.

  3. Una volta chì u cunsensu hè ghjuntu, ogni participante piglia e parte codificate in ognuna di i 67 setti cifrati cù a so chjave publica, decripta tutte tali azzioni, è publica tutte e parte decriptate.

  4. Una volta chì i participanti 67 anu cumpletu u passu (3), tutti i setti accunsentiti ponu esse cumpletamente decodificati è ricustruiti per via di e proprietà di i codici di cancellazione, è u numeru finali pò esse ottenutu cum'è un XOR di e fila iniziali chì i participanti cuminciaru cù in (1). .

Hè pussibule di generà numeri aleatorii se ùn avemu micca fiducia? Parte 1

Stu protokollu pò esse dimustratu per esse imparziale è imprevisible. U numeru aleatoriu resultanti hè determinatu dopu à u cunsensu hè righjuntu, ma ùn hè micca cunnisciutu à nimu finu à chì ⅔ di i participanti decodificà e parti criptate cù a so chjave publica. Cusì, u numeru aleatoriu hè determinatu prima chì l'infurmazioni abbastanza per ricustruisce hè publicatu.

Chì succede si in u passu (1) unu di i participanti hà mandatu azzioni codificate à l'altri participanti chì ùn sò micca u codice di sguassà currettu per qualchì stringa? Senza cambiamenti supplementari, i diversi participanti ùn puderanu micca ricuperà a stringa in tuttu, o ricuperanu diverse stringhe, chì resultarà in diversi participanti chì riceveranu un numeru aleatoriu sfarente. Per impediscenu questu, pudete fà e seguenti: ogni participante, in più di l'azzioni codificate, calcula ancu Arburu di Merkla tutte tali azzioni, è manda à ogni participante sia a parte codificata stessu è a radica di l'arbulu merkle, è a prova di l'inclusione di a parte in l'arbulu merkle. In u cunsensu in u passu (2), i participanti tandu micca solu d'accordu nant'à un inseme di setti, ma nant'à un inseme di radichi specifichi di tali arburi (s'è qualchi participant deviatu da u protokollu, è mandò differente radiche merkle tree à diversi participanti, è dui tali radichi sò mostrati durante u cunsensu, a so fila ùn hè micca inclusa in u risultatu. In u risultatu di u cunsensu, averemu 67 linee codificate è e radiche currispundenti di l'arburu di merkle cusì chì ci sò almenu 67 participanti (micca necessariamente i stessi chì prupunenu i linii currispundenti), chì per ognuna di e 67 linii anu. un missaghju cù una parte di u codice di sguassà, è una prova chì l'occurrence di a so parte in l'arbulu currispundenti fade.

Quandu in u passu (4) u participante decifra 67 battiti per una certa stringa è prova di ricustruisce a stringa originale da elli, una di l'opzioni hè pussibule:

  1. A stringa hè restaurata, è s'ellu hè poi sguassatu-codificatu di novu, è l'arbulu Merkle hè calculatu per l'azzioni calculati in u locu, a radica coincide cù quella chì u cunsensu hè statu righjuntu.

  2. A fila hè restaurata, ma a radica calculata in u locu ùn currisponde micca à quellu à quale u cunsensu hè statu righjuntu.

  3. A fila ùn hè micca restaurata.

Hè faciule dimustrà chì se l'opzione (1) hè accaduta per almenu un participante sopra, allora l'opzione (1) hè accaduta per tutti i participanti, è vice versa, se l'opzione (2) o (3) hè accaduta per almenu un participante, allora per tutti i participanti l'opzione (2) o (3) accadrà. Cusì, per ogni fila in u settore, o tutti i participanti anu da ricuperà cù successu, o tutti i participanti ùn anu micca ricuperà. U numeru aleatoriu risultatu hè allora un XOR di solu e fila chì i participanti anu pussutu ricuperà.

Firme di soglia

Un altru approcciu à l'aleatoriu hè di utilizà ciò chì sò chjamati signatures di soglia BLS. Un generatore di numeri aleatoriu basatu nantu à a so firma hà esattamente e stesse garanzie cum'è l'algoritmu basatu in codice di cancellazione descrittu sopra, ma hà un numeru asintoticu significativamente più bassu di messagi mandati nantu à a reta per ogni numeru generatu.

E signature BLS sò un disignu chì permette à parechji participanti di creà una firma cumuna per un missaghju. Queste firme sò spessu usate per risparmià spaziu è larghezza di banda per ùn esse micca bisognu di più firme per esse mandate. 

Una applicazione cumuna per e signature BLS in protokolli blockchain, in più di generà numeri aleatorii, hè a firma di bloccu in protokolli BFT. Diciamu chì i participanti 100 creanu blocchi, è un bloccu hè cunsideratu finali se 67 d'elli firmanu. Puderanu tutti invià e so parti di a firma BLS è aduprà qualchì algoritmu di cunsensu per accunsentà nantu à 67 di elli è poi unisce in una firma BLS. Qualchese 67 (o più) parte pò esse aduprata per creà a firma finale, chì dipenderà da quali 67 firme sò stati cumminati è per quessa pò varià, ancu s'è e diverse scelte da i 67 participanti creanu una firma diversa, ogni firma serà valida. firma per u bloccu. I participanti restanti allora solu bisognu di riceve è verificà una sola firma per bloccu, invece di 67, nantu à a reta, chì riduce significativamente a carica in a reta.

Ci hè chì, se i chjavi privati ​​​​chì i participanti utilizanu sò generati in una certa manera, allora ùn importa ciò chì 67 signatures (o più, ma micca menu) sò aggregati, a firma resultanti serà a stessa. Questu pò esse usatu cum'è una fonte di casualità: i participanti accunsenu prima nantu à qualchì missaghju chì firmaranu (questu puderia esse l'output di RANDAO o solu l'hash di l'ultimu bloccu, ùn importa micca veramente sempre chì cambia ogni volta. è hè coherente) è creanu una firma BLS per questu. U risultatu di a generazione serà imprevisible finu à chì i participanti 67 furniscenu e so parti, è dopu chì l'output hè digià predeterminatu è ùn pò micca dipende di l'azzioni di ogni participante.

Stu approcciu à l'aleatoriu hè viable finu à chì almenu ⅔ di i participanti in linea seguitanu u protokollu, è hè imparziale è imprevisible sempre chì almenu ⅓ di i participanti seguitanu u protokollu. Hè impurtante à nutà chì un attaccu chì cuntrolla più di ⅓ ma menu di ⅔ di i participanti pò piantà u protokollu, ma ùn pò micca predichendu o influenzà a so pruduzzioni.

I so firmati sò un tema assai interessante. In a seconda parte di l'articulu, analizzeremu in dettagliu cumu si travaglianu, è cumu esattamente hè necessariu di generà e chjave di i participanti per chì e signature di u sogliu pò esse usate cum'è generatore di numeri aleatorii.

In cunclusioni

Questu articulu hè u primu in una seria di articuli di blog tecnichi PRIMERA. NEAR hè un protokollu blockchain è una piattaforma per u sviluppu di applicazioni decentralizate cù un enfasi in a facilità di sviluppu è a facilità d'utilizazione per l'utilizatori finali.

U codice di protokollu hè apertu, a nostra implementazione hè scritta in Rust, si pò truvà ccà.

Pudete vede ciò chì u sviluppu per NEAR s'assumiglia è sperimentà in l'IDE in linea ccà.

Pudete seguità tutte e nutizie in russo à gruppu telegram è in gruppu nantu à VKontakte, è in inglese in u ufficiale twitter.

À prestu!

Source: www.habr.com

Add a comment