Juhuslik oraakel, mis põhineb digitaalallkirjal plokiahelas

Ideest teostuseni: muudame olemasoleva elliptilise kõvera digiallkirja skeemi deterministlikuks ning pakume selle põhjal funktsioone plokiahela sees kontrollitavate pseudojuhuslike arvude saamiseks.

Juhuslik oraakel, mis põhineb digitaalallkirjal plokiahelas

Mõte

2018. aasta sügisel hõlmas Waves plokiahel esimesed nutikad lepingud aktiveeritud, tekkis kohe küsimus saamise võimaluse kohta pseudojuhuslikud arvudvõite usaldada.

Selle küsimuse üle hämmeldunult jõudsin lõpuks järeldusele: iga plokiahel on rakk; suletud süsteemis on võimatu saada usaldusväärset entroopiaallikat.

Aga üks mõte mulle siiski meeldis: kui juhuslik oraakel allkirjastab kasutaja andmed deterministliku algoritmiga, siis on kasutajal alati võimalik sellist allkirja avaliku võtme abil kontrollida ja olla kindel, et saadud väärtus on kordumatu. Oraakel, ükskõik kui kõvasti ta ka ei tahaks, ei suuda midagi muuta, algoritm annab üheselt mõistetava tulemuse. Põhimõtteliselt salvestab kasutaja tulemuse, kuid ei tea seda enne, kui oraakel selle avaldab. Selgub, et te ei saa oraaklit üldse usaldada, vaid kontrollige selle töö tulemust. Seejärel võib eduka kontrollimise korral sellist allkirja pidada pseudojuhusliku arvu entroopia allikaks.

Waves'i plokiahela platvorm kasutab allkirjaskeemi EdDSA võimalus Ed25519. Selles skeemis koosneb signatuur väärtustest R ja S, kus R sõltub juhuslikust väärtusest ja S arvutatakse allkirjastatava sõnumi, privaatvõtme ja sama juhusliku numbri alusel, mis R. Selgub, et ei ole unikaalset sõltuvust sama Kasutaja sõnumil on palju kehtivaid allkirju.

Ilmselgelt ei saa sellist allkirja puhtal kujul kasutada pseudojuhuslike arvude allikana, kuna see on mittedeterministlik ja seetõttu saab oraakel sellega hõlpsasti manipuleerida.

Kuid nagu selgus, on tegelikult võimalik muuta see deterministlikuks.

Mul olid suured lootused Kontrollitav juhuslik funktsioon (VRF), kuid pärast riistvara uurimist pidin sellest võimalusest loobuma. Kuigi VRF pakub allkirja ja selle tõestuse deterministlikku versiooni, on algoritmis kummaline koht, mis avab oraakliga manipuleerimiseks musta augu. Nimelt k väärtuse arvutamisel (5.1 jaotis) kasutatakse privaatvõtit, mis jääb kasutajale teadmata, mis tähendab, et kasutaja ei saa kontrollida k arvutuse õigsust, mis tähendab, et oraakel saab kasutada mis tahes vajalikku k väärtust ja samal ajal pidada vastavuste andmebaasi. k-st ja allkirjastatud andmetest, et oleks alati võimalik VRF-i seisukohast õige tulemus ümber arvutada. Kui näete VRF-il põhinevat joonist ilma privaatvõtit avaldamata, võite olla nutikas: märkige võti avalikustamise vajadusest või jäta see k arvutamisest välja, siis ilmub privaatvõti ennast automaatselt esimese allkirja ilmumisel . Üldiselt, nagu juba mainitud, kummaline skeem juhusliku oraakli jaoks.

Pärast väikest järelemõtlemist ja kohalike analüütikute toetuse hankimist sündis VECRO tööskeem.

VECRO on lühend sõnast Verifiable Elliptic Curve Random Oracle, mis vene keeles tähendab kontrollitavat juhuslikku oraaklit elliptilistel kõveratel.

Kõik osutus üsna lihtsaks, determinismi saavutamiseks peate enne allkirjastatava sõnumi ilmumist fikseerima R väärtuse. Kui R on siduv ja on osa allkirjastatavast sõnumist, mis tagab täiendavalt, et R on allkirjastatavas sõnumis kinnitatud, määrab S väärtuse üheselt kasutaja sõnum ja seetõttu saab seda kasutada pseudojuhuslike numbrite allikana.

Sellise skeemi puhul pole vahet, kuidas R fikseeritakse, see jääb oraakli vastutusalasse. On oluline, et S oleks kasutaja poolt üheselt määratud, kuid selle väärtus pole teada enne, kui oraakel selle avaldab. Kõik, mida tahtsime!

Rääkides fikseeritud R-st, pange tähele taaskasutatud R erinevate sõnumite allkirjastamisel paljastab see unikaalselt EdDSA skeemi privaatvõtme. Oraakli omaniku jaoks muutub äärmiselt oluliseks välistada võimalus R-i taaskasutada erinevate kasutajateadete allkirjastamiseks. See tähendab, et igasuguse manipuleerimise või kokkumängu korral riskib oraakel alati oma privaatvõtme kaotamisega.

