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

Nápad
Na podzim 2018 byly v blockchainu Waves , okamžitě se objevila otázka, zda je možné získat , kterým lze důvěřovat.
Po přemýšlení o této otázce jsem dospěl k závěru: jakýkoliv blockchain je klec, důvěryhodný zdroj entropie v uzavřeném systému není možné získat.
Ale jedna myšlenka se mi přece jen líbila: pokud bude generovat podpis uživatelských dat pomocí deterministického algoritmu, pak si uživatel vždy bude moci tento podpis ověřit veřejným klíčem a bude mít jistotu, že získaná hodnota je unikátní. Oracle nemůže nic změnit, algoritmus poskytuje jednoznačný výsledek. V podstatě si uživatel zafixuje výsledek, ale neví ho, dokud ho oracle nezveřejní. Takže vlastně není třeba oraklovi důvěřovat, ale je možné ověřit 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.
V blockchainové platformě Waves se používá podpisové schéma varianta . 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, které je použito pro R. To znamená, že neexistuje jednoznačná závislost, pro jednu a tutéž uživatelskou zprávu existuje mnoho platných podpisů.
Je zřejmé, že takový podpis v čisté podobě nelze použít jako zdroj pseudonáhodných čísel, protože je nedeterministický a tudíž může být snadno manipulován oraclem.
Ale jak se ukázalo, je skutečně možné učinit jej deterministickým.
Měl jsem velké naděje na , ale po prostudování předmětu jsme se museli této variantě vzdát. Ačkoli VRF nabízí deterministickou variantu podpisu a jeho důkazů, v algoritmu se nachází podivné místo, které vytváří černou díru pro manipulace orákulem. Konkrétně, při výpočtu hodnoty k () se používá tajný klíč, který zůstává uživateli neznámý, což znamená, že uživatel nemůže zkontrolovat správnost výpočtu k. To znamená, že orákulum může použít jakoukoli potřebnou hodnotu k a zároveň vést databázi shod k a podepisovaných dat, aby vždy mohlo znovu vypočítat správný výsledek z pohledu VRF. Uvidíte slosování založené na VRF bez odhalení tajného klíče, můžete se pustit do intelektuální debaty: uvést nutnost buď odhalit klíč, nebo jej vyloučit z výpočtu k, jinak bude tajný klíč automaticky odhalen při prvním podpisu. Jak už bylo řečeno, podivný systém pro náhodného orákula.
Po trochu přemýšlení a podpoře místních analytiků se zrodil plán práce VECRO.
VECRO je zkratka pro Verifiable Elliptic Curve Random Oracle, což znamená ověřitelný náhodný orákul na eliptických křivkách.
Všechno se ukázalo jako celkem jednoduché, pro dosažení determinovanosti je potřeba fixovat hodnotu R před vznikem podepisované zprávy. Pokud je R fixováno a je součástí podepisované zprávy, což navíc zaručuje fixaci R v samotné podepisované zprávě, hodnota S je jednoznačně určena uživatelskou zprávou a tudíž může být použita jako zdroj pro pseudonáhodná čísla.
V takovém schématu nezáleží na tom, jakým způsobem je R fixováno, to zůstává v odpovědnosti orákula. Důležité je, že S je jednoznačně určeno uživatelským vstupem, ale jeho hodnota není známa, dokud ji orákulum nepublikuje. Přesně jak jsme chtěli!
Pokud jde o fixované R, mějte na paměti, že Při podepisování různých zpráv jednoznačně odhaluje privátní klíč v schématu EdDSA. Pro vlastníka orákula je nesmírně důležité vyloučit možnost opětovného použití R pro podpis různých zpráv uživatele. To znamená, že při jakýchkoli manipulacích nebo dohodách orákulum vždy riskuje ztrátu svého privátního klíče.
Celkově by orákulum mělo uživatelům poskytovat dvě funkce: inicializaci, která zafixuje hodnotu R, a podpis, který vrací hodnotu S. Přitom pár R, S je běžným ověřitelným podpisem uživatelské zprávy obsahující fixní hodnotu R a libovolné údaje uživatele.
Lze namítnout, že toto schéma pro blockchain není nic jiného než běžné . V podstatě, ano, je to ono. Ale existuje několik nuancí. Za prvé, orákulum vždy pracuje se stejným klíčem ve všech operacích, například je to pohodlné používat v kontraktech. Za druhé, existuje riziko ztráty privátního klíče orákulem při nesprávném chování, například orákulum umožňuje provádět vzorky výsledku, pak stačí provést pouhé dva vzorky, aby se zjistil privátní klíč a získal plný přístup k peněžence. Za třetí, nativně ověřitelný podpis v blockchainu, který je zdrojem náhody — to je hezké.
Půl roku se myšlenka realizace vyvíjela v hlavě, dokud konečně nepřišla motivace v podobě . S velkým grantem přichází velká odpovědnost, znamená to, že projekt má být!
Implementace
Takže v tomto projektu na blockchainu Waves v režimu dotaz-odpověď pomocí transakcí transferu mezi uživatelem a orákulem. Přitom na účtu orákula je nastaven skript, který kontroluje práci striktně v souladu s výše popsanou logikou. Transakce orákula procházejí kontrolou s obnovováním celé řetězu interakce s uživatelem. V kontrole finální hodnoty se účastní všechny čtyři transakce, chytrý kontrakt je průběžně zajišťuje na přísné kontrolní nitce, krok za krokem ověřuje všechny hodnoty a nenechává místo pro jakékoli manipulace.
Ještě jednou, aby to lépe zapadlo a bylo jasnější. Orákulum nepracuje pouze podle navrhovaného schématu. Jeho činnost je plně kontrolována na úrovni blockchainu. . Krok vlevo a transakce prostě neprojde. Takže pokud transakce skončila v blockchainu, uživatel ani nemusí nic kontrolovat, za něj to už ověřilo stovky uzlů sítě.
V současnosti je v hlavní síti Waves spuštěn jeden VECRO (můžete spustit svůj, není to složité, stačí ). Aktuální kód běží na PHP (na , o kterém ).
Abyste mohli využít službu oracle, je nutné:
- Zafixovat R;
- Poslat minimálně 0.005 Waves na alias oracle init@vecr;
- Získat R-kód v poli attachment v převodu 1 R-vecr tokenu od oracle uživateli;
- Získat podpis;
- Poslat minimálně 0.005 Waves na alias oracle random@vecr, a také POVINNĚ uvést v poli attachment dříve získaný R-kód a další uživatelská data;
- Získat S-kód v poli attachment v převodu 1 S-vecr tokenu od oracle uživateli;
- Použít S-kód jako zdroj pseudonáhodného čísla.
Nuance aktuální implementace:
- Poslané Waves oracle se používají jako poplatek za zpětnou transakci uživateli, až do maximálně 1 Waves;
- R-kód je spojení bytu symbolu 'R' a 32-bytní hodnoty R v kódování base58;
- R-kód v attachment by měl být první, uživatelská data jdou po R-kódu;
- S-kód je spojení bytu symbolu 'S' a 32-bytní hodnoty S v kódování base58;
- S je výsledkem dělení podle modulu, proto nelze používat S jako plnohodnotné 256-bitové pseudonáhodné číslo (toto číslo může být považováno maximálně za 252-bitové pseudonáhodné číslo);
- Nejjednodušší varianta je použít hash od S-kódu jako pseudonáhodné číslo.
Příklad získání S-kódu:
- Inicializace:
- Získání R-kódu:
- Žádost o výsledek podpisu R-kódu a uživatelských dat 'random':
- Získání S-kódu:
Z technického hlediska je oracle plně připraven k použití, můžete ho bez obav používat. Z pohledu běžného uživatele chybí pohodlné grafické rozhraní, na to si budeme muset počkat.
Rád odpovím na otázky a přijmu připomínky, děkuji.
Zdroj: habr.com
