Dari ide hingga implementasi: memodifikasi skema tanda tangan kurva eliptik yang ada untuk menjadi deterministik dan menyediakan fungsi di atasnya untuk mendapatkan yang dapat diverifikasi dalam nomor pseudorandom blockchain.

Ide
Pada musim gugur tahun 2018, ketika kontrak pintar pertama diaktifkan pada blockchain Waves, topik mendapatkan nomor pseudorandom dengan cara yang dipercaya muncul secara alami.
Memikirkan hal itu, saya sampai pada kesimpulan bahwa setiap blockchain adalah semacam sangkar, dan mendapatkan sumber entropi tepercaya dalam sistem tertutup adalah mustahil.
Namun, saya menyukai satu ide. Jika oracle acak menandatangani data pengguna dengan algoritma deterministik, pengguna akan selalu dapat memverifikasi tanda tangan tersebut dengan kunci publik untuk memastikan bahwa nilai yang diperoleh unik. Oracle tidak akan dapat membuat perubahan apa pun karena algoritme muncul dengan hasil bernilai tunggal. Pada dasarnya, pengguna memperbaiki hasilnya tetapi tidak mengetahuinya sampai diterbitkan oleh oracle. Jadi, Anda mungkin tidak mempercayai oracle sama sekali, tetapi masih dapat memverifikasi hasil operasinya. Kemudian, jika verifikasi berhasil, tanda tangan tersebut dapat menjadi sumber entropi untuk nomor pseudorandom.
Pada blockchain Waves, skema tanda tangan EdDSA varian Ed25519 digunakan. Dalam skema itu, tanda tangan terdiri dari nilai R dan S. R tergantung pada nilai acak dan S dihitung berdasarkan pesan yang ditandatangani, kunci pribadi dan nomor acak yang sama dengan R. Tidak ada ketergantungan yang unik, dan beberapa tanda tangan yang valid ada untuk pesan pengguna yang sama.
Rupanya, tanda tangan semacam ini dengan sendirinya tidak dapat digunakan sebagai sumber nomor pseudorandom karena tidak dapat ditentukan dan, oleh karena itu, dapat dengan mudah dimanipulasi oleh oracle.
Namun, ternyata, sebenarnya mungkin untuk membuatnya deterministik.
Harapan besar saya ditetapkan untuk fungsi acak yang dapat diverifikasi (VRF) , tetapi, setelah mempelajari secara spesifik, saya harus menolak opsi itu. Meskipun VRF menawarkan versi penentu tanda tangan dan buktinya, algoritme ini memiliki tempat aneh yang membuka lubang hitam untuk manipulasi oleh oracle (pernyataan ini salah, lihat Pembaruan ). Khususnya, untuk menghitung nilai k ( bagian 5.1 ), kunci pribadi digunakan, yang tetap tidak diketahui pengguna, sehingga pengguna tidak dapat memverifikasi kebenaran penghitungan k. Akibatnya, oracle dapat menggunakan nilai k apa saja yang diperlukan dan secara bersamaan menjalankan database untuk korelasi antara k dan data yang ditandatangani untuk dapat selalu menghitung ulang hasil yang benar untuk VRF. Jika Anda melihat undian berbasis VRF tanpa mengungkapkan kunci privat, Anda dapat memamerkan dan menunjukkan perlunya mengungkapkan kunci atau menghapusnya dari penghitungan k sehingga secara otomatis akan muncul setelah tanda tangan pertama. Secara keseluruhan, seperti dikatakan di atas, ini adalah skema aneh untuk ramalan acak.
Setelah beberapa refleksi dan dengan dukungan dari analis lokal, skema untuk operasi VECRO lahir.
VECRO adalah singkatan dari Verifable Elliptic Curve Random Oracle. Ternyata agak sederhana. Untuk mencapai determinasi, kita perlu memperbaiki nilai R sebelum tampilan pesan ditandatangani. Jika R diperbaiki dan R adalah bagian dari pesan, yang juga menjamin bahwa R sudah diperbaiki sebelum pesan. Nilai S sepenuhnya ditentukan oleh pesan pengguna dan, oleh karena itu, dapat digunakan sebagai sumber nomor pseudorandom.
Dalam skema semacam ini, bagaimana tepatnya R diperbaiki tidak relevan dan tetap berada di zona tanggung jawab oracle. Yang penting adalah bahwa S sepenuhnya ditentukan oleh pengguna, tetapi nilainya tidak diungkapkan sampai diterbitkan oleh oracle. Inilah yang kami inginkan!
Berbicara tentang memperbaiki R, perhatikan bahwa penggunaan ulang R untuk menandatangani berbagai pesan sepenuhnya mengungkapkan kunci pribadi dalam skema EdDSA. Untuk pemilik oracle, penting untuk mengecualikan penggunaan ulang R untuk menandatangani berbagai pesan pengguna. Yaitu, dalam manipulasi atau kolusi, oracle akan selalu berisiko kehilangan kunci privasinya.
Jadi, oracle akan menawarkan dua fungsi kepada pengguna: inisialisasi, yang memperbaiki nilai R dan tanda tangan, yang mengembalikan nilai S. Sementara itu, pasangan R, S adalah tanda tangan reguler yang dapat diverifikasi untuk pesan pengguna yang berisi suatu fix. nilai R dan data acak pengguna.
Orang dapat berargumen bahwa untuk blockchain, ini hanyalah skema pengungkapan komit biasa. Pada dasarnya, begitulah adanya. Namun ada beberapa nuansa. Pertama, oracle menggunakan kunci yang sama dalam semua transaksi, yang, misalnya, nyaman untuk kontrak. Kedua, ada risiko kehilangan kunci pribadi oleh oracle karena kinerja yang salah. Misalnya, jika oracle memfasilitasi pengujian hasil, hanya dua tes yang cukup untuk mengetahui kunci pribadi dan mendapatkan akses ke dompet. Ketiga, tanda tangan asli yang diverifikasi di blockchain, yang merupakan sumber keacakan, hanya indah.
Selama sekitar enam bulan, ide ini mulai berkembang, hingga motivasi untuk mengimplementasikannya tiba dalam bentuk hibah dari Waves Labs . Dengan hibah besar datang tanggung jawab besar, itu berarti proyek menjadi!
Implementasi
VECRO diimplementasikan pada blockchain Waves dalam mode permintaan / balasan menggunakan transaksi transfer antara pengguna dan oracle. Pada akun oracle, skrip ditetapkan yang mengontrol operasi secara ketat sesuai dengan logika yang dijelaskan di atas. Transaksi oracle diverifikasi oleh rekreasi dari seluruh rantai interaksi pengguna. Keempat transaksi terlibat dalam memverifikasi nilai akhir. Kontrak pintar menambahkan semuanya ke utas verifikasi ketat, memeriksa nilai langkah demi langkah dan tidak meninggalkan ruang untuk manipulasi.
Mari kita coba sederhanakan. Oracle tidak hanya bekerja di bawah skema yang diusulkan. Pengoperasiannya dikendalikan sepenuhnya di tingkat blockchain oleh kontrak pintar yang ketat . Pengalihan kecil apa pun akan menyebabkan penolakan transaksi. Jadi, jika transaksi ada di blockchain, pengguna tidak perlu memverifikasi apa pun, karena semua verifikasi telah dilakukan oleh ratusan node blockchain.
Saat ini, satu VECRO dapat dioperasikan di mainnet Waves. Anda benar-benar dapat meluncurkan milik Anda: sederhana, lihat saja contoh konfigurasi . Kode saat ini berfungsi pada PHP (pada WavesKit , yang saya bahas sebelumnya ).
Untuk menggunakan oracle, Anda perlu:
- Perbaiki R
- Kirim minimum 0,005 GELOMBANG ke alias init @ vecr oracle;
- Menerima kode-R di bidang lampiran dalam transfer token 1 R-vecr dari oracle ke pengguna;
- Dapatkan tanda tangan;
- Kirim minimal 0,005 GELOMBANG ke alias acak @ vecr oracle. Anda juga DIPERLUKAN untuk memasukkan dalam bidang lampiran kode-R yang diterima dan data pengguna tambahan;
- Menerima kode-S di bidang lampiran dalam transfer token 1 S-vecr dari oracle ke pengguna;
- Gunakan kode-S sebagai sumber nomor pseudorandom.
Nuansa implementasi saat ini:
- GELOMBANG yang dikirim ke oracle digunakan sebagai biaya untuk transaksi pengembalian kepada pengguna, hingga maksimal 1 GELOMBANG;
- R-code adalah gabungan dari byte simbol 'R' dan nilai 32 byte R dalam pengkodean base58;
- Kode-R dalam lampiran harus mendahului data pengguna;
- S-code adalah gabungan byte simbol 'S' dan nilai S 32 byte dalam pengkodean base58;
- S adalah hasil dari pembagian modulo dan tidak dapat digunakan sebagai nomor pseudorandom 256 bit yang tepat (ini dapat dianggap sebagai nomor pseudorandom 252 bit paling banyak);
- Opsi termudah adalah penggunaan hash S-code sebagai sumber untuk nomor pseudorandom.
Contoh menerima kode-S:
Dari sudut pandang teknis, oracle sepenuhnya operasional, Anda dapat menggunakannya dengan aman. Dari sudut pandang pengguna biasa, tidak ada cukup GUI yang ramah pengguna, yang harus menunggu.
Saya akan dengan senang hati menjawab pertanyaan dan menerima komentar, terima kasih.
Pembaruan (8 Mei 2019)
Saya salah pada VRF. Ya, memang benar bahwa tanda tangan ECVRF tidak dapat digunakan sebagai sumber nomor pseudorandom, tetapi tidak digunakan untuk tujuan ini. Tanda tangan diperlukan untuk membuktikan keunikan nilai Gamma ( bagian 5.3 , langkah 6). Dan nilai Gamma yang terverifikasi akan digunakan sebagai sumber nomor pseudorandom ( bagian 5.2 , langkah 5). Terima kasih kepada Oleg Taraskin Crittografo karena menunjuk pada saat ini, saya mengakui kesalahan saya. ECVRF memiliki hak penuh untuk hidup.
Sayangnya, masih belum ada kemungkinan untuk menggunakan ECVRF di tingkat blockchain Waves, karena kurangnya fungsi matematika yang diperlukan dalam kontrak pintar.
Ketika fungsi atau dukungan RSA ini akan tersedia, oracle baru dapat dibuat. Adapun skema VECRO, itu menempati ceruknya dalam hal apa pun dan memungkinkan Anda untuk bekerja tanpa fungsionalitas tambahan.