Oracle acak berdasarkan tanda tangan digital di blockchain

Dari ide hingga implementasi: kami memodifikasi skema tanda tangan digital kurva elips yang ada sehingga bersifat deterministik, dan berdasarkan skema tersebut kami menyediakan fungsi untuk mendapatkan nomor pseudo-acak yang dapat diverifikasi dalam blockchain.

Oracle acak berdasarkan tanda tangan digital di blockchain

Ide

Pada musim gugur 2018, blockchain Waves disertakan kontrak pintar pertama diaktifkan, pertanyaan segera muncul tentang kemungkinan memperolehnya angka pseudorandomyang dapat Anda percayai.

Bingung dengan pertanyaan ini, saya akhirnya sampai pada kesimpulan: blockchain apa pun adalah sel; tidak mungkin mendapatkan sumber entropi yang tepercaya dalam sistem tertutup.

Tapi saya masih menyukai satu ide: jika ramalan acak akan menandatangani data pengguna dengan algoritma deterministik, maka pengguna akan selalu dapat memverifikasi tanda tangan tersebut menggunakan kunci publik, dan akan yakin bahwa nilai yang dihasilkan adalah unik. Oracle, tidak peduli seberapa keras keinginannya, tidak dapat mengubah apa pun; algoritme memberikan hasil yang jelas. Pada dasarnya, pengguna mencatat hasilnya, tetapi tidak mengetahuinya sampai oracle mempublikasikannya. Ternyata Anda tidak bisa mempercayai oracle sama sekali, tapi periksa hasil kerjanya. Kemudian, jika verifikasi berhasil, tanda tangan tersebut dapat dianggap sebagai sumber entropi untuk nomor pseudorandom.

Platform blockchain Waves menggunakan skema tanda tangan EdDSA pilihan Ed25519. Dalam skema ini tanda tangan terdiri dari nilai R dan S, dimana R bergantung pada nilai acak, dan S dihitung berdasarkan pesan yang ditandatangani, kunci privat dan nomor acak yang sama dengan R. Ternyata tidak ada ketergantungan unik untuk hal yang sama. Ada banyak tanda tangan yang valid untuk pesan pengguna.

Jelasnya, dalam bentuknya yang murni, tanda tangan seperti itu tidak dapat digunakan sebagai sumber bilangan acak semu, karena bersifat non-deterministik dan, oleh karena itu, dapat dengan mudah dimanipulasi oleh oracle.

Namun, ternyata, hal tersebut sebenarnya bisa dibuat deterministik.

Aku punya harapan besar untuk itu fungsi acak yang dapat diverifikasi (VRF), tetapi setelah mempelajari perangkat kerasnya, saya harus mengabaikan opsi ini. Meskipun VRF menawarkan versi deterministik dari tanda tangan dan pembuktiannya, ada tempat aneh dalam algoritma yang membuka lubang hitam untuk manipulasi oracle. Yaitu pada saat menghitung nilai k (bagian 5.1) kunci pribadi digunakan, yang tetap tidak diketahui oleh pengguna, yang berarti pengguna tidak dapat memverifikasi kebenaran perhitungan k, yang berarti oracle dapat menggunakan nilai k apa pun yang diperlukan dan pada saat yang sama memelihara database korespondensi dari k dan data yang ditandatangani agar selalu dapat menghitung ulang hasil yang benar dari sudut pandang VRF. Jika Anda melihat gambar berdasarkan VRF tanpa mengungkapkan kunci pribadi, Anda bisa menjadi pintar: tunjukkan kebutuhan untuk mengungkapkan kunci, atau mengecualikannya dari perhitungan k, maka kunci pribadi akan secara otomatis terungkap ketika tanda tangan pertama muncul . Secara umum, seperti yang telah disebutkan, skema aneh untuk oracle acak.

Setelah sedikit berpikir dan mendapatkan dukungan dari analis lokal, lahirlah skema kerja VECRO.

VECRO adalah singkatan dari Verified Elliptic Curve Random Oracle, yang dalam bahasa Rusia berarti oracle acak yang dapat diverifikasi pada kurva elips.

Semuanya ternyata cukup sederhana, untuk mencapai determinisme, Anda perlu menetapkan nilai R sebelum pesan yang ditandatangani muncul. Jika R dikomit dan merupakan bagian dari pesan yang ditandatangani, yang selanjutnya memastikan bahwa R dikomit dalam pesan yang ditandatangani, nilai S secara unik ditentukan oleh pesan pengguna dan oleh karena itu dapat digunakan sebagai sumber nomor pseudorandom.

Dalam skema seperti itu, tidak masalah bagaimana R ditetapkan; ini tetap menjadi tanggung jawab oracle. Penting agar S ditentukan secara unik oleh pengguna, namun nilainya tidak diketahui sampai oracle menerbitkannya. Semua yang kami inginkan!

