Atsitiktinis orakulas, pagrįstas skaitmeniniu parašu blokų grandinėje

Nuo idėjos iki įgyvendinimo: modifikuojame esamą elipsinės kreivės skaitmeninio parašo schemą, kad ji būtų deterministinė, ir pagal ją pateikiame funkcijas, skirtas gauti pseudoatsitiktinius skaičius, kuriuos galima patikrinti blokų grandinėje.

Atsitiktinis orakulas, pagrįstas skaitmeniniu parašu blokų grandinėje

Idėja

2018 m. rudenį „Waves“ blokų grandinė buvo įtraukta suaktyvintos pirmosios išmaniosios sutartys, iškart iškilo klausimas dėl galimybės gauti pseudoatsitiktiniai skaičiaigalite pasitikėti.

Mįsdamas dėl šio klausimo, galiausiai priėjau prie išvados: bet kuri blokų grandinė yra ląstelė; uždaroje sistemoje neįmanoma gauti patikimo entropijos šaltinio.

Bet man vis tiek patiko viena mintis: jei atsitiktinis orakulas pasirašys vartotojo duomenis deterministiniu algoritmu, tuomet vartotojas visada galės patikrinti tokį parašą naudodamas viešąjį raktą, ir bus tikras, kad gauta reikšmė yra unikali. Orakulas, kad ir kaip norėtų, nieko negali pakeisti, algoritmas duoda nedviprasmišką rezultatą. Iš esmės vartotojas įrašo rezultatą, bet nežino jo, kol orakulas jo nepaskelbia. Pasirodo, orakulu visiškai negalima pasitikėti, o patikrinti jo darbo rezultatą. Tada sėkmingo patikrinimo atveju toks parašas gali būti laikomas pseudoatsitiktinio skaičiaus entropijos šaltiniu.

„Waves“ blokų grandinės platforma naudoja parašo schemą EdDSA pasirinkimas Ed25519. Šioje schemoje parašas susideda iš reikšmių R ir S, kur R priklauso nuo atsitiktinės reikšmės, o S apskaičiuojamas pagal pasirašomą pranešimą, privatų raktą ir tą patį atsitiktinį skaičių kaip ir R. Pasirodo, kad nėra unikalios priklausomybės tam pačiam Vartotojo pranešimui yra daug galiojančių parašų.

Akivaizdu, kad gryna forma toks parašas negali būti naudojamas kaip pseudoatsitiktinių skaičių šaltinis, nes jis nėra deterministinis ir todėl orakulas gali juo lengvai manipuliuoti.

Tačiau, kaip paaiškėjo, tai iš tikrųjų įmanoma padaryti deterministiniu.

Turėjau didelių vilčių patikrinama atsitiktinė funkcija (VRF), tačiau išstudijavus aparatinę įrangą, šios galimybės teko atsisakyti. Nors VRF siūlo deterministinę parašo versiją ir jo įrodymą, algoritme yra keista vieta, kuri atveria juodąją skylę manipuliuoti orakulu. Būtent, apskaičiuojant k reikšmę (5.1 skyrius) naudojamas privatus raktas, kuris vartotojui lieka nežinomas, o tai reiškia, kad vartotojas negali patikrinti k apskaičiavimo teisingumo, o tai reiškia, kad orakulas gali naudoti bet kurią jam reikalingą k reikšmę ir tuo pačiu palaikyti atitikmenų duomenų bazę. k ir pasirašytus duomenis, kad visada būtų galima iš naujo apskaičiuoti teisingą rezultatą VRF požiūriu. Jei matote piešinį, pagrįstą VRF, neatskleidę privataus rakto, galite būti protingi: nurodykite, kad reikia atskleisti raktą arba neįtraukti jį į k skaičiavimą, tada privatus raktas automatiškai atsiskleis, kai pasirodys pirmasis parašas. . Apskritai, kaip jau minėta, keista schema atsitiktiniam orakului.

Šiek tiek pagalvojus ir pasinaudojus vietinių analitikų palaikymu, gimė VECRO darbo schema.

VECRO yra Verifiable Eliptical Curve Random Oracle santrumpa, kuri rusiškai reiškia patikrinamą atsitiktinį orakulą elipsinėse kreivėse.

Viskas pasirodė gana paprasta; norint pasiekti determinizmą, prieš pasirodant pasirašytinai žinutei, reikia nustatyti R reikšmę. Jei R yra įsipareigojęs ir yra pasirašomo pranešimo dalis, o tai papildomai užtikrina, kad R yra pasirašytas, S reikšmė yra vienareikšmiškai nustatoma pagal vartotojo pranešimą ir todėl gali būti naudojama kaip pseudoatsitiktinių skaičių šaltinis.

Tokioje schemoje nesvarbu, kaip fiksuojamas R; už tai atsako orakulas. Svarbu, kad S būtų vienareikšmiškai nustatytas vartotojas, tačiau jo reikšmė nežinoma, kol orakulas jo nepaskelbs. Viskas, ko norėjome!

Kalbant apie fiksuotą R, atkreipkite dėmesį į tai pakartotinai panaudojo R pasirašant įvairias žinutes, unikaliai atskleidžia privatų raktą EdDSA schemoje. Orakulo savininkui tampa nepaprastai svarbu panaikinti galimybę pakartotinai naudoti R pasirašant skirtingus vartotojo pranešimus. Tai reiškia, kad bet kokiu manipuliavimu ar slaptu susitarimu orakulas visada rizikuos prarasti savo privatų raktą.

