Random na orakulo batay sa digital signature sa blockchain

Mula sa ideya hanggang sa pagpapatupad: binabago namin ang umiiral na elliptic curve digital signature scheme upang ito ay deterministiko, at batay dito ay nagbibigay kami ng mga function para sa pagkuha ng mga pseudo-random na numero na mabe-verify sa loob ng blockchain.

Random na orakulo batay sa digital signature sa blockchain

Idea

Sa taglagas ng 2018, kasama ang Waves blockchain na-activate ang unang mga smart contract, agad na lumitaw ang tanong tungkol sa posibilidad na makuha pseudorandom na mga numeroPuwede mo pagkatiwalaan.

Naguguluhan sa tanong na ito, sa wakas ay dumating ako sa konklusyon: anumang blockchain ay isang cell; imposibleng makakuha ng pinagkakatiwalaang mapagkukunan ng entropy sa isang saradong sistema.

Ngunit nagustuhan ko pa rin ang isang ideya: kung random na orakulo pipirmahan ang data ng user gamit ang isang deterministikong algorithm, pagkatapos ay palaging mabe-verify ng user ang naturang lagda gamit ang pampublikong key, at makatitiyak na kakaiba ang resultang value. Ang orakulo, gaano man ito kahirap, ay hindi makapagbabago ng anuman; ang algorithm ay gumagawa ng isang hindi malabo na resulta. Mahalaga, itinatala ng user ang resulta, ngunit hindi ito alam hanggang sa mai-publish ito ng orakulo. Ito ay lumalabas na hindi mo mapagkakatiwalaan ang orakulo, ngunit suriin ang resulta ng trabaho nito. Pagkatapos, sa kaso ng matagumpay na pag-verify, ang naturang lagda ay maaaring ituring na isang mapagkukunan ng entropy para sa isang pseudorandom na numero.

Ang Waves blockchain platform ay gumagamit ng signature scheme EdDSA pagpipilian Ed25519. Sa scheme na ito, ang lagda ay binubuo ng mga halaga ng R at S, kung saan ang R ay nakasalalay sa isang random na halaga, at ang S ay kinakalkula batay sa mensaheng nilagdaan, ang pribadong key at ang parehong random na numero bilang R. Lumalabas na walang natatanging pag-asa para sa parehong Mayroong maraming mga wastong lagda para sa isang mensahe ng user.

Malinaw, sa dalisay nitong anyo, ang naturang lagda ay hindi maaaring gamitin bilang pinagmumulan ng mga pseudo-random na numero, dahil hindi ito deterministiko at, samakatuwid, ay madaling manipulahin ng orakulo.

Ngunit, tulad ng nangyari, posible na gawin itong deterministiko.

Malaki ang pag-asa ko na-verify na random function (VRF), ngunit pagkatapos pag-aralan ang hardware, kinailangan kong iwanan ang opsyong ito. Bagama't nag-aalok ang VRF ng deterministikong bersyon ng lagda at patunay nito, may kakaibang lugar sa algorithm na nagbubukas ng black hole para sa pagmamanipula ng orakulo. Lalo na, kapag kinakalkula ang halaga ng k (seksyon 5.1) ang isang pribadong susi ay ginagamit, na nananatiling hindi alam ng gumagamit, na nangangahulugang hindi ma-verify ng gumagamit ang kawastuhan ng pagkalkula ng k, na nangangahulugang ang orakulo ay maaaring gumamit ng anumang halaga ng k na kailangan nito at sa parehong oras ay mapanatili ang isang database ng mga sulat ng k at nilagdaang data upang palaging makalkulang muli ang resulta na tama mula sa punto ng view ng VRF. Kung nakakita ka ng isang guhit batay sa VRF nang hindi inilalantad ang pribadong susi, maaari kang maging matalino: ipahiwatig ang pangangailangan na ibunyag ang susi, o ibukod ito sa pagkalkula ng k, pagkatapos ay awtomatikong ipapakita ang pribadong susi kapag lumitaw ang unang lagda . Sa pangkalahatan, tulad ng nabanggit na, isang kakaibang pamamaraan para sa isang random na orakulo.

Pagkatapos ng kaunting pag-iisip at paghingi ng suporta ng mga lokal na analyst, isinilang ang pamamaraan ng trabaho ng VECRO.

Ang VECRO ay isang pagdadaglat para sa Verifiable Elliptic Curve Random Oracle, na sa Russian ay nangangahulugan ng verifiable random oracle sa elliptic curves.

Ang lahat ay naging simple; upang makamit ang determinismo, kailangan mong ayusin ang halaga ng R bago lumitaw ang mensaheng lalagdaan. Kung ang R ay nakatuon at bahagi ng mensaheng nilalagdaan, na higit na nagsisiguro na ang R ay nakatuon sa mensaheng nilalagdaan, ang halaga ng S ay natatanging tinutukoy ng mensahe ng user at samakatuwid ay maaaring gamitin bilang isang mapagkukunan para sa mga pseudorandom na numero.

Sa gayong pamamaraan, hindi mahalaga kung paano naayos ang R; ito ay nananatiling responsibilidad ng orakulo. Mahalaga na ang S ay natatanging tinutukoy ng gumagamit, ngunit ang halaga nito ay hindi alam hanggang sa mai-publish ito ng orakulo. Lahat ng gusto namin!

Speaking of fixed R, tandaan na ginamit muli ang R kapag pumipirma ng iba't ibang mensahe, kakaibang inilalantad nito ang pribadong susi sa iskema ng EdDSA. Napakahalaga para sa may-ari ng orakulo na alisin ang posibilidad ng muling paggamit ng R upang pumirma sa iba't ibang mensahe ng user. Iyon ay, sa anumang pagmamanipula o pagsasabwatan, ang orakulo ay palaging nanganganib na mawala ang pribadong susi nito.

Sa kabuuan, ang oracle ay dapat magbigay sa mga user ng dalawang function: initialization, na nag-aayos ng value R, at signature, na nagbabalik ng value na S. Sa kasong ito, ang pares na R, S ay ang karaniwang nabe-verify na lagda ng isang mensahe ng user na naglalaman ng fixed halaga R at di-makatwirang data ng user.

Maaari itong mapagtatalunan na ang pamamaraan na ito para sa blockchain ay hindi hihigit sa karaniwan commit-expand scheme. Sa totoo lang, oo, siya iyon. Ngunit mayroong ilang mga nuances. Una, ang orakulo ay palaging gumagana sa parehong susi sa lahat ng mga operasyon, halimbawa, ito ay maginhawang gamitin sa mga kontrata. Pangalawa, may panganib na mawala ng orakulo ang pribadong susi kung ito ay kumikilos nang hindi tama, halimbawa, pinapayagan ka ng orakulo na gumawa ng mga sample ng resulta, kung gayon sapat na na gumawa lamang ng dalawang pagsubok upang malaman ang pribadong susi at makakuha ng buo. access sa wallet. Pangatlo, maganda ang isang lagda na natively verifiable sa blockchain at pinagmumulan ng randomness.

Sa loob ng anim na buwan ang ideya ng pagpapatupad ay kumulo sa aking ulo, hanggang sa wakas ay lumitaw ang pagganyak sa anyo grant mula sa Waves Labs. Sa isang malaking gawad ay may malaking responsibilidad, kaya ang proyekto ay naroroon!

Pagpapatupad

Kaya, sa proyektong ito Ipinatupad ang VECRO sa Waves blockchain sa request-response mode gamit ang mga transaksyon sa paglilipat sa pagitan ng user at ng orakulo. Kasabay nito, ang isang script ay naka-install sa oracle account na kumokontrol sa trabaho nang mahigpit alinsunod sa lohika na inilarawan sa itaas. Ang mga transaksyon sa Oracle ay na-verify at ang buong chain ng pakikipag-ugnayan ng user ay naibalik. Ang lahat ng apat na transaksyon ay kasangkot sa pag-verify ng panghuling halaga; ang matalinong kontrata ay pinagsama-sama ang mga ito sa isang mahigpit na thread ng pag-verify, sinusuri ang lahat ng mga halaga nang hakbang-hakbang at hindi nag-iiwan ng puwang para sa anumang pagmamanipula.

Muli, upang isantabi at gawing mas malinaw. Ang orakulo ay hindi lamang gumagana ayon sa iminungkahing pamamaraan. Ang gawain nito ay ganap na kinokontrol sa antas ng blockchain ng itinatag mahigpit na may isang matalinong kontrata. Hakbang sa kaliwa at ang transaksyon ay hindi mapupunta. Kaya, kung ang isang transaksyon ay kasama sa blockchain, ang gumagamit ay hindi na kailangang suriin ang anuman; daan-daang mga network node ang nasuri na ang lahat para sa kanya.

Sa kasalukuyan, mayroong isang VECRO na tumatakbo sa Waves mainnet (maaari mong patakbuhin ang iyong sarili, hindi ito mahirap, basta tingnan ang halimbawa ng pagsasaayos). Ang kasalukuyang code ay tumatakbo sa PHP (sa WavesKit, tungkol saan sabi ko sayo kanina).

Upang magamit ang serbisyo ng oracle kailangan mong:

  • Ayusin ang R;
    • Magpadala ng hindi bababa sa 0.005 Waves sa oracle alias init@vecr;
    • Tanggapin ang R-code sa attachment field sa paglilipat ng 1 R-vecr token mula sa orakulo patungo sa user;
  • Kumuha ng pirma;
    • Magpadala ng hindi bababa sa 0.005 Waves sa oracle alias random@vecr, at DAPAT ding isaad ang dating natanggap na R-code at karagdagang data ng user sa attachment field;
    • Tanggapin ang S-code sa attachment field sa paglilipat ng 1 S-vecr token mula sa orakulo patungo sa user;
  • Gamitin ang S-code bilang pinagmumulan ng pseudo-random na numero.

Mga Nuances ng kasalukuyang pagpapatupad:

  • Ang mga wave na ipinadala sa orakulo ay ginagamit bilang isang komisyon para sa pagbabalik ng transaksyon sa user, hanggang sa maximum na 1 Waves;
  • Ang R-code ay ang concatenation ng isang byte ng character na 'R' at isang 32-byte na base58-encoded na halaga ng R;
  • Ang R-code sa attachment ay dapat mauna, ang data ng user ay pagkatapos ng R-code;
  • Ang S-code ay ang concatenation ng isang byte ng character na 'S' at isang 32-byte na base58-encoded na halaga ng S;
  • Ang S ay ang resulta ng modulo division, kaya hindi mo magagamit ang S bilang isang buong 256-bit na pseudorandom na numero (ang numerong ito ay maaaring ituring na maximum na 252-bit na pseudorandom na numero);
  • Ang pinakasimpleng opsyon ay ang paggamit ng S-code hash bilang isang pseudo-random na numero.

Halimbawa ng pagtanggap ng S-code:

Mula sa isang teknikal na punto ng view, ang orakulo ay ganap na handa para sa trabaho, maaari mong ligtas na gamitin ito. Mula sa punto ng view ng paggamit ng karaniwang gumagamit, mayroong isang kakulangan ng isang maginhawang graphical na interface; ito ay kailangang maghintay.

Ikalulugod kong sagutin ang mga tanong at tanggapin ang mga komento, salamat.

Pinagmulan: www.habr.com

Magdagdag ng komento