Willekeurich orakel basearre op digitale hantekening yn blockchain

Fan idee oant ymplemintaasje: wy feroarje it besteande elliptyske kromme digitale hantekeningskema sadat it deterministysk is, en op basis dêrfan leverje wy funksjes foar it krijen fan pseudo-willekeurige nûmers ferifieare binnen de blockchain.

Willekeurich orakel basearre op digitale hantekening yn blockchain

Idea

Yn 'e hjerst fan 2018, de Waves blockchain opnommen earste smart kontrakten aktivearre, kaam de fraach fuort oer de mooglikheid om te krijen pseudorandom nûmersdat jo kinne fertrouwe.

Puzzling oer dizze fraach kaam ik úteinlik ta de konklúzje: elke blockchain is in sel; it is ûnmooglik om in fertroude boarne fan entropy te krijen yn in sletten systeem.

Mar ik mocht noch ien idee: as willekeurige orakel sil ûndertekenje brûkersgegevens mei in deterministysk algoritme, dan sil de brûker altyd by steat wêze om te ferifiearjen sa'n hantekening mei help fan de iepenbiere kaai, en sil der wis fan wêze dat de resultearjende wearde is unyk. It orakel, hoe hurd it ek wol, kin neat feroarje; it algoritme produseart in ûndûbelsinnich resultaat. Yn essinsje registrearret de brûker it resultaat, mar wit it net oant it orakel it publisearret. It docht bliken dat jo it orakel hielendal net kinne fertrouwe, mar kontrolearje it resultaat fan har wurk. Dan, yn gefal fan suksesfolle ferifikaasje, kin sa'n hantekening beskôge wurde as in boarne fan entropy foar in pseudorandom nûmer.

It Waves blockchain-platfoarm brûkt in hantekeningskema EdDSA opsje Ed25519. Yn dit skema bestiet de hantekening út de wearden R en S, wêrby't R hinget ôf fan in willekeurige wearde, en S wurdt berekkene op basis fan it berjocht dat wurdt tekene, de privee kaai en itselde willekeurige nûmer as R. It docht bliken dat der is gjin unike ôfhinklikens foar deselde Der binne in protte jildige hantekeningen foar in brûker berjocht.

Fansels kin sa'n hântekening yn syn suvere foarm net brûkt wurde as in boarne fan pseudo-willekeurige getallen, om't it net-deterministysk is en dêrom maklik troch it orakel manipulearre wurde kin.

Mar, sa die bliken, is it eins mooglik om it deterministysk te meitsjen.

Ik hie grutte hoop foar ferifieare willekeurige funksje (VRF), mar nei it studearjen fan de hardware, moast ik dizze opsje ferlitte. Hoewol VRF biedt in deterministyske ferzje fan 'e hantekening en har bewiis, is d'r in frjemd plak yn it algoritme dat in swart gat iepenet foar manipulaasje fan it orakel. Nammentlik, by it berekkenjen fan de wearde fan k (seksje 5.1) in privee kaai wurdt brûkt, dy't ûnbekend bliuwt foar de brûker, wat betsjut dat de brûker de krektens fan 'e berekkening fan k net ferifiearje kin, wat betsjut dat it orakel elke wearde fan k kin brûke dy't it nedich is en tagelyk in databank fan korrespondinsjes behâlde kin fan k en de ûndertekene gegevens om altyd it juste resultaat út it eachpunt fan VRF opnij te berekkenjen. As jo ​​​​in tekening sjen basearre op VRF sûnder de privee kaai te iepenbierjen, kinne jo tûk wêze: oanjaan de needsaak om de kaai te iepenbierjen, of út te sluten fan 'e berekkening fan k, dan sil de privee kaai himsels automatysk iepenbierje as de earste hantekening ferskynt . Yn it algemien, lykas al neamd, in nuvere skema foar in willekeurige orakel.

Nei in bytsje gedachte en it ynlûken fan de stipe fan pleatslike analisten, waard it VECRO-wurkskema berne.

VECRO is in ôfkoarting foar Verifiable Elliptic Curve Random Oracle, wat yn it Russysk ferifiearber willekeurich orakel betsjut op elliptyske bochten.

Alles blykte frij ienfâldich te wêzen; om determinisme te berikken, moatte jo de wearde fan R befestigje foardat it te tekenjen berjocht ferskynt. As R yngien is en diel útmakket fan it berjocht dat ûndertekene wurdt, wat fierder soarget dat R ynset wurdt yn it berjocht dat ûndertekene wurdt, wurdt de wearde fan S unyk bepaald troch it berjocht fan de brûker en kin dêrom brûkt wurde as boarne foar pseudorandom getallen.

Yn sa'n skema makket it net út hoe't R fêst is, dit bliuwt de ferantwurdlikens fan it orakel. It is wichtich dat S unyk wurdt bepaald troch de brûker, mar de wearde is ûnbekend oant it orakel it publisearret. Alles wat wy woenen!

It praten fan fêste R, note dat werbrûkt R by it ûndertekenjen fan ferskate berjochten, ûntbleatet it unyk de privee kaai yn it EdDSA-skema. It wurdt ekstreem wichtich foar de eigner fan it orakel om de mooglikheid te eliminearjen om R opnij te brûken om ferskate brûkersberjochten te ûndertekenjen. Dat is, mei elke manipulaasje of gearspanning sil it orakel altyd it risiko hawwe om syn privee kaai te ferliezen.

Yn totaal moat it orakel brûkers twa funksjes leverje: inisjalisaasje, dy't de wearde R befestiget, en hantekening, dy't de wearde S werombringt. Yn dit gefal is it pear R, S de gewoane ferifieare hantekening fan in brûkersberjocht mei in fêste wearde R en willekeurige brûkersgegevens.

It kin beweare wurde dat dit skema foar de blockchain neat mear is as gewoan commit-útwreidzje skema. Yn essinsje, ja, it is har. Mar d'r binne ferskate nuânses. As earste wurket it orakel altyd mei deselde kaai yn alle operaasjes, dit is bygelyks handich om te brûken yn kontrakten. Twadder is d'r in risiko dat it orakel de privee kaai ferliest as it ferkeard gedraacht, bygelyks it orakel lit jo samples meitsje fan it resultaat, dan is it genôch om mar twa tests te meitsjen om de privee kaai út te finen en folslein te krijen tagong ta de beurs. Tredde, in hantekening dy't natuerlik ferifieare is op 'e blockchain en in boarne fan willekeur is prachtich.

Foar seis moanne simmerde it idee fan ymplemintaasje yn myn holle, oant úteinlik motivaasje ferskynde yn 'e foarm subsydzje fan Waves Labs. Mei in grutte subsydzje komt grutte ferantwurdlikens, wat betsjut dat it projekt der sil wêze!

Ymplemintaasje

Dus, yn dit projekt VECRO waard útfierd op de Waves blockchain yn fersyk-antwurd modus mei help fan oerdracht transaksjes tusken de brûker en it orakel. Tagelyk wurdt in skript ynstalleare op it oracle-akkount dat it wurk strikt kontrolearret yn oerienstimming mei de hjirboppe beskreaune logika. Oracle-transaksjes wurde ferifiearre en de heule keten fan brûkersynteraksje wurdt hersteld. Alle fjouwer transaksjes binne belutsen by it ferifiearjen fan 'e definitive wearde; it tûke kontrakt bringt se tegearre mei in strikte ferifikaasjethread, kontrolearret alle wearden stap foar stap en lit gjin romte foar manipulaasje.

Nochris, om it oan 'e kant te setten en dúdliker te meitsjen. It orakel wurket net allinnich neffens it foarstelde skema. It wurk wurdt folslein kontrolearre op it blokje-nivo troch de fêststelde strak mei in tûk kontrakt. Stap nei lofts en de transaksje sil gewoan net trochgean. Dus, as in transaksje is opnommen yn 'e blockchain, hoecht de brûker net iens wat te kontrolearjen; hûnderten netwurkknooppunten hawwe al alles foar him kontrolearre.

Op it stuit rint d'r ien VECRO op it Waves mainnet (jo kinne jo eigen rinne, it is net dreech, gewoan sjoch ris nei it konfiguraasjefoarbyld). De hjoeddeistige koade rint yn PHP (on WavesKit, oer hokker Ik fertelde dy earder).

Om de orakeltsjinst te brûken moatte jo:

  • Fix R;
    • Stjoer op syn minst 0.005 Waves nei oracle alias init@vecr;
    • Untfang de R-koade yn it taheakselfjild yn 'e oerdracht fan 1 R-vecr token fan it orakel nei de brûker;
  • Krij in hantekening;
    • Stjoer op syn minst 0.005 Waves nei it orakel alias random@vecr, en MOET ek de earder ûntfongen R-koade en ekstra brûkersgegevens yn it taheakselfjild oanjaan;
    • Untfang de S-koade yn it taheakselfjild yn 'e oerdracht fan 1 S-vecr-token fan it orakel nei de brûker;
  • Brûk S-koade as boarne fan pseudo-willekeurich nûmer.

Nuânses fan de hjoeddeiske ymplemintaasje:

  • Wellen stjoerd nei it orakel wurde brûkt as kommisje foar it weromkommen transaksje oan de brûker, oant in maksimum fan 1 Waves;
  • R-koade is de gearhing fan in byte fan it 'R'-karakter en in 32-byte base58-kodearre R-wearde;
  • R-koade yn taheaksel moat earst wêze, brûkersgegevens komme nei R-koade;
  • S-koade is de gearhing fan in byte fan it karakter 'S' en in 32-byte base58-kodearre wearde fan S;
  • S is it resultaat fan modulo divyzje, dus do kinst net brûke S as in folslein 256-bit pseudorandom nûmer (dit nûmer kin beskôge wurde as in maksimum fan 252-bit pseudorandom number);
  • De ienfâldichste opsje is om de S-koade-hash te brûken as in pseudo-willekeurich nûmer.

Foarbyld fan ûntfangen fan S-koade:

Fan in technysk eachpunt is it orakel folslein klear foar wurk, jo kinne it feilich brûke. Ut it eachpunt fan gebrûk troch de gemiddelde brûker is d'r in gebrek oan in handige grafyske ynterface; dit sil wachtsje moatte.

Ik sil bliid wêze om fragen te beantwurdzjen en opmerkingen te akseptearjen, tank.

Boarne: www.habr.com

Add a comment