Nasumično proricanje zasnovano na digitalnom potpisu u blockchainu

Od ideje do implementacije: modificiramo postojeću šemu digitalnog potpisa eliptičke krivulje tako da bude deterministička, te na osnovu nje obezbjeđujemo funkcije za dobivanje pseudoslučajnih brojeva provjerljivih unutar blockchaina.

Nasumično proricanje zasnovano na digitalnom potpisu u blockchainu

Ideja

U jesen 2018. uključen je i Waves blockchain prvi pametni ugovori aktivirani, odmah se postavilo pitanje o mogućnosti dobijanja pseudoslučajni brojeviu koje možete vjerovati.

U nedoumici oko ovog pitanja, konačno sam došao do zaključka: svaki blockchain je ćelija; nemoguće je dobiti pouzdan izvor entropije u zatvorenom sistemu.

Ali mi se ipak svidjela jedna ideja: ako random oracle će potpisati korisničke podatke determinističkim algoritmom, tada će korisnik uvijek moći provjeriti takav potpis pomoću javnog ključa i biti siguran da je rezultirajuća vrijednost jedinstvena. Proročanstvo, koliko god da želi, nije u stanju ništa promijeniti; algoritam daje nedvosmislen rezultat. U suštini, korisnik bilježi rezultat, ali ga ne zna dok ga orakul ne objavi. Ispostavilo se da uopće ne možete vjerovati proročištu, već provjerite rezultat njegovog rada. Tada se, u slučaju uspješne verifikacije, takav potpis može smatrati izvorom entropije za pseudoslučajni broj.

Waves blockchain platforma koristi shemu potpisa EdDSA opcija Ed25519. U ovoj shemi, potpis se sastoji od vrijednosti R i S, pri čemu R zavisi od slučajne vrijednosti, a S se izračunava na osnovu poruke koja se potpisuje, privatnog ključa i istog slučajnog broja kao R. Ispada da ne postoji jedinstvena zavisnost za istu. Postoji mnogo validnih potpisa za korisničku poruku.

Očigledno, u svom čistom obliku, takav potpis se ne može koristiti kao izvor pseudoslučajnih brojeva, jer je nedeterministički i stoga njime može lako manipulirati proročište.

Ali, kako se pokazalo, zapravo ga je moguće učiniti determinističkim.

Imao sam velike nade provjerljiva nasumična funkcija (VRF), ali nakon proučavanja hardvera, morao sam napustiti ovu opciju. Iako VRF nudi determinističku verziju potpisa i njegov dokaz, postoji čudno mjesto u algoritmu koje otvara crnu rupu za manipulaciju proročicom. Naime, prilikom izračunavanja vrijednosti k (odjeljak 5.1) koristi se privatni ključ, koji ostaje nepoznat korisniku, što znači da korisnik ne može provjeriti ispravnost izračuna k, što znači da proročište može koristiti bilo koju vrijednost k koja mu je potrebna i istovremeno održavati bazu podataka korespondencija od k i potpisanih podataka kako bi se uvijek mogao ponovo izračunati tačan rezultat sa stanovišta VRF-a. Ako vidite crtež zasnovan na VRF-u bez otkrivanja privatnog ključa, možete biti pametni: naznačite potrebu da ili otkrijete ključ, ili ga isključite iz izračunavanja k, tada će se privatni ključ automatski otkriti kada se pojavi prvi potpis . Općenito, kao što je već spomenuto, čudna shema za slučajni proročište.

Nakon malo razmišljanja i traženja podrške lokalnih analitičara, nastala je VECRO radna shema.

VECRO je skraćenica za Verifiable Elliptic Curve Random Oracle, što na ruskom znači provjerljivo nasumično proročište na eliptičnim krivuljama.

Ispostavilo se da je sve prilično jednostavno; da biste postigli determinizam, morate popraviti vrijednost R prije nego što se pojavi poruka koju treba potpisati. Ako je R urezan i dio je poruke koja se potpisuje, što dalje osigurava da je R urezan u poruci koja se potpisuje, vrijednost S je jedinstveno određena porukom korisnika i stoga se može koristiti kao izvor za pseudoslučajne brojeve.

U takvoj šemi nije važno kako je R fiksiran; ovo ostaje odgovornost proročišta. Važno je da je S jedinstveno određen od strane korisnika, ali njegova vrijednost je nepoznata sve dok ga orakul ne objavi. Sve što smo hteli!

Govoreći o fiksnom R, imajte na umu da ponovo korišten R prilikom potpisivanja različitih poruka, jedinstveno otkriva privatni ključ u EdDSA šemi. Za vlasnika orakula postaje izuzetno važno da eliminiše mogućnost ponovnog korišćenja R za potpisivanje različitih korisničkih poruka. To jest, sa bilo kojom manipulacijom ili dosluhom, proročište će uvijek riskirati da izgubi svoj privatni ključ.