Kokku peab oraakel pakkuma kasutajatele kahte funktsiooni: initsialiseerimine, mis fikseerib väärtuse R, ja signatuur, mis tagastab väärtuse S. Sel juhul on paar R, S fikseeritud sõnumit sisaldava kasutajateate tavaline kontrollitav allkiri. väärtus R ja suvalised kasutajaandmed.

Võib väita, et see plokiahela skeem pole midagi muud kui tavaline commit-expand skeem. Põhimõtteliselt jah, see on tema. Kuid on mitmeid nüansse. Esiteks töötab oraakel kõikides toimingutes alati sama võtmega, näiteks on seda mugav kasutada lepingutes. Teiseks on oht, et oraakel kaotab privaatvõtme, kui see käitub valesti, näiteks võimaldab oraakel teha tulemusest näidiseid, siis piisab privaatvõtme väljaselgitamiseks ja täisväärtuse saamiseks vaid kahe testi tegemisest. juurdepääs rahakotile. Kolmandaks on ilus signatuur, mis on plokiahelas algselt kontrollitav ja mis on juhuslikkuse allikas.

Kuus kuud mõlkus mu peas teostuse idee, kuni lõpuks tekkis vormis motivatsioon Waves Labsi toetus. Suure toetusega kaasneb suur vastutus, nii et projekt saab olema!

Реализация

Niisiis, selles projektis VECRO rakendati Waves'i plokiahelas päringu-vastuse režiimis, kasutades kasutaja ja oraakli vahelisi ülekandetehinguid. Samal ajal installitakse oracle'i kontole skript, mis kontrollib tööd rangelt vastavalt ülalkirjeldatud loogikale. Oracle'i tehingud kontrollitakse ja kogu kasutaja suhtlusahel taastatakse. Kõik neli tehingut on seotud lõpliku väärtuse kontrollimisega; nutikas leping ühendab need range kontrollilõimega, kontrollides kõiki väärtusi samm-sammult ega jätnud ruumi manipuleerimiseks.

Veel kord, et see kõrvale jätta ja selgemaks teha. Oraakel ei tööta ainult pakutud skeemi järgi. Selle tööd kontrollivad täielikult plokiahela tasemel väljakujunenud tihedalt nutika lepinguga. Astuge vasakule ja tehing lihtsalt ei lähe läbi. Seega, kui tehing on plokiahelasse kaasatud, ei pea kasutaja isegi midagi kontrollima; sajad võrgusõlmed on tema eest juba kõike kontrollinud.

Praegu töötab Waves'i põhivõrgus üks VECRO (saate käivitada oma, see pole keeruline, lihtsalt vaadake konfiguratsiooni näidet). Praegune kood töötab PHP-s (on WavesKit, mille kohta Ma ütlesin sulle varem).

Oraakli teenuse kasutamiseks peate:

  • Parandage R;
    • Saatke vähemalt 0.005 Waves aadressile oracle alias init@vecr;
    • 1 R-vecr tokeni edastamisel oraaklilt kasutajale saate manuse väljale R-koodi;
  • Hankige allkiri;
    • Oraakli aliasele random@vecr saata vähemalt 0.005 Waves, samuti PEAB manuse väljale märkima varem saadud R-koodi ja täiendavad kasutajaandmed;
    • 1 S-vecr tokeni edastamisel oraaklilt kasutajale saada manuse väljale S-kood;
  • Kasutage pseudojuhusliku arvu allikana S-koodi.

Praeguse rakendamise nüansid:

  • Oraaklile saadetud laineid kasutatakse vahendustasuna kasutajale tagastamise tehingu eest, maksimaalselt 1 Waves;
  • R-kood on 'R'-märgi baidi ja 32-baidise base58-kodeeritud R-väärtuse konkatenatsioon;
  • Manuses olev R-kood peaks olema esimene, kasutajaandmed tulevad pärast R-koodi;
  • S-kood on märgi 'S' baidi ja S 32-baidise base58-kodeeritud väärtuse konkatenatsioon;
  • S on mooduljaotuse tulemus, seega ei saa S-d kasutada täis256-bitise pseudojuhusliku arvuna (seda arvu võib pidada maksimaalselt 252-bitiseks pseudojuhuslikuks arvuks);
  • Lihtsaim variant on kasutada pseudojuhusliku numbrina S-koodi räsi.

S-koodi vastuvõtmise näide:

Tehnilisest küljest on oraakel täiesti töövalmis, saate seda ohutult kasutada. Tavakasutaja kasutuse seisukohalt puudub mugav graafiline liides, see peab ootama.

Vastan hea meelega küsimustele ja võtan vastu kommentaare, tänan.

Allikas: www.habr.com

Lisa kommentaar