Náhodné orákulum založené na digitálním podpisu v blockchainu

Od nápadu k realizaci: stávající schéma digitálního podpisu eliptické křivky upravujeme tak, aby bylo deterministické, a na jeho základě poskytujeme funkce pro získávání pseudonáhodných čísel ověřitelných v rámci blockchainu.

Náhodné orákulum založené na digitálním podpisu v blockchainu

Nápad

Na podzim roku 2018 zahrnoval blockchain Waves aktivovány první chytré smlouvy, hned vyvstal dotaz na možnost získání pseudonáhodná číslamůžete věřit.

Když jsem si nad touto otázkou lámal hlavu, nakonec jsem došel k závěru: každý blockchain je buňka; v uzavřeném systému je nemožné získat důvěryhodný zdroj entropie.

Ale přesto se mi líbil jeden nápad: kdyby náhodné orákulum podepíše uživatelská data deterministickým algoritmem, pak uživatel bude moci takový podpis vždy ověřit pomocí veřejného klíče a bude mít jistotu, že výsledná hodnota je jedinečná. Orákulum, ať chce sebevíc, nemůže nic změnit, algoritmus dává jednoznačný výsledek. V podstatě uživatel zaznamená výsledek, ale nezná ho, dokud jej orákulum nezveřejní. Ukazuje se, že orákulu nemůžete vůbec věřit, ale zkontrolujte výsledek jeho práce. Pak v případě úspěšného ověření lze takový podpis považovat za zdroj entropie pro pseudonáhodné číslo.

Blockchainová platforma Waves využívá podpisové schéma EdDSA вариант Ed25519. V tomto schématu se podpis skládá z hodnot R a S, kde R závisí na náhodné hodnotě a S se počítá na základě podepisované zprávy, soukromého klíče a stejného náhodného čísla jako R. Ukazuje se, že neexistuje žádná jedinečná závislost pro totéž Existuje mnoho platných podpisů pro uživatelskou zprávu.

Je zřejmé, že ve své čisté formě nelze takový podpis použít jako zdroj pseudonáhodných čísel, protože je nedeterministický, a proto s ním může orákulum snadno manipulovat.

Ale jak se ukázalo, ve skutečnosti je možné ji učinit deterministickou.

Vkládal jsem velké naděje ověřitelná náhodná funkce (VRF), ale po prostudování hardwaru jsem tuto možnost musel opustit. Ačkoli VRF nabízí deterministickou verzi podpisu a jeho důkaz, v algoritmu je zvláštní místo, které otevírá černou díru pro manipulaci s orákulem. Konkrétně při výpočtu hodnoty k (část 5.1) je použit soukromý klíč, který zůstává uživateli neznámý, což znamená, že uživatel nemůže ověřit správnost výpočtu k, což znamená, že oracle může použít libovolnou hodnotu k, kterou potřebuje, a zároveň udržovat databázi korespondencí k a podepsaných dat, aby bylo možné vždy přepočítat správný výsledek z hlediska VRF . Pokud vidíte kresbu založenou na VRF bez zveřejnění soukromého klíče, můžete být chytří: označte potřebu klíč buď odhalit, nebo jej vyloučit z výpočtu k, pak se soukromý klíč automaticky odhalí, když se objeví první podpis . Obecně, jak již bylo zmíněno, podivné schéma pro náhodné orákulum.

Po krátkém přemýšlení a získání podpory místních analytiků se zrodilo pracovní schéma VECRO.

VECRO je zkratka pro Verifiable Elliptic Curve Random Oracle, což v ruštině znamená ověřitelný náhodný orákulum na eliptických křivkách.

Všechno se ukázalo být docela jednoduché, k dosažení determinismu je třeba opravit hodnotu R, než se objeví zpráva, která má být podepsána. Pokud je R potvrzeno a je součástí podepisované zprávy, což dále zajišťuje, že R je potvrzeno v podepisované zprávě, je hodnota S jednoznačně určena zprávou uživatele a lze ji tedy použít jako zdroj pro pseudonáhodná čísla.

V takovém schématu nezáleží na tom, jak je R pevně stanoveno, to zůstává odpovědností věštce. Je důležité, že S je jednoznačně určeno uživatelem, ale jeho hodnota je neznámá, dokud ji orákulum nezveřejní. Všechno, co jsme chtěli!

Když už mluvíme o pevném R, všimněte si toho znovu použitý R při podepisování různých zpráv jednoznačně odhalí soukromý klíč ve schématu EdDSA. Pro vlastníka orákula se stává nesmírně důležité eliminovat možnost opětovného použití R k podepisování různých uživatelských zpráv. To znamená, že při jakékoli manipulaci nebo tajné dohodě bude orákulum vždy riskovat ztrátu soukromého klíče.

Celkem musí oracle uživatelům poskytnout dvě funkce: inicializaci, která zafixuje hodnotu R, a podpis, který vrátí hodnotu S. V tomto případě je dvojice R, S obvyklým ověřitelným podpisem uživatelské zprávy obsahující pevnou hodnota R a libovolná uživatelská data.

Lze namítnout, že toto schéma pro blockchain není nic jiného než obyčejné schéma commit-expand. V podstatě ano, je to ona. Ale existuje několik nuancí. Za prvé, oracle vždy pracuje se stejným klíčem ve všech operacích, například to je vhodné použít ve smlouvách. Za druhé existuje riziko, že orákulum ztratí soukromý klíč, pokud se bude chovat nesprávně, například oracle vám umožní udělat vzorky výsledku, pak stačí provést pouze dva testy, abyste zjistili soukromý klíč a získali plný přístup k peněžence. Za třetí, podpis, který je nativně ověřitelný na blockchainu a je zdrojem náhodnosti, je krásný.

Šest měsíců mi v hlavě vířila myšlenka na implementaci, až se nakonec ve formě objevila motivace grant od Waves Labs. S velkým grantem přichází velká zodpovědnost, takže projekt tam bude!

uskutečnění

Takže v tomto projektu Bylo implementováno VECRO na blockchainu Waves v režimu žádost-odpověď pomocí přenosových transakcí mezi uživatelem a oracle. Zároveň je na účtu oracle nainstalován skript, který řídí práci striktně v souladu s výše popsanou logikou. Transakce Oracle jsou ověřeny a celý řetězec interakce uživatele je obnoven. Všechny čtyři transakce se podílejí na ověřování konečné hodnoty, chytrá smlouva je spojuje přísným ověřovacím vláknem, kontroluje všechny hodnoty krok za krokem a nenechává žádný prostor pro jakoukoliv manipulaci.

Ještě jednou, abych to odložil a udělal to přehlednější. Orákulum nefunguje pouze podle navrženého schématu. Jeho práce je na úrovni blockchainu zcela řízena zavedenými pevně s inteligentní smlouvou. Krok doleva a transakce prostě neprojde. Pokud je tedy transakce zahrnuta do blockchainu, uživatel ani nemusí nic kontrolovat, stovky síťových uzlů již vše zkontrolovaly za něj.

V současné době běží na hlavní síti Waves jedno VECRO (můžete provozovat vlastní, není to obtížné, stačí podívejte se na příklad konfigurace). Aktuální kód běží v PHP (on WavesKit, o které Řekl jsem ti to dříve).

Abyste mohli používat službu Oracle, musíte:

  • Fix R;
    • Pošlete alespoň 0.005 vln na oracle alias init@vecr;
    • Při převodu 1 tokenu R-vecr z orákula k uživateli obdržíte R-kód v poli přílohy;
  • Získejte podpis;
    • Pošlete alespoň 0.005 vln do oracle alias random@vecr a také MUSÍ uvést dříve přijatý R-kód a další uživatelská data v poli přílohy;
    • Při převodu 1 tokenu S-vecr z orákula k uživateli obdržíte S-kód v poli přílohy;
  • Použijte S-kód jako zdroj pseudonáhodného čísla.

Nuance současné implementace:

  • Vlny odeslané věštci se používají jako provize za návratovou transakci uživateli, maximálně do 1 vlny;
  • R-kód je zřetězení bajtu znaku 'R' a 32bajtové hodnoty R kódované base58;
  • R-kód v příloze by měl být první, uživatelská data následují za R-kódem;
  • S-kód je zřetězení bajtu znaku 'S' a 32bajtové hodnoty S zakódované v base58;
  • S je výsledkem modulového dělení, takže S nemůžete použít jako úplné 256bitové pseudonáhodné číslo (toto číslo lze považovat za maximálně 252bitové pseudonáhodné číslo);
  • Nejjednodušší možností je použít hash S-kódu jako pseudonáhodné číslo.

Příklad příjmu S-kódu:

Z technického hlediska je orákulum zcela připraveno k práci, můžete jej bezpečně používat. Z hlediska použití běžným uživatelem chybí pohodlné grafické rozhraní, to si bude muset počkat.

Rád zodpovím dotazy a přijmu komentáře, děkuji.

Zdroj: www.habr.com

Přidat komentář