Ukupno, orakul mora korisnicima pružiti dvije funkcije: inicijalizaciju, koja fiksira vrijednost R, i potpis, koji vraća vrijednost S. U ovom slučaju, par R, S je uobičajeni provjerljivi potpis korisničke poruke koja sadrži fiksni vrijednost R i proizvoljnih korisničkih podataka.

Može se tvrditi da ova shema za blockchain nije ništa drugo nego obična shema urezivanje-proširivanje. U suštini, da, to je ona. Ali postoji nekoliko nijansi. Prvo, oracle uvijek radi s istim ključem u svim operacijama, na primjer, ovo je zgodno za korištenje u ugovorima. Drugo, postoji rizik da proročište izgubi privatni ključ ako se ponaša pogrešno, na primjer, oracle vam dozvoljava da napravite uzorke rezultata, tada je dovoljno napraviti samo dva testa da biste saznali privatni ključ i dobili puni pristup novčaniku. Treće, potpis koji je izvorno provjerljiv na blockchainu i izvor je slučajnosti je lijep.

Šest mjeseci ideja o implementaciji tinjala je u mojoj glavi, dok se konačno nije pojavila motivacija u formi grant od Waves Labs. Uz veliki grant dolazi i velika odgovornost, tako da će projekat biti tu!

Реализация

Dakle, u ovom projektu VECRO je implementiran na Waves blockchainu u modusu zahtjev-odgovor koristeći transakcije prijenosa između korisnika i orakula. Istovremeno, na oracle nalog se instalira skripta koja kontroliše rad striktno u skladu sa gore opisanom logikom. Oracle transakcije se verificiraju i cijeli lanac interakcije korisnika se obnavlja. Sve četiri transakcije uključene su u verifikaciju konačne vrijednosti; pametni ugovor ih povezuje strogom verifikacijskom niti, provjeravajući sve vrijednosti korak po korak i ne ostavljajući prostora za bilo kakvu manipulaciju.

Još jednom, da to ostavim po strani i da bude jasnije. Proročište ne radi samo prema predloženoj šemi. Njegov rad je u potpunosti kontroliran na razini blockchaina od strane etabliranih čvrsto sa pametnim ugovorom. Korak ulijevo i transakcija jednostavno neće proći. Dakle, ako je transakcija uključena u blockchain, korisnik čak ni ne mora ništa provjeravati; stotine mrežnih čvorova su već sve provjerile umjesto njega.

Trenutno postoji jedan VECRO koji radi na mreži Waves (možete pokrenuti vlastiti, nije teško, samo pogledajte primjer konfiguracije). Trenutni kod radi u PHP-u (on WavesKit, o čemu Rekao sam ti ranije).

Da biste koristili oracle uslugu morate:

  • Fix R;
    • Pošaljite najmanje 0.005 Waves na oracle alias init@vecr;
    • Primite R-kod u polju za privitak u prijenosu 1 R-vecr tokena od orakula do korisnika;
  • Uzmi potpis;
    • Pošaljite najmanje 0.005 Waves na oracle alias random@vecr, a takođe MORA navesti prethodno primljeni R-kod i dodatne korisničke podatke u polju za prilog;
    • Primite S-kod u polju za privitak u prijenosu 1 S-vecr tokena od orakula do korisnika;
  • Koristite S-kod kao izvor pseudo-slučajnog broja.

Nijanse trenutne implementacije:

  • Waves poslani proročištu se koriste kao provizija za povratnu transakciju korisniku, do maksimalno 1 Waves;
  • R-kod je konkatenacija bajta 'R' karaktera i 32-bajtne R vrijednosti kodirane bazom58;
  • R-kod u prilogu treba biti prvi, korisnički podaci dolaze nakon R-koda;
  • S-kod je konkatenacija bajta znaka 'S' i 32-bajtne bazne58 kodirane vrijednosti S;
  • S je rezultat modulo podjele, tako da ne možete koristiti S kao puni 256-bitni pseudoslučajni broj (ovaj broj se može smatrati maksimalnim 252-bitnim pseudoslučajnim brojem);
  • Najjednostavnija opcija je korištenje heš S-koda kao pseudo-slučajnog broja.

Primjer prijema S-koda:

Sa tehničke tačke gledišta, orakul je potpuno spreman za rad, možete ga sigurno koristiti. Sa stanovišta upotrebe od strane prosječnog korisnika, nedostaje pogodan grafički interfejs, to će morati pričekati.

Rado ću odgovoriti na pitanja i prihvatiti komentare, hvala.

izvor: www.habr.com

Dodajte komentar