Iš viso orakulas turi suteikti vartotojams dvi funkcijas: inicijavimą, kuris fiksuoja reikšmę R, ir parašą, kuris grąžina reikšmę S. Šiuo atveju pora R, S yra įprastas patikrinamas vartotojo pranešimo, kuriame yra fiksuotas kodas, parašas. reikšmę R ir savavališkus vartotojo duomenis.

Galima teigti, kad ši „blockchain“ schema yra ne kas kita, kaip įprasta įsipareigojimo-išplėtimo schema. Iš esmės taip, tai yra. Tačiau yra keletas niuansų. Pirma, orakulas visada dirba su tuo pačiu raktu visose operacijose, pavyzdžiui, tai patogu naudoti sutartyse. Antra, yra rizika, kad orakulas praras privatųjį raktą, jei jis elgsis neteisingai, pavyzdžiui, orakulas leidžia jums padaryti rezultato pavyzdžius, tada pakanka atlikti tik du testus, kad sužinotumėte privatųjį raktą ir gautumėte visą prieiga prie piniginės. Trečia, parašas, kurį galima patikrinti blokų grandinėje ir kuris yra atsitiktinumo šaltinis, yra gražus.

Šešis mėnesius galvoje šmėžavo įgyvendinimo idėja, kol galiausiai formoje atsirado motyvacija dotacija iš „Waves Labs“.. Su didele dotacija ateina didžiulė atsakomybė, todėl projektas bus ten!

Vykdymas

Taigi, šiame projekte VECRO buvo įdiegtas „Waves“ blokų grandinėje užklausos-atsakymo režimu, naudojant perdavimo operacijas tarp vartotojo ir orakulo. Tuo pačiu metu „Oracle“ paskyroje yra įdiegtas scenarijus, kuris kontroliuoja darbą griežtai pagal aukščiau aprašytą logiką. „Oracle“ operacijos yra patikrinamos ir atkuriama visa vartotojo sąveikos grandinė. Visos keturios operacijos yra susijusios su galutinės vertės patikrinimu; išmanioji sutartis sujungia jas griežta tikrinimo gija, žingsnis po žingsnio tikrindama visas vertes ir nepalikdama vietos jokiam manipuliavimui.

Dar kartą – atidėti į šalį ir padaryti aiškiau. Orakulas veikia ne tik pagal siūlomą schemą. Jo darbą blokų grandinės lygiu visiškai kontroliuoja nustatyta griežtai su protinga sutartimi. Ženkite į kairę ir sandoris tiesiog neįvyks. Taigi, jei operacija įtraukta į blokų grandinę, vartotojui net nereikia nieko tikrinti; šimtai tinklo mazgų jau viską patikrino už jį.

Šiuo metu Waves pagrindiniame tinkle veikia vienas VECRO (galite paleisti savo, tai nėra sunku, tiesiog pažvelkite į konfigūracijos pavyzdį). Dabartinis kodas veikia PHP (įjungta WavesKit, apie kurią Aš tau sakiau anksčiau).

Norėdami naudotis orakulo paslauga, turite:

  • Pataisyti R;
    • Siųsti bent 0.005 Waves į oracle slapyvardį init@vecr;
    • Gauti R kodą priedo laukelyje perduodant 1 R-vecr žetoną iš orakulo vartotojui;
  • Gaukite parašą;
    • Oracle slapyvardžiu random@vecr siųsti bent 0.005 Waves, taip pat priedo laukelyje PRIVALO nurodyti anksčiau gautą R kodą ir papildomus vartotojo duomenis;
    • Gauti S kodą priedo laukelyje perduodant 1 S-vecr žetoną iš orakulo vartotojui;
  • Naudokite S kodą kaip pseudoatsitiktinių skaičių šaltinį.

Dabartinio įgyvendinimo niuansai:

  • Orakului siunčiamos bangos naudojamos kaip komisiniai už grąžinimo operaciją vartotojui, ne daugiau kaip 1 banga;
  • R kodas yra „R“ simbolio baito ir 32 baitų bazinės58 koduotos R reikšmės sujungimas;
  • R kodas priede turėtų būti pirmas, vartotojo duomenys pateikiami po R kodo;
  • S kodas yra simbolio „S“ baito ir 32 baitų base58 koduotos S reikšmės sujungimas;
  • S yra modulio padalijimo rezultatas, todėl negalite naudoti S kaip viso 256 bitų pseudoatsitiktinio skaičiaus (šis skaičius gali būti laikomas didžiausiu 252 bitų pseudoatsitiktiniu skaičiumi);
  • Paprasčiausias variantas yra naudoti S kodo maišą kaip pseudoatsitiktinį skaičių.

S kodo gavimo pavyzdys:

Techniniu požiūriu orakulas yra visiškai paruoštas darbui, galite jį saugiai naudoti. Paprasto vartotojo požiūriu, trūksta patogios grafinės sąsajos, tai teks palaukti.

Mielai atsakysiu į klausimus ir priimsiu komentarus, ačiū.

Šaltinis: www.habr.com

Добавить комментарий