De la idee la realizare: modificăm schema existentă de semnătură digitală pe curbă eliptică pentru a o face deterministă și oferim pe baza acesteia funcții de generare a numerelor pseudo-aleatorii verificate în cadrul blockchain-ului.

Ideea
În toamna anului 2018, în blockchain-ul Waves au fost , imediat a apărut întrebarea privind posibilitatea de a obține , în care poți avea încredere.
Reflectând asupra acestei întrebări, am ajuns la concluzia că orice blockchain este o celulă, obținerea unei surse de entropie de încredere într-un sistem închis este imposibilă.
Dar mi-a plăcut totuși o idee: dacă va semna datele utilizatorului cu un algoritm determinist, atunci utilizatorul va putea verifica întotdeauna această semnătură cu cheia publică și va fi sigur că valoarea obținută este unică. Oracolul, indiferent de intenție, nu poate schimba nimic, algoritmul oferă un rezultat unic. Practic, utilizatorul fixează rezultatul, dar nu îl cunoaște până când oracolul nu îl publică. Așadar, se poate concluziona că nu trebuie să avem încredere în oracol, ci să verificăm rezultatul muncii sale. Astfel, în cazul unui eșec de verificare, această semnătură poate fi considerată o sursă de entropie pentru un număr pseudo-aleator.
În platforma blockchain Waves este utilizată schema de semnătură o variantă . În această schemă, semnătura constă din valorile R și S, unde R depinde de o valoare aleatoare, iar S este calculată pe baza mesajului semnat, a cheii private și a aceleași valori aleatoare ca R. Rezultă că nu există o dependență unică, pentru același mesaj utilizator există multe semnături valide.
Este evident că, în forma sa pură, această semnătură nu poate fi utilizată ca sursă de numere pseudo-aleatorii, deoarece este nedeterminată și, prin urmare, poate fi ușor subjectă manipulărilor din partea oracolului.
Dar, după cum s-a dovedit, este într-adevăr posibil să o facem deterministă.
Am avut mari speranțe în , dar, după ce am studiat detaliile, am renunțat la această variantă. Deși VRF oferă o variantă deterministă de semnare și dovada acesteia, algoritmul are o porțiune ciudată, care creează o oportunitate pentru manipularea oracolului. Adică, în calculul valorii k () se utilizează cheia privată, care rămâne necunoscută utilizatorului, ceea ce înseamnă că utilizatorul nu poate verifica corectitudinea calculului lui k, astfel că oracolul poate folosi orice valoare k necesară și să mențină în același timp o bază de date a corespondențelor dintre k și datele semnate, pentru a putea recompensa întotdeauna un resultat corect din perspectiva VRF. Dacă vedeți un joc bazat pe VRF fără a dezvălui cheia privată, puteți argumenta: fie este nevoie să se dezvăluie cheia, fie să se excludă din calculul lui k, atunci cheia privată se va dezvălui automat la prima semnătură. În general, așa cum s-a spus deja, este un sistem ciudat pentru un oracol aleator.
După ce am reflectat puțin și am obținut sprijin din partea analiștilor locali, a apărut schema de funcționare a VECRO.
VECRO este un acronim pentru Verifiable Elliptic Curve Random Oracle, care în română înseamnă oracol aleator verificabil pe curbe eliptice.
Totul s-a dovedit a fi destul de simplu, pentru a obține determinismul este necesar să se fixeze valoarea R înainte de apariția mesajului semnat. Dacă R este fixat și face parte din mesajul semnat, ceea ce garantează în plus fixarea lui R în însuși mesajul semnat, valoarea S este determinată în mod univoc de mesajul utilizatorului și, din urmare, poate fi utilizată ca sursă pentru numere pseudo-aleatorii.
Într-o astfel de schemă, nu contează cum este fixat R, aceasta rămâne în responsabilitatea oracolului. Important este că S este determinat în mod univoc de utilizator, dar valoarea sa rămâne necunoscută până când oracolul o publică. Totul așa cum ne doream!
Vorbind despre R fixat, rețineți că Semnătura diferitelor mesaje dezvăluie fără echivoc cheia privată în schema EdDSA. Pentru proprietarul oracolului, devine extrem de important să se excludă posibilitatea reutilizării lui R pentru semnarea diferitelor mesaje ale utilizatorului. Cu alte cuvinte, în orice manipulare sau conspirație, oracolul va risca mereu pierderea cheii sale private.
Prin urmare, oracolul trebuie să ofere utilizatorilor două funcții: inițializarea, care fixează valoarea R, și semnătura, care returnează valoarea S. Astfel, perechea R, S este o semnătură verificabilă obișnuită a mesajului utilizatorului care conține valoarea R fixată și date ale utilizatorului.
Se poate susține că această schemă pentru blockchain nu este altceva decât o simplă . În esență, da, aceasta este. Dar există câteva nuanțe. În primul rând, oracolul lucrează întotdeauna cu aceeași cheie în toate operațiunile, ceea ce este convenabil în contracte. În al doilea rând, există riscul pierderii cheii private de către oracol în cazul unui comportament incorect; de exemplu, oracolul permite prelevarea rezultatelor, astfel încât este suficient să se facă doar două prelevări pentru a afla cheia privată și a obține acces complet la portofel. În al treilea rând, o semnătură nativ verificabilă în blockchain, care este sursa de aleatoriu – este una frumoasă.
Ideea implementării a fost hrănită timp de șase luni, până când, în cele din urmă, a apărut motivația sub forma unei . Cu o subvenție mare vine o mare responsabilitate, așa că proiectul trebuie să existe!
Implementarea
Așadar, în acest proiect, pe blockchain-ul Waves în modul cerere-răspuns folosind tranzacții de transfer între utilizator și oracol. În acest sens, pe contul oracolului este instalat un script care controlează activitatea în strictă conformitate cu logica descrisă mai sus. Tranzacțiile oracolului sunt verificate prin refacerea întregului lanț de interacțiune cu utilizatorul. Verificarea valorii finale implică toate cele patru tranzacții; contractul inteligent le combină pe un fir de verificare strict, verificând pas cu pas toate valorile și fără a lăsa loc pentru orice manipulări.
Încă o dată, pentru a rămâne evident și a fi mai clar. Oracolul nu lucrează doar conform schemei propuse. Activitatea sa este complet controlată la nivelul blockchain-ului de un set stabilit. . O mic pas în lateral, și tranzacția pur și simplu nu va trece. Așa că, dacă tranzacția a ajuns în blockchain, utilizatorul nu trebuie să verifice nimic, a fost deja verificată de sute de noduri din rețea.
În prezent, pe rețeaua principală Waves a fost lansat un VECRO (puteți lansa propriul, nu este dificil, doar ). Codul actual funcționează pe PHP (pe , despre care ).
Pentru a folosi serviciul de oracle, este necesar:
- Să fixați R;
- Să trimiteți minimum 0.005 Waves către aliasul oracle init@vecr;
- Să primiți R-code în câmpul attachment în transferul a 1 R-vecr token de la oracle către utilizator;
- Să obțineți semnătura;
- Să trimiteți minimum 0.005 Waves la aliasul oracle random@vecr și, de asemenea, este OBLIGATORIU să specificați în câmpul attachment R-code obținut anterior și datele suplimentare ale utilizatorului;
- Să primiți S-code în câmpul attachment în transferul a 1 S-vecr token de la oracle către utilizator;
- Să folosiți S-code ca sursă de număr pseudo-aleator.
Nuantele implementării actuale:
- Waves trimise oracle-ului sunt utilizate ca taxă pentru tranzacția de returnare către utilizator, până la maximum 1 Waves;
- R-code este concatenarea byte-ului simbolului ‘R’ și a valorii R de 32 bytes în codare base58;
- R-code în attachment trebuie să fie primul, datele utilizatorului vin după R-code;
- S-code este concatenarea byte-ului simbolului ‘S’ și a valorii S de 32 bytes în codare base58;
- S este rezultatul împărțirii modulo, așa că nu se poate folosi S ca un număr pseudo-aleator de 256-bits (acest număr poate fi considerat maximum 252-bits pseudo-aleator);
- Cea mai simplă variantă este să folosiți hash-ul de la S-code ca număr pseudo-aleator.
Exemplu de obținere a S-code:
- Inițializare:
- Obținerea R-code:
- Cererea rezultatului semnăturii R-code și a datelor utilizatorilor “random”:
- Obținerea S-code:
Din punct de vedere tehnic, oracle-ul este complet pregătit de funcționare, îl puteți folosi cu încredere. Din perspectiva utilizatorului obișnuit, lipsește o interfață grafică convenabilă, acest lucru va trebui să aștepte.
Voi fi bucuros să răspund la întrebări și să primesc comentarii, mulțumesc.
Sursa: habr.com
