Náhodné orákulum založené na digitálnom podpise v blockchaine

Od nápadu k implementácii: existujúcu schému digitálneho podpisu eliptickej krivky upravíme tak, aby bola deterministická a na jej základe poskytujeme funkcie na získanie pseudonáhodných čísel overiteľných v rámci blockchainu.

Náhodné orákulum založené na digitálnom podpise v blockchaine

Nápad

Na jeseň 2018 zahŕňal blockchain Waves aktivované prvé smart kontrakty, hneď vyvstala otázka o možnosti získania pseudonáhodné číslaže môžete dôverovať.

V rozpakoch nad touto otázkou som nakoniec dospel k záveru: každý blockchain je bunka; v uzavretom systéme je nemožné získať dôveryhodný zdroj entropie.

Ale jeden nápad sa mi predsa len páčil: keby náhodné orákulum podpíše užívateľské dáta deterministickým algoritmom, potom si užívateľ bude môcť takýto podpis vždy overiť pomocou verejného kľúča a bude mať istotu, že výsledná hodnota je jedinečná. Orákulum, akokoľvek chce, nedokáže nič zmeniť, algoritmus dáva jednoznačný výsledok. V podstate používateľ zaznamená výsledok, ale nevie ho, kým ho orákulum nezverejní. Ukazuje sa, že orákulu vôbec nemôžete dôverovať, ale skontrolujte výsledok jeho práce. Potom v prípade úspešného overenia možno takýto podpis považovať za zdroj entropie pre pseudonáhodné číslo.

Blockchainová platforma Waves využíva podpisovú schému EdDSA voľba Ed25519. V tejto schéme sa podpis skladá z hodnôt R a S, kde R závisí od náhodnej hodnoty a S sa počíta na základe správy, ktorá sa podpisuje, súkromného kľúča a rovnakého náhodného čísla ako R. Ukazuje sa, že neexistuje žiadna jedinečná závislosť pre to isté Existuje veľa platných podpisov pre správu používateľa.

Je zrejmé, že vo svojej čistej forme takýto podpis nemožno použiť ako zdroj pseudonáhodných čísel, pretože je nedeterministický, a preto s ním orákulum môže ľahko manipulovať.

Ako sa však ukázalo, v skutočnosti je možné ho urobiť deterministickým.

Vložil som do toho veľké nádeje overiteľná náhodná funkcia (VRF), no po preštudovaní hardvéru som túto možnosť musel opustiť. Hoci VRF ponúka deterministickú verziu podpisu a jeho dôkaz, v algoritme je zvláštne miesto, ktoré otvára čiernu dieru pre manipuláciu s orákulom. Totiž pri výpočte hodnoty k (oddiel 5.1) používa sa súkromný kľúč, ktorý zostáva používateľovi neznámy, čo znamená, že používateľ nemôže overiť správnosť výpočtu k, čo znamená, že oracle môže použiť akúkoľvek hodnotu k, ktorú potrebuje, a zároveň udržiavať databázu korešpondencií k a podpísaných dát, aby bolo možné vždy prepočítať správny výsledok z pohľadu VRF . Ak vidíte kresbu založenú na VRF bez zverejnenia súkromného kľúča, môžete byť múdri: naznačte potrebu buď odhaliť kľúč, alebo ho vylúčiť z výpočtu k, potom sa súkromný kľúč automaticky odhalí, keď sa objaví prvý podpis . Vo všeobecnosti, ako už bolo spomenuté, je to zvláštna schéma pre náhodné orákulum.

Po krátkom premýšľaní a získaní podpory miestnych analytikov sa zrodila schéma práce VECRO.

VECRO je skratka pre Verifiable Elliptic Curve Random Oracle, čo v ruštine znamená overiteľný náhodný orákulum na eliptických krivkách.

Všetko sa ukázalo byť celkom jednoduché, aby ste dosiahli determinizmus, musíte pred zobrazením správy, ktorá sa má podpísať, opraviť hodnotu R. Ak je R potvrdené a je súčasťou správy, ktorá sa podpisuje, čo ďalej zaisťuje, že R je potvrdené v správe, ktorá sa podpisuje, hodnota S je jednoznačne určená správou používateľa a môže sa preto použiť ako zdroj pre pseudonáhodné čísla.

V takejto schéme nezáleží na tom, ako je R fixované; to zostáva zodpovednosťou orákula. Je dôležité, že S je jednoznačne určené používateľom, ale jeho hodnota nie je známa, kým ho oracle nezverejní. Všetko, čo sme chceli!

Keď už hovoríme o pevnom R, všimnite si, že znovu použitý R pri podpisovaní rôznych správ jednoznačne odhalí súkromný kľúč v schéme EdDSA. Pre vlastníka orákula sa stáva mimoriadne dôležité eliminovať možnosť opätovného použitia R na podpisovanie rôznych používateľských správ. To znamená, že pri akejkoľvek manipulácii alebo tajnej dohode bude orákulum vždy riskovať stratu svojho súkromného kľúča.