Berbicara tentang R tetap, perhatikan itu digunakan kembali R saat menandatangani berbagai pesan, ini secara unik mengungkapkan kunci pribadi dalam skema EdDSA. Menjadi sangat penting bagi pemilik oracle untuk menghilangkan kemungkinan menggunakan kembali R untuk menandatangani pesan pengguna yang berbeda. Artinya, dengan manipulasi atau kolusi apa pun, oracle akan selalu berisiko kehilangan kunci privatnya.

Secara total, Oracle harus menyediakan dua fungsi kepada pengguna: inisialisasi, yang menetapkan nilai R, dan tanda tangan, yang mengembalikan nilai S. Dalam hal ini, pasangan R, S adalah tanda tangan biasa yang dapat diverifikasi dari pesan pengguna yang berisi pesan tetap. nilai R dan data pengguna sewenang-wenang.

Dapat dikatakan bahwa skema blockchain ini tidak lebih dari hal biasa skema komit-perluasan. Pada dasarnya, ya, itu dia. Namun ada beberapa nuansa. Pertama, oracle selalu bekerja dengan kunci yang sama di semua operasi, misalnya, ini mudah digunakan dalam kontrak. Kedua, ada risiko oracle kehilangan kunci privat jika berperilaku tidak benar, misalnya oracle mengizinkan Anda membuat sampel hasilnya, maka cukup melakukan dua tes saja untuk mengetahui kunci privat dan mendapatkan hasil penuh. akses ke dompet. Ketiga, tanda tangan yang dapat diverifikasi secara asli di blockchain dan merupakan sumber keacakan adalah hal yang indah.

Selama enam bulan ide implementasi membara di kepala saya, hingga akhirnya motivasi muncul dalam bentuk hibah dari Waves Labs. Dengan hibah yang besar, datang pula tanggung jawab yang besar, sehingga proyek akan tetap ada!

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, sebuah skrip diinstal pada akun Oracle yang mengontrol pekerjaan secara ketat sesuai dengan logika yang dijelaskan di atas. Transaksi Oracle diverifikasi dan seluruh rantai interaksi pengguna dipulihkan. Keempat transaksi terlibat dalam verifikasi nilai akhir; kontrak pintar menyatukannya dengan rangkaian verifikasi yang ketat, memeriksa semua nilai langkah demi langkah dan tidak memberikan ruang untuk manipulasi apa pun.

Sekali lagi, untuk mengesampingkannya dan membuatnya lebih jelas. Oracle tidak hanya bekerja sesuai skema yang diusulkan. Pekerjaannya sepenuhnya dikendalikan di tingkat blockchain oleh pihak yang sudah mapan erat dengan kontrak pintar. Melangkah ke kiri dan transaksi tidak akan berhasil. Jadi, jika suatu transaksi disertakan dalam blockchain, pengguna bahkan tidak perlu memeriksa apa pun; ratusan node jaringan telah memeriksa semuanya untuknya.

Saat ini sudah ada satu VECRO yang berjalan di mainnet Waves (bisa dijalankan sendiri, tidak sulit, cukup lihat contoh konfigurasi). Kode saat ini berjalan di PHP (on GelombangKit, tentang yang mana Aku sudah bilang padamu sebelumnya).

Untuk menggunakan layanan Oracle Anda harus:

  • Perbaiki R;
    • Kirim setidaknya 0.005 Gelombang ke oracle alias init@vecr;
    • Menerima kode R di bidang lampiran dalam transfer 1 token R-vecr dari Oracle ke pengguna;
  • Dapatkan tanda tangan;
    • Kirim setidaknya 0.005 Gelombang ke oracle alias random@vecr, dan juga HARUS menunjukkan kode R yang diterima sebelumnya dan data pengguna tambahan di bidang lampiran;
    • Menerima kode S di bidang lampiran dalam transfer 1 token S-vecr dari oracle ke pengguna;
  • Gunakan kode S sebagai sumber bilangan pseudo-acak.

Nuansa implementasi saat ini:

  • Wave yang dikirim ke oracle digunakan sebagai komisi atas transaksi pengembalian ke pengguna, maksimal 1 Wave;
  • Kode-R adalah rangkaian satu byte karakter 'R' dan nilai R yang dikodekan base32 58-byte;
  • Kode-R dalam lampiran harus menjadi yang pertama, data pengguna muncul setelah kode-R;
  • Kode-S adalah rangkaian satu byte karakter 'S' dan nilai S yang dikodekan base32 58-byte;
  • S adalah hasil pembagian modulo, jadi Anda tidak dapat menggunakan S sebagai bilangan pseudorandom 256-bit penuh (angka ini dapat dianggap sebagai bilangan pseudorandom maksimum 252-bit);
  • Opsi paling sederhana adalah menggunakan hash kode S sebagai nomor acak semu.

Contoh penerimaan kode S:

Dari sudut pandang teknis, oracle benar-benar siap digunakan, Anda dapat menggunakannya dengan aman. Dari sudut pandang penggunaan oleh rata-rata pengguna, terdapat kekurangan dalam antarmuka grafis yang nyaman; hal ini harus menunggu.

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

Sumber: www.habr.com

Tambah komentar