Oracle rawak berdasarkan tandatangan digital dalam blockchain

Daripada idea kepada pelaksanaan: kami mengubah suai skema tandatangan digital lengkung eliptik sedia ada supaya ia bersifat deterministik, dan berdasarkannya kami menyediakan fungsi untuk mendapatkan nombor rawak pseudo yang boleh disahkan dalam rantaian blok.

Oracle rawak berdasarkan tandatangan digital dalam blockchain

Idea

Pada musim luruh 2018, blockchain Waves disertakan kontrak pintar pertama diaktifkan, persoalan segera timbul tentang kemungkinan mendapatkan nombor pseudorandomyang boleh anda percayai.

Membingungkan soalan ini, akhirnya saya membuat kesimpulan: mana-mana blokchain adalah sel; adalah mustahil untuk mendapatkan sumber entropi yang dipercayai dalam sistem tertutup.

Tetapi saya masih menyukai satu idea: jika oracle rawak akan menandatangani data pengguna dengan algoritma deterministik, maka pengguna akan sentiasa dapat mengesahkan tandatangan sedemikian menggunakan kunci awam, dan akan memastikan bahawa nilai yang terhasil adalah unik. Oracle, tidak kira betapa sukarnya, tidak dapat mengubah apa-apa; algoritma menghasilkan hasil yang tidak jelas. Pada asasnya, pengguna merekodkan hasilnya, tetapi tidak mengetahuinya sehingga oracle menerbitkannya. Ternyata anda tidak boleh mempercayai oracle sama sekali, tetapi semak hasil kerjanya. Kemudian, sekiranya pengesahan berjaya, tandatangan sedemikian boleh dianggap sebagai sumber entropi untuk nombor pseudorandom.

Platform blockchain Waves menggunakan skema tandatangan EdDSA pilihan Ed25519. Dalam skema ini, tandatangan terdiri daripada nilai R dan S, di mana R bergantung pada nilai rawak, dan S dikira berdasarkan mesej yang ditandatangani, kunci persendirian dan nombor rawak yang sama seperti R. Ternyata itu tiada pergantungan unik untuk yang sama Terdapat banyak tandatangan yang sah untuk mesej pengguna.

Jelas sekali, dalam bentuk tulennya, tandatangan seperti itu tidak boleh digunakan sebagai sumber nombor rawak pseudo, kerana ia bukan deterministik dan, oleh itu, boleh dimanipulasi dengan mudah oleh oracle.

Tetapi, ternyata, sebenarnya mungkin untuk menjadikannya deterministik.

Saya mempunyai harapan yang besar untuk fungsi rawak boleh disahkan (VRF), tetapi selepas mengkaji perkakasan, saya terpaksa meninggalkan pilihan ini. Walaupun VRF menawarkan versi deterministik tandatangan dan buktinya, terdapat tempat aneh dalam algoritma yang membuka lubang hitam untuk manipulasi oracle. Iaitu, apabila mengira nilai k (bahagian 5.1) kunci persendirian digunakan, yang masih tidak diketahui oleh pengguna, yang bermaksud pengguna tidak dapat mengesahkan ketepatan pengiraan k, yang bermaksud oracle boleh menggunakan sebarang nilai k yang diperlukan dan pada masa yang sama mengekalkan pangkalan data surat-menyurat daripada k dan data yang ditandatangani agar sentiasa dapat mengira semula keputusan yang betul dari sudut pandangan VRF . Jika anda melihat lukisan berdasarkan VRF tanpa mendedahkan kunci peribadi, anda boleh menjadi bijak: nyatakan keperluan untuk sama ada mendedahkan kunci, atau mengecualikannya daripada pengiraan k, maka kunci peribadi akan secara automatik didedahkan apabila tandatangan pertama muncul . Secara umum, seperti yang telah disebutkan, skema pelik untuk oracle rawak.

Selepas berfikir sedikit dan mendapatkan sokongan penganalisis tempatan, skim kerja VECRO telah lahir.

VECRO ialah singkatan untuk Oracle Rawak Lengkung Eliptik Boleh Diverifikasi, yang dalam bahasa Rusia bermaksud orakel rawak boleh disahkan pada lengkung eliptik.

Segala-galanya ternyata agak mudah; untuk mencapai determinisme, anda perlu menetapkan nilai R sebelum mesej yang akan ditandatangani muncul. Jika R komited dan merupakan sebahagian daripada mesej yang ditandatangani, yang seterusnya memastikan bahawa R komited dalam mesej yang ditandatangani, nilai S ditentukan secara unik oleh mesej pengguna dan oleh itu boleh digunakan sebagai sumber untuk nombor pseudorandom.

Dalam skema sedemikian, tidak kira bagaimana R ditetapkan; ini tetap menjadi tanggungjawab oracle. Adalah penting bahawa S ditentukan secara unik oleh pengguna, tetapi nilainya tidak diketahui sehingga oracle menerbitkannya. Semua yang kami mahukan!

Bercakap tentang R tetap, ambil perhatian bahawa digunakan semula R apabila menandatangani pelbagai mesej, ia secara unik mendedahkan kunci peribadi dalam skim EdDSA. Ia menjadi sangat penting bagi pemilik oracle untuk menghapuskan kemungkinan menggunakan semula R untuk menandatangani mesej pengguna yang berbeza. Iaitu, dengan sebarang manipulasi atau pakatan sulit, oracle akan sentiasa berisiko kehilangan kunci peribadinya.

Secara keseluruhan, oracle mesti menyediakan pengguna dengan dua fungsi: permulaan, yang membetulkan nilai R, dan tandatangan, yang mengembalikan nilai S. Dalam kes ini, pasangan R, S ialah tandatangan biasa yang boleh disahkan bagi mesej pengguna yang mengandungi tetapan. nilai R dan data pengguna sewenang-wenangnya.

Ia boleh dikatakan bahawa skim untuk blockchain ini tidak lebih daripada biasa skim commit-expand. Pada asasnya, ya, ia adalah dia. Tetapi terdapat beberapa nuansa. Pertama, oracle sentiasa berfungsi dengan kunci yang sama dalam semua operasi, contohnya, ini mudah digunakan dalam kontrak. Kedua, terdapat risiko oracle kehilangan kunci persendirian jika ia berkelakuan tidak betul, sebagai contoh, oracle membolehkan anda membuat sampel hasilnya, maka cukup untuk membuat dua ujian sahaja untuk mengetahui kunci persendirian dan mendapatkan penuh akses kepada dompet. Ketiga, tandatangan yang boleh disahkan secara asli pada blockchain dan merupakan sumber rawak adalah cantik.

Selama enam bulan idea pelaksanaan itu membara di kepala saya, sehingga akhirnya motivasi muncul dalam bentuk geran daripada Waves Labs. Dengan geran yang besar datang tanggungjawab yang besar, yang bermaksud projek itu akan ada!

РСализация

Jadi, dalam projek ini VECRO telah dilaksanakan pada blockchain Waves dalam mod permintaan-tindak balas menggunakan transaksi pemindahan antara pengguna dan oracle. Pada masa yang sama, skrip dipasang pada akaun oracle yang mengawal kerja dengan ketat mengikut logik yang diterangkan di atas. Urus niaga Oracle disahkan dan keseluruhan rantaian interaksi pengguna dipulihkan. Keempat-empat transaksi terlibat dalam mengesahkan nilai akhir; kontrak pintar merangkainya bersama-sama dengan urutan pengesahan yang ketat, menyemak semua nilai langkah demi langkah dan tidak memberi ruang untuk sebarang manipulasi.

Sekali lagi, untuk mengetepikan dan menjadikannya lebih jelas. Oracle tidak hanya berfungsi mengikut skema yang dicadangkan. Kerjanya dikawal sepenuhnya di peringkat blockchain oleh pihak yang ditubuhkan ketat dengan kontrak pintar. Langkah ke kiri dan transaksi tidak akan berjaya. Jadi, jika transaksi dimasukkan dalam rantaian blok, pengguna tidak perlu menyemak apa-apa; beratus-ratus nod rangkaian telah menyemak segala-galanya untuknya.

Pada masa ini, terdapat satu VECRO yang berjalan pada mainnet Waves (anda boleh menjalankan sendiri, ia tidak sukar, cuma lihat contoh konfigurasi). Kod semasa berjalan dalam PHP (pada WavesKit, tentang yang mana Saya dah cakap tadi).

Untuk menggunakan perkhidmatan oracle, anda mesti:

  • Betulkan R;
    • Hantar sekurang-kurangnya 0.005 Gelombang ke oracle alias init@vecr;
    • Terima kod R dalam medan lampiran dalam pemindahan 1 token R-vecr daripada oracle kepada pengguna;
  • Dapatkan tandatangan;
    • Hantar sekurang-kurangnya 0.005 Waves ke oracle alias rawak@vecr, dan juga MESTI menunjukkan kod-R yang diterima sebelum ini dan data pengguna tambahan dalam medan lampiran;
    • Terima kod S dalam medan lampiran dalam pemindahan 1 token S-vecr dari oracle kepada pengguna;
  • Gunakan kod S sebagai sumber nombor rawak pseudo.

Nuansa pelaksanaan semasa:

  • Gelombang yang dihantar ke oracle digunakan sebagai komisen untuk transaksi pemulangan kepada pengguna, sehingga maksimum 1 Gelombang;
  • R-code ialah gabungan bait aksara 'R' dan nilai R berkod base32 58 bait;
  • R-code dalam lampiran hendaklah yang pertama, data pengguna datang selepas R-code;
  • S-code ialah gabungan bait aksara 'S' dan nilai 32 bait base58 yang dikodkan bagi S;
  • S ialah hasil pembahagian modulo, jadi anda tidak boleh menggunakan S sebagai nombor pseudorandom 256-bit penuh (nombor ini boleh dianggap sebagai nombor pseudorandom maksimum 252-bit);
  • Pilihan paling mudah ialah menggunakan cincangan S-code sebagai nombor rawak pseudo.

Contoh menerima kod S:

Dari sudut pandangan teknikal, oracle benar-benar bersedia untuk bekerja, anda boleh menggunakannya dengan selamat. Dari sudut pandangan penggunaan oleh pengguna biasa, terdapat kekurangan antara muka grafik yang mudah; ini perlu menunggu.

Saya dengan senang hati akan menjawab soalan dan menerima komen, terima kasih.

Sumber: www.habr.com

Tambah komen