Od myšlienky k realizácii: modifikujeme existujúci systém digitálneho podpisu na eliptických krivkách, aby bol deterministický, a na jeho základe poskytujeme funkcie na získavanie overiteľných pseudo-náhodných čísel v rámci blockchainu.

Myšlienka
Na jeseň 2018 boli v blockchaine Waves , okamžite sa objavila otázka o možnosti získania , ktorým môžeme dôverovať.
Keď som sa nad touto otázkou zamýšľal, konečne som dospel k záveru: každý blockchain je celok, získať dôveryhodný zdroj entropie v uzavretom systéme je nemožné.
Ale jedna myšlienka ma predsa oslovila: ak bude robiť podpis používateľských údajov deterministickým algoritmom, potom si používateľ vždy bude môcť overiť takýto podpis pomocou verejného kľúča a bude si istý, že získaná hodnota je jedinečná. Orákul, akokoľvek sa snaží, nemôže nič zmeniť, algoritmus dáva jednoznačný výsledok. V podstate používateľ fixuje výsledok, ale nevie ho, pokým ho orákul nepublikuje. Ukazuje sa, že im môžete vôbec nedôverovať, ale overiť výsledok jeho práce. Potom, v prípade úspešného overenia, môže byť takýto podpis považovaný za zdroj entropie pre pseudo-náhodné číslo.
V blockchainovej platforme Waves sa používa schéma podpisu variantu . V tejto schéme podpis pozostáva z hodnôt R a S, kde R závisí od náhodnej hodnoty a S sa vypočíta na základe podpisovaných správ, súkromného kľúča a tej istej náhodnej hodnoty ako R. Ukazuje sa, že neexistuje jednoznačná závislosť, pre rovnakú používateľskú správu existuje množstvo platných podpisov.
Je zrejmé, že v čistej forme taký podpis nemožno použiť ako zdroj pseudo-náhodných čísel, pretože je nedeterministický a teda môže byť ľahko manipulovaný orákulom.
Ale, ako sa ukázalo, je možné ho skutočne spraviť deterministickým.
Veľké nádeje som mal na , ale po preskúmaní technických detailov bolo nutné od tohto variantu upustiť. Hoci VRF ponúka deterministickú variantu podpisu a jeho dôkazov, v algoritme sa nachádza podivné miesto, ktoré otvára čiernu dieru pre manipulácie oracle. A konkrétne, pri výpočte hodnoty k () sa používa tajný kľúč, ktorý zostáva neznámy používateľovi, čo znamená, že používateľ nemôže overiť správnosť výpočtu k, a teda oracle môže použiť akúkoľvek požadovanú hodnotu k a zároveň viesť databázu zhody hodnoty k a podpisovaných údajov, aby vždy mohol opätovne vypočítať správny výsledok z pohľadu VRF. Uvidíte žrebovanie na základe VRF bez odhalenia tajného kľúča, môžete rozumovať: naznačiť potrebu alebo odhaliť kľúč, alebo vylúčiť ho z výpočtu k, inak sa tajný kľúč automaticky odhalí pri objavení sa prvého podpisu. V každom prípade, ako už bolo povedané, podivný systém pre náhodného oracla.
Po chvíli premýšľania a získaní podpory od miestnych analytikov sa zrodila schéma fungovania VECRO.
VECRO je skratka pre Verifiable Elliptic Curve Random Oracle, čo v slovenčine znamená overiteľný náhodný oracle na eliptických krivkách.
Všetko sa ukázalo byť celkom jednoduché, na dosiahnutie determinističnosti je potrebné stanoviť hodnotu R pred objavením sa podpisovaného odkazu. Ak je R stanovené a je súčasťou podpisovaného odkazu, čo navyše zaručuje fixáciu R v samotnom podpisovanom odkaze, hodnota S je jednoznačne určená používateľským odkazom a teda môže byť použitá ako zdroj pre pseudonáhodné čísla.
V takejto schéme je jedno, akým spôsobom je R stanovené, to zostáva v zóne zodpovednosti oracla. Dôležité je, že S je jednoznačne určená používateľom, ale jej hodnota je neznáma, kým ju oracle nezverejní. Presne ako sme chceli!
Keď hovoríme o stanovenom R, venujte pozornosť tomu, že Pri podpisovaní rôznych správ jednoznačne odhaľuje skrytý kľúč v schéme EdDSA. Pre vlastníka orákula je mimoriadne dôležité vylúčiť možnosť opätovného použitia R na podpisovanie rôznych správ používateľa. Inými slovami, pri akýchkoľvek manipuláciách alebo sprisahaní orákul vždy riskuje stratu svojho skrytého kľúča.
Celkovo, orákul musí používateľom poskytovať dve funkcie: inicializáciu, ktorá zaznamenáva hodnotu R, a podpis, ktorý vracia hodnotu S. Pri tom pár R, S predstavuje bežne overiteľný podpis používateľskej správy obsahujúcej fixnú hodnotu R a ľubovoľné dáta používateľa.
Môže byť námietka, že táto schéma pre blockchain nie je nič iné ako bežná V podstate, áno, je to ona. Ale sú tu niektoré nuansy. Po prvé, orákul stále pracuje s tým istým kľúčom vo všetkých operáciách, napríklad je to pohodlné na používanie v zmluvách. Po druhé, existuje riziko straty skrytého kľúča orákula pri nesprávnom správaní, napríklad orákul umožňuje robiť vzorky výsledku, potom stačí urobiť iba dve vzorky, aby sa zistil skrytý kľúč a získal sa úplný prístup k peňaženke. Po tretie, nátivne overiteľný v blockchaine podpis, ktorý je zdrojom náhodnosti - to je krásne.
Pol roka sa myšlienka realizácie v hlave objavovala, kým konečne nevznikla motivácia v podobe S veľkým grantom prichádza veľká zodpovednosť, takže projekt má existovať!
Implementácia
Takže v tomto projekte na blockchaine Waves v režime požiadavka-odpoveď pomocou transférov medzi používateľom a orákulom. Pri tom je na účte orákula nainštalovaný skript, ktorý prísne kontroluje prácu v súlade s vyššie popísanou logikou. Transakcie orákula prechádzajú kontrolou s obnovením celej reťaze interakcie s používateľom. Pri kontrole konečnej hodnoty sa zúčastňujú všetky štyri transakcie, smart kontrakt ich nanáša na prísne overovaciu niť, krok za krokom kontrolujúc všetky hodnoty a nezanecháva priestor na akékoľvek manipulácie.
Ešte raz, aby sa to uložilo a bolo jasnejšie. Orákul nepracuje jednoducho podľa navrhnutej schémy. Jeho práca je plne kontrolovaná na úrovni blockchainu. . Krok doľava a transakcia jednoducho neprejde. Takže ak transakcia bola zahrnutá v blockchaine, používateľ nemusí ani nič kontrolovať, za neho to už skontrolovalo stovky uzlov siete.
V súčasnosti je v hlavnej sieti Waves spustený jeden VECRO (môžete spustiť svoj vlastný, nie je to ťažké, stačí ). Aktuálny kód beží na PHP (na , o ktorom ).
Aby ste mohli využiť službu orácle, je potrebné:
- Zafixovať R;
- Poslať minimálne 0.005 Waves na alias orácle init@vecr;
- Získať R-kód v poli priloženia pri transfere 1 R-vecr tokena od orácle používateľovi;
- Získať podpis;
- Poslať minimálne 0.005 Waves na alias orácle random@vecr, a navyše POVINNE uviesť v poli priloženia predtým získaný R-kód a ďalšie používateľské údaje;
- Získať S-kód v poli priloženia pri transfere 1 S-vecr tokena od orácle používateľovi;
- Použiť S-kód ako zdroj pseudonáhodného čísla.
Nuansy aktuálnej implementácie:
- Odoslané orácle Waves sa používajú ako poplatok za spätnú transakciu používateľovi, až do maximálnych 1 Waves;
- R-kód — je to zreťazenie bytu symbolu ‘R’ a 32-bytného hodnoty R v kódovaní base58;
- R-kód v priložení musí byť prvý, používateľské údaje prichádzajú po R-kóde;
- S-kód — je to zreťazenie bytu symbolu ‘S’ a 32-bytného hodnoty S v kódovaní base58;
- S je výsledkom delenia podľa modulu, preto nie je možné použiť S ako plne funkčné 256-bitové pseudonáhodné číslo (toto číslo môže byť považované maximálne za 252-bitové pseudonáhodné číslo);
- Najjednoduchšia varianta — použiť ako pseudonáhodné číslo hash od S-kódu.
Príklad získania S-kódu:
- Inicializácia:
- Získanie R-kódu:
- Žiadosť o výsledok podpisu R-kódu a používateľských údajov ‘random’:
- Získanie S-kódu:
Z technického hľadiska je orácle úplne pripravené na prácu, môžete ho pokojne používať. Z pohľadu bežného používateľa chýba pohodlné grafické rozhranie, na to si budeme musieť počkať.
Rád odpoviem na otázky a prijmem pripomienky, ďakujem.
Zdroj: habr.com