Celkovo musí oracle poskytnúť používateľom dve funkcie: inicializáciu, ktorá zafixuje hodnotu R, a podpis, ktorý vráti hodnotu S. V tomto prípade je dvojica R, S obvyklý overiteľný podpis používateľskej správy obsahujúcej pevnú hodnota R a ľubovoľné užívateľské dáta.

Dá sa tvrdiť, že táto schéma pre blockchain nie je nič iné ako obyčajná Commit-Expand schéma. V podstate áno, je to ona. Ale existuje niekoľko nuancií. Po prvé, oracle vždy pracuje s rovnakým kľúčom vo všetkých operáciách, napríklad to je vhodné použiť v zmluvách. Po druhé, existuje riziko, že oracle stratí súkromný kľúč, ak sa bude správať nesprávne, napríklad oracle vám umožní urobiť vzorky výsledku, potom stačí urobiť len dva testy, aby ste zistili súkromný kľúč a získali plný prístup k peňaženke. Po tretie, podpis, ktorý je natívne overiteľný na blockchaine a je zdrojom náhodnosti, je krásny.

Šesť mesiacov mi v hlave vírila myšlienka implementácie, až sa nakoniec vo forme objavila motivácia grant od Waves Labs. S veľkým grantom prichádza veľká zodpovednosť, takže projekt tam bude!

Реализация

Takže v tomto projekte Bol implementovaný VECRO na blockchaine Waves v režime žiadosť-odpoveď pomocou prenosových transakcií medzi používateľom a oracle. Zároveň je na účte Oracle nainštalovaný skript, ktorý riadi prácu striktne v súlade s vyššie opísanou logikou. Transakcie Oracle sú overené a celý reťazec interakcie používateľa je obnovený. Všetky štyri transakcie sa podieľajú na overovaní konečnej hodnoty, inteligentná zmluva ich spája s prísnym overovacím vláknom, pričom všetky hodnoty kontroluje krok za krokom a nenecháva priestor na akúkoľvek manipuláciu.

Ešte raz, aby som to odložil a urobil to jasnejšie. Orákulum nefunguje len podľa navrhovanej schémy. Jeho prácu úplne kontrolujú etablovaní na úrovni blockchainu pevne s inteligentnou zmluvou. Krok doľava a transakcia jednoducho neprejde. Ak je teda transakcia zahrnutá do blockchainu, používateľ ani nemusí nič kontrolovať, stovky sieťových uzlov už všetko skontrolovali za neho.

V súčasnosti je na hlavnej sieti Waves spustený jeden VECRO (môžete spustiť svoj vlastný, nie je to ťažké, stačí pozrite si príklad konfigurácie). Aktuálny kód beží v PHP (zap WavesKit, o ktorom Povedal som ti to skôr).

Ak chcete používať službu Oracle, musíte:

  • Fix R;
    • Pošlite aspoň 0.005 vlny na oracle alias init@vecr;
    • Pri prenose 1 tokenu R-vecr z orákula používateľovi získajte R-kód do poľa prílohy;
  • Získajte podpis;
    • Pošlite aspoň 0.005 vlny do oracle alias random@vecr a tiež MUSÍ uviesť predtým prijatý R-kód a ďalšie používateľské údaje v poli prílohy;
    • Pri prenose 1 tokenu S-vecr z orákula používateľovi získajte S-kód v poli prílohy;
  • Použite S-kód ako zdroj pseudonáhodného čísla.

Nuansy súčasnej implementácie:

  • Vlny odoslané do orákula sa používajú ako provízia za vrátenú transakciu používateľovi, maximálne do 1 vlny;
  • R-kód je zreťazením bajtu znaku „R“ a 32-bajtovej hodnoty R zakódovanej v base58;
  • R-kód v prílohe by mal byť prvý, užívateľské dáta nasledujú po R-kóde;
  • S-kód je zreťazením bajtu znaku „S“ a 32-bajtovej hodnoty S zakódovanej v base58;
  • S je výsledkom modulového delenia, takže S nemôžete použiť ako celé 256-bitové pseudonáhodné číslo (toto číslo možno považovať za maximálne 252-bitové pseudonáhodné číslo);
  • Najjednoduchšou možnosťou je použiť hash S-kódu ako pseudonáhodné číslo.

Príklad prijatia S-kódu:

Z technického hľadiska je orákulum úplne pripravené na prácu, môžete ho bezpečne používať. Z hľadiska používania bežným používateľom chýba pohodlné grafické rozhranie, na to si bude musieť počkať.

Rád odpoviem na otázky a akceptujem pripomienky, ďakujem.

Zdroj: hab.com

Pridať komentár