Blok oracle berdasarkan oracle acak berdasarkan tanda tangan digital

Dari ide hingga implementasi: kami memodifikasi skema tanda tangan digital yang ada pada kurva elips sehingga deterministik, dan kami memberikan pada dasarnya fungsi untuk mendapatkan nomor pseudorandom yang diverifikasi dalam blockchain.



Ide


Pada musim gugur 2018, kontrak pintar pertama diaktifkan di blockchain Waves, segera muncul pertanyaan tentang kemungkinan mendapatkan nomor pseudorandom yang dapat Anda percayai.


Memecahkan masalah ini, saya akhirnya sampai pada kesimpulan: setiap blockchain adalah sel, tidak mungkin untuk mendapatkan sumber entropi tepercaya dalam sistem tertutup.


Tapi saya masih menyukai satu ide: jika oracle acak akan membuat tanda tangan data pengguna sebagai algoritma deterministik, maka pengguna akan selalu dapat memverifikasi tanda tangan tersebut dengan kunci publik, dan akan memastikan bahwa nilai yang diterima unik. Sang oracle, dengan segala keinginannya, tidak memiliki kekuatan untuk mengubah apa pun, algoritma menghasilkan hasil yang jelas. Bahkan, pengguna menangkap hasilnya, tetapi tidak mengetahuinya sampai oracle menerbitkannya. Ternyata Anda tidak bisa mempercayai oracle sama sekali, tetapi periksa hasil kerjanya. Kemudian, dalam kasus verifikasi yang berhasil, tanda tangan tersebut dapat dianggap sebagai sumber entropi untuk nomor pseudo-acak.


Platform blockchain Waves menggunakan skema tanda tangan EdDSA, varian dari Ed25519 . Dalam skema ini, tanda tangan terdiri dari nilai-nilai R dan S, di mana R tergantung pada nilai acak, dan S dihitung berdasarkan pesan yang ditandatangani, kunci pribadi dan nomor acak yang sama dengan R. Ternyata tidak ada ketergantungan satu-ke-satu untuk hal yang sama. Pesan khusus memiliki banyak tanda tangan yang valid.


Jelas, dalam bentuknya yang murni, tanda tangan semacam itu tidak dapat digunakan sebagai sumber angka pseudorandom, karena tidak deterministik dan, oleh karena itu, dapat dengan mudah dikenakan manipulasi oleh oracle.


Tapi, ternyata, menentukan itu sebenarnya mungkin.


Saya memiliki harapan tinggi untuk fungsi acak teruji (VRF) , tetapi setelah mempelajari materi, saya harus menolak opsi ini. Meskipun VRF menawarkan versi tanda tangan dan bukti yang deterministik, algoritme memiliki tempat aneh yang membuka lubang hitam untuk memanipulasi oracle (ini adalah pernyataan yang tidak benar, lihat Pembaruan ). Yaitu, ketika menghitung nilai k ( bagian 5.1 ), kunci pribadi digunakan, yang tetap tidak diketahui pengguna, maka pengguna tidak dapat memverifikasi kebenaran perhitungan k, maka oracle dapat menggunakan nilai k apa saja yang ia butuhkan dan pada saat yang sama memelihara database korespondensi k dan data yang ditandatangani sehingga selalu dapat menghitung ulang hasil yang benar dari sudut pandang VRF. Anda akan melihat undian berbasis VRF tanpa mengungkapkan kunci pribadi, Anda dapat memikirkannya: tunjukkan kebutuhan atau buka kunci tersebut, atau kecualikan dari perhitungan k, maka kunci pribadi akan secara otomatis membuka sendiri ketika tanda tangan pertama muncul. Secara umum, seperti yang telah disebutkan, skema aneh untuk oracle acak.


Dengan sedikit pemikiran dan meminta dukungan analis lokal, alur kerja VECRO lahir.


VECRO adalah singkatan untuk Verifiable Elliptic Curve Random Oracle, yang dalam bahasa Rusia berarti peramalan acak yang diperiksa pada kurva eliptik.


Semuanya ternyata cukup sederhana, untuk mencapai determinisme, perlu untuk memperbaiki nilai R sebelum munculnya pesan yang ditandatangani. Jika R diperbaiki dan merupakan bagian dari pesan yang ditandatangani, yang juga menjamin bahwa R tetap dalam pesan yang ditandatangani itu sendiri, nilai S ditentukan secara unik oleh pesan pengguna dan, oleh karena itu, dapat digunakan sebagai sumber untuk nomor pseudorandom.


Dalam skema seperti itu, tidak masalah bagaimana R diperbaiki, tetap berada dalam tanggung jawab oracle. Penting bahwa S ditentukan secara unik oleh pengguna, tetapi nilainya tidak diketahui sampai oracle menerbitkannya. Semuanya seperti yang kita inginkan!


Berbicara tentang R tetap, perhatikan bahwa R digunakan kembali ketika menandatangani berbagai pesan secara unik mengungkapkan kunci pribadi dalam skema EdDSA. Untuk pemilik oracle, menjadi sangat penting untuk mengecualikan kemungkinan menggunakan kembali R untuk menandatangani pesan pengguna yang berbeda. Artinya, selama manipulasi atau konspirasi oracle akan selalu mengambil risiko kehilangan kunci pribadinya.


Secara total, oracle harus menyediakan dua fungsi kepada pengguna: inisialisasi, yang memperbaiki nilai R, dan tanda tangan, yang mengembalikan nilai S. Selain itu, pasangan R, S adalah tanda tangan reguler terverifikasi dari pesan pengguna yang berisi nilai tetap R dan data pengguna yang berubah-ubah.


Dapat dikatakan bahwa skema ini untuk blockchain tidak lebih dari skema pengungkapan komitmen yang normal. Sebenarnya, ya, itu dia. Namun ada beberapa nuansa. Pertama, oracle selalu bekerja dengan kunci yang sama di semua operasi, misalnya, mudah digunakan dalam kontrak. Kedua, ada risiko kehilangan kunci privat oleh oracle karena perilaku yang tidak benar, misalnya, oracle memungkinkan Anda untuk membuat sampel hasilnya, maka cukup hanya melakukan dua tes untuk mengetahui kunci privat dan mendapatkan akses penuh ke dompet. Ketiga, tanda tangan yang secara asli diverifikasi di blockchain, yang merupakan sumber keacakan, indah.


Selama setengah tahun, ide implementasi ada di kepala saya, sampai akhirnya ada motivasi dalam bentuk hibah dari Waves Labs . Dengan hibah besar, tanggung jawab besar datang, yang berarti proyek itu akan terjadi!


Implementasi


Jadi, dalam proyek ini, VECRO diimplementasikan pada blockchain Waves dalam mode permintaan-respons menggunakan transaksi transfer antara pengguna dan oracle. Pada saat yang sama, skrip diinstal pada akun oracle yang memantau operasi secara ketat sesuai dengan logika yang dijelaskan di atas. Transaksi Oracle diverifikasi untuk memulihkan seluruh rantai interaksi pengguna. Keempat transaksi berpartisipasi dalam verifikasi nilai akhir, kontrak pintar menggantinya ke utas verifikasi ketat, langkah demi langkah memeriksa semua nilai dan tidak meninggalkan ruang untuk manipulasi.


Sekali lagi, ditunda dan diperjelas. Oracle tidak hanya bekerja sesuai dengan skema yang diusulkan. Pekerjaannya sepenuhnya dikendalikan di tingkat blockchain oleh kontrak pintar yang dibangun dengan ketat . Langkah ke kiri, dan transaksi tidak akan berfungsi. Jadi, jika transaksi jatuh ke blockchain, pengguna bahkan tidak perlu memeriksa apa pun, ratusan node jaringan sudah memeriksa semuanya untuknya.


Saat ini, satu VECRO sedang berjalan di jaringan Gelombang utama (Anda dapat menjalankan sendiri, itu tidak sulit, lihat saja contoh konfigurasi ). Kode saat ini bekerja di PHP (di WavesKit , yang saya bicarakan sebelumnya ).


Untuk menggunakan layanan oracle Anda harus:


  • Perbaiki R;
    • Kirim minimum 0,005 Gelombang ke oracle alias init @ vecr;
    • Dapatkan kode-R di bidang lampiran dalam transfer token 1 R-vecr dari oracle ke pengguna;
  • Dapatkan tanda tangan
    • Kirim minimal 0,005 Gelombang ke oracle alias random @ vecr, dan SELALU menentukan kode-R yang diterima sebelumnya dan data pengguna tambahan di bidang lampiran;
    • Dapatkan kode-S di bidang lampiran dalam transfer token 1 S-vecr dari oracle ke pengguna;
  • Gunakan kode-S sebagai sumber angka pseudo-acak.

Nuansa implementasi saat ini:


  • Gelombang yang dikirim ke oracle digunakan sebagai komisi untuk transaksi terbalik kepada pengguna, hingga maksimal 1 Gelombang;
  • R-code adalah gabungan byte dari karakter 'R' dan nilai 32 byte dari R dalam pengkodean base58;
  • R-code dalam lampiran harus menjadi yang pertama, data pengguna datang setelah R-code;
  • S-code adalah gabungan byte dari karakter 'S' dan 32-byte dari nilai S dalam pengkodean base58;
  • S adalah hasil dari pembagian modulo; oleh karena itu, S tidak dapat digunakan sebagai angka pseudo-acak 256-bit penuh (angka ini dapat dianggap sebagai maksimum nomor pseudo-acak 252-bit);
  • Pilihan paling sederhana adalah dengan menggunakan hash dari S-code sebagai nomor pseudo-acak.

Contoh mendapatkan S-code:



Dari sudut pandang teknis, oracle benar-benar siap untuk digunakan, Anda dapat menggunakannya dengan aman. Dari sudut pandang penggunaan oleh pengguna biasa, antarmuka grafis yang nyaman tidak cukup, ini harus menunggu.


Saya akan dengan senang hati menjawab pertanyaan dan menerima komentar, terima kasih.


Pembaruan 8 Mei 2019


Salah tentang VRF. Ya, memang, tanda tangan ECVRF tidak dapat digunakan sebagai sumber nomor pseudo-acak, tetapi tidak digunakan untuk tujuan ini. Dibutuhkan tanda tangan untuk membangun bukti keunikan nilai Gamma ( bagian 5.3 , langkah 6). Tetapi nilai Gamma yang diverifikasi menggunakan tanda tangan sudah berpartisipasi sebagai sumber nomor pseudo-acak ( bagian 5.2 , langkah 5). Terima kasih kepada Oleg Taraskin Crittografo yang telah menunjukkan poin ini, saya mengakui kesalahan saya. ECVRF memiliki hak untuk hidup.


Sayangnya, masih belum ada peluang untuk menggunakan ECVRF di tingkat blockchain Waves, karena kurangnya alat matematika yang diperlukan dalam kontrak pintar.


Ketika fungsi atau dukungan RSA ini tersedia, Anda dapat menulis oracle baru. Adapun skema VECRO, dalam hal apa pun, ia menempati ceruknya sendiri dan memungkinkan Anda untuk bekerja tanpa fungsionalitas tambahan.

Source: https://habr.com/ru/post/id449340/


All Articles