Hazarda orakolo bazita sur cifereca subskribo en blokĉeno

De ideo al efektivigo: ni modifas la ekzistantan elipsan kurbon ciferecan subskriban skemon por ke ĝi estu determinisma, kaj surbaze de ĝi ni provizas funkciojn por akiri pseŭdo-hazardajn nombrojn kontroleblajn ene de la blokĉeno.

Hazarda orakolo bazita sur cifereca subskribo en blokĉeno

Ideo

En la aŭtuno de 2018, la Waves-blokoĉeno inkludis unuaj inteligentaj kontraktoj aktivigitaj, tuj ekestis la demando pri la ebleco akiri pseŭdohazardaj nombrojke vi povas fidi.

Konfuzante ĉi tiun demandon, mi finfine alvenis al la konkludo: ajna blokĉeno estas ĉelo; estas neeble akiri fidindan fonton de entropio en fermita sistemo.

Sed mi ankoraŭ ŝatis unu ideon: se hazarda orakolo subskribos uzantajn datumojn per determinisma algoritmo, tiam la uzanto ĉiam povos kontroli tian subskribon per la publika ŝlosilo, kaj estos certa, ke la rezulta valoro estas unika. La orakolo, kiom ajn ĝi volas, estas nekapabla ŝanĝi ion ajn; la algoritmo produktas malambiguan rezulton. Esence, la uzanto registras la rezulton, sed ne scias ĝin ĝis la orakolo publikigas ĝin. Montriĝas, ke vi tute ne povas fidi la orakolon, sed kontroli la rezulton de ĝia laboro. Tiam, en kazo de sukcesa konfirmo, tia subskribo povas esti konsiderita fonto de entropio por pseŭdohazarda nombro.

La platformo de blokĉeno Waves uzas subskriban skemon EdDSA eblo Ed25519. En ĉi tiu skemo, la subskribo konsistas el la valoroj R kaj S, kie R dependas de hazarda valoro, kaj S estas kalkulita surbaze de la mesaĝo subskribita, la privata ŝlosilo kaj la sama hazarda nombro kiel R. Rezultas, ke ne ekzistas unika dependeco por la sama Estas multaj validaj subskriboj por uzantmesaĝo.

Evidente, en sia pura formo, tia subskribo ne povas esti uzata kiel fonto de pseŭdo-hazardaj nombroj, ĉar ĝi estas nedeterminisma kaj, tial, povas esti facile manipulita de la orakolo.

Sed, kiel evidentiĝis, efektive eblas fari ĝin determinisma.

Mi havis grandajn esperojn por kontrolebla hazarda funkcio (VRF), sed studinte la aparataron, mi devis forlasi ĉi tiun opcion. Kvankam VRF ofertas determinisman version de la subskribo kaj ĝia pruvo, ekzistas stranga loko en la algoritmo, kiu malfermas nigran truon por manipulado de la orakolo. Nome, kiam oni kalkulas la valoron de k (sekcio 5.1) privata ŝlosilo estas uzata, kiu restas nekonata al la uzanto, kio signifas, ke la uzanto ne povas kontroli la ĝustecon de la kalkulo de k, kio signifas, ke la orakolo povas uzi ajnan valoron de k kiun ĝi bezonas kaj samtempe konservi datumbazon de korespondadoj. de k kaj subskribitaj datumoj por ĉiam povi rekalkuli la rezulton ĝustan el la vidpunkto de VRF . Se vi vidas desegnaĵon bazitan sur VRF sen malkaŝi la privatan ŝlosilon, vi povas esti lerta: indiku la bezonon aŭ malkaŝi la ŝlosilon, aŭ ekskludi ĝin de la kalkulo de k, tiam la privata ŝlosilo aŭtomate malkaŝiĝos kiam la unua subskribo aperos. . Ĝenerale, kiel jam menciite, stranga skemo por hazarda orakolo.

Post iom da pripensado kaj ricevi la subtenon de lokaj analizistoj, naskiĝis la laborskemo de VECRO.

VECRO estas mallongigo de Verifiable Elliptic Curve Random Oracle, kiu en la rusa signifas kontrolebla hazarda orakolo sur elipsaj kurboj.

Ĉio montriĝis sufiĉe simpla; por atingi determinismon, vi devas fiksi la valoron de R antaŭ ol aperos la subskribota mesaĝo. Se R estas farita kaj estas parto de la mesaĝo estanta subskribita, kiu plue certigas ke R estas transigita en la mesaĝo estanta subskribita, la valoro de S estas unike determinita per la mesaĝo de la uzanto kaj povas tial esti utiligita kiel fonto por pseŭdohazardaj nombroj.

En tia skemo, ne gravas kiel R estas fiksita; tio restas la respondeco de la orakolo. Gravas, ke S estas unike determinita de la uzanto, sed ĝia valoro estas nekonata ĝis la orakolo publikigas ĝin. Ĉion, kion ni volis!

Parolante pri fiksita R, notu tion reuzita R subskribante diversajn mesaĝojn, ĝi unike malkaŝas la privatan ŝlosilon en la EdDSA-skemo. Fariĝas ege grave por la posedanto de la orakolo forigi la eblecon reuzi R por subskribi malsamajn uzantmesaĝojn. Tio estas, kun iu ajn manipulado aŭ koluzio, la orakolo ĉiam riskos perdi sian privatan ŝlosilon.

Entute, la orakolo devas provizi uzantojn per du funkcioj: inicialigo, kiu fiksas la valoron R, kaj subskribo, kiu resendas la valoron S. En ĉi tiu kazo, la paro R, S estas la kutima kontrolebla subskribo de uzantmesaĝo enhavanta fiksan mesaĝon. valoro R kaj arbitraj uzantdatenoj.

Oni povas argumenti, ke ĉi tiu skemo por la blokĉeno estas nenio pli ol ordinara commit-expand-skemo. Esence, jes, ĝi estas ŝi. Sed estas pluraj nuancoj. Unue, la orakolo ĉiam funkcias per la sama ŝlosilo en ĉiuj operacioj, ekzemple, ĉi tio estas oportuna uzi en kontraktoj. Due, ekzistas risko, ke la orakolo perdu la privatan ŝlosilon se ĝi kondutas malĝuste, ekzemple, la orakolo permesas fari specimenojn de la rezulto, tiam sufiĉas fari nur du provojn por ekscii la privatan ŝlosilon kaj akiri plenan. aliro al la monujo. Trie, subskribo, kiu estas denaske kontrolebla sur la blokĉeno kaj estas fonto de hazardo, estas bela.

Dum ses monatoj la ideo de efektivigo ekbolis en mia kapo, ĝis fine aperis instigo en la formo subvencio de Waves Labs. Kun granda subvencio venas granda respondeco, do la projekto estos tie!

Реализация

Do, en ĉi tiu projekto VECRO estis efektivigita sur la Waves-blokoĉeno en peto-responda reĝimo uzante translokajn transakciojn inter la uzanto kaj la orakolo. Samtempe, skripto estas instalita sur la orakola konto, kiu kontrolas la laboron strikte laŭ la logiko priskribita supre. Oracle-transakcioj estas kontrolitaj kaj la tuta ĉeno de uzantinterago estas restarigita. Ĉiuj kvar transakcioj estas implikitaj en kontrolado de la fina valoro; la inteligenta kontrakto kunigas ilin kun strikta kontrola fadeno, kontrolante ĉiujn valorojn paŝo post paŝo kaj lasante neniun lokon por ajna manipulado.

Denove, por flankenmeti ĝin kaj fari ĝin pli klara. La orakolo ne nur funkcias laŭ la proponita skemo. Ĝia laboro estas tute kontrolita ĉe la blokĉena nivelo de la establita strikte kun inteligenta kontrakto. Paŝu maldekstren kaj la transakcio simple ne trairos. Do, se transakcio estas inkluzivita en la blokĉeno, la uzanto eĉ ne bezonas kontroli ion ajn; centoj da retaj nodoj jam kontrolis ĉion por li.

Nuntempe, ekzistas unu VECRO funkcianta sur la Waves ĉefreto (vi povas ruli vian propran, ĝi ne estas malfacila, nur rigardu la agordan ekzemplon). La nuna kodo funkcias en PHP (sur WavesKit, pri kiu Mi diris al vi pli frue).

Por uzi la orakolservon vi devas:

  • Ripari R;
    • Sendu almenaŭ 0.005 Ondojn al orakolo kaŝnomo init@vecr;
    • Ricevu la R-kodon en la aldonaĵa kampo en la translokigo de 1 R-vecr-ĵetono de la orakolo al la uzanto;
  • Akiru subskribon;
    • Sendu almenaŭ 0.005 Ondojn al la orakola kaŝnomo random@vecr, kaj ankaŭ DEVAS indiki la antaŭe ricevitan R-kodon kaj kromajn uzantajn datumojn en la aldonaĵa kampo;
    • Ricevu la S-kodon en la aldonaĵa kampo en la translokigo de 1 S-vecr-ĵetono de la orakolo al la uzanto;
  • Uzu S-kodon kiel fonton de pseŭdo-hazarda nombro.

Nuancoj de la nuna efektivigo:

  • Ondoj senditaj al la orakolo estas uzataj kiel komisiono por la revena transakcio al la uzanto, ĝis maksimume 1 Ondoj;
  • R-kodo estas la kunligado de bajto de la 'R' karaktero kaj 32-bajta baz58-kodita R valoro;
  • R-kodo en aldonaĵo devus esti unua, uzant-datumoj venas post R-kodo;
  • S-kodo estas la kunligado de bajto de la signo 'S' kaj 32-bajta bazo58-kodita valoro de S;
  • S estas la rezulto de modula divido, do vi ne povas uzi S kiel plenan 256-bita pseŭdohazarda nombro (ĉi tiu nombro povas esti konsiderata maksimuma de 252-bita pseŭdohazarda nombro);
  • La plej simpla opcio estas uzi la S-kodan haŝon kiel pseŭdo-hazardan nombron.

Ekzemplo de ricevado de S-kodo:

De teknika vidpunkto, la orakolo estas tute preta por labori, vi povas sekure uzi ĝin. De la vidpunkto de uzo de la meza uzanto mankas oportuna grafika interfaco; ĉi tio devos atendi.

Mi volonte respondos demandojn kaj akceptos komentojn, dankon.

fonto: www.habr.com

Aldoni komenton