Transaksi rahasia di Monero, atau cara transfernya tidak diketahui di mana tidak diketahui

Kami melanjutkan siklus kami pada perangkat blockchain Monero, dan artikel hari ini akan dikhususkan untuk protokol RingCT (Ring Confidential Transactions), yang menyajikan transaksi rahasia dan tanda tangan dering baru. Sayangnya, ada sedikit informasi di Internet tentang cara kerjanya, dan kami mencoba mengisi celah ini.

gambar

Kami akan berbicara tentang bagaimana jaringan menyembunyikan jumlah transfer menggunakan protokol ini, mengapa kami menolak tanda tangan dering klasik untuk cryptonote dan bagaimana teknologi ini akan berkembang lebih lanjut.

Karena protokol ini adalah salah satu teknologi paling kompleks di Monero, pembaca akan memerlukan pengetahuan dasar tentang perangkat blockchain ini dan pengetahuan superfisial dalam kriptografi pada kurva eliptik (untuk menyegarkan pengetahuan ini, Anda dapat membaca bab-bab pertama dari artikel kami sebelumnya tentang multi-tanda tangan ).

Protokol RingCT


Salah satu kemungkinan serangan terhadap mata uang kriptonote adalah analisis blockchain berdasarkan pengetahuan tentang jumlah dan waktu transaksi yang dikirim. Itu memungkinkan secara signifikan mempersempit pencarian hasil yang menarik bagi penyerang. Untuk melindungi dari analisis semacam itu, Monero memperkenalkan protokol transaksi anonim yang sepenuhnya menyembunyikan jumlah transfer di jaringan.

Perlu dicatat bahwa gagasan untuk menyembunyikan jumlah bukanlah hal baru. Salah satu yang pertama menggambarkannya adalah pengembang Bitcoin Core, Greg Maxwell dalam artikelnya tentang Transaksi Rahasia . Implementasi RingCT saat ini adalah modifikasi dengan kemungkinan menggunakan tanda tangan cincin (tanpa mereka), dan mendapat namanya - Transaksi Rahasia Ring.

Antara lain, protokol membantu untuk menghilangkan masalah dengan mencampur output debu - output dengan jumlah kecil (biasanya diperoleh dalam bentuk perubahan dari transaksi), yang menciptakan lebih banyak masalah daripada biayanya sendiri.

Pada Januari 2017, jaringan hard fork Monero diadakan, memungkinkan penggunaan opsional transaksi rahasia. Dan pada bulan September tahun itu, dengan versi 6 hard fork, transaksi seperti itu menjadi satu-satunya yang diizinkan di jaringan.

RingCT menggunakan beberapa mekanisme sekaligus: multilayered Linkable Spontaneous Anonymous Group Signatures (selanjutnya disebut MLSAG), Komitmen Pedersen, dan bukti jangkauan (istilah ini tidak memiliki terjemahan yang jelas ke dalam bahasa Rusia).

Protokol RingCT memperkenalkan dua jenis transaksi anonim: sederhana dan penuh. Dompet pertama menghasilkan ketika transaksi menggunakan lebih dari satu input, yang kedua - dalam situasi yang berlawanan. Mereka berbeda dalam validasi jumlah transaksi dan data yang ditandatangani oleh tanda tangan MLSAG (kami akan membicarakan lebih lanjut tentang ini di bawah). Selain itu, transaksi tipe penuh dapat dihasilkan dengan sejumlah input, tidak ada perbedaan mendasar. Buku "Zero to Monero" tentang hal ini mengatakan bahwa keputusan untuk membatasi transaksi penuh menjadi satu input dibuat dengan tergesa-gesa dan dapat berubah di masa mendatang.

Tanda tangan MLSAG


Ingat apa input transaksi yang ditandatangani. Setiap transaksi menghabiskan sejumlah uang dan menghasilkan. Dana dihasilkan dengan membuat output transaksi (analogi langsung adalah uang kertas), dan output yang dikeluarkan oleh transaksi (setelah semua, dalam kehidupan nyata kita menghabiskan uang kertas) menjadi input (hati-hati, sangat mudah untuk bingung di sini).

Pintu masuk mengacu pada beberapa pintu keluar, tetapi hanya menghabiskan satu pintu keluar, sehingga menciptakan "layar asap" untuk mempersulit menganalisis sejarah terjemahan. Jika transaksi memiliki lebih dari satu input, maka struktur seperti itu dapat direpresentasikan dalam bentuk matriks, di mana baris adalah input dan kolom adalah output penguliran. Untuk membuktikan kepada jaringan bahwa transaksi mengeluarkan outputnya (tahu kunci rahasianya), input ditandatangani dengan tanda tangan dering. Tanda tangan semacam itu memberi jaminan bahwa penandatangan tahu kunci rahasia dari semua elemen kolom mana pun.

Transaksi rahasia tidak lagi menggunakan tanda tangan cincin cryptonote klasik, mereka telah digantikan oleh MLSAG, versi multi-input dari tanda tangan lapisan tunggal yang serupa, LSAG .

Mereka disebut multi-layered karena mereka menandatangani beberapa input sekaligus, masing-masing dicampur dengan beberapa yang lain, yaitu, sebuah matriks ditandatangani, bukan satu baris. Seperti yang akan kita lihat nanti, ini membantu menghemat ukuran tanda tangan.

Mari kita lihat bagaimana tanda tangan cincin terbentuk, menggunakan contoh transaksi yang menghabiskan 2 output nyata dan menggunakan m - 1 yang acak dari blockchain untuk diremas. Nyatakan kunci publik dari output yang kami habiskan
gambar
, dan gambar utama masing-masing:
gambar
Jadi, kita mendapatkan matriks 2 x m . Pertama, kita perlu menghitung apa yang disebut tantangan untuk setiap pasangan output:
gambar

Kami memulai perhitungan dengan output yang kami habiskan menggunakan kunci publik mereka:
gambar
dan angka acak
gambar
Hasilnya, kami mendapatkan nilai:
gambar
yang kami gunakan untuk menghitung tantangan
gambar
pasangan output berikutnya (untuk membuatnya lebih mudah untuk memahami di mana kami mengganti, kami menyoroti nilai-nilai ini dalam berbagai warna). Semua nilai berikut dihitung dalam lingkaran sesuai dengan rumus yang diberikan dalam ilustrasi pertama. Tantangan untuk sepasang keluaran riil dihitung terakhir.

Seperti yang dapat kita lihat, di semua kolom, kecuali yang berisi output nyata, angka yang dihasilkan secara acak digunakan gambar . Untuk kolom ฯ€th, kita juga membutuhkannya. Konversi gambar dalam s:
gambar

Tanda tangan itu sendiri adalah tuple dari semua nilai ini:

gambar


Selanjutnya, data ini ditulis ke dalam transaksi.

Seperti yang bisa kita lihat, MLSAG hanya berisi satu tantangan c 0 , yang menghemat ukuran tanda tangan (yang sudah membutuhkan banyak ruang). Selanjutnya, setiap reviewer menggunakan data gambar , mengembalikan nilai c 1 , ..., cm dan memverifikasi itu gambar . Dengan demikian, cincin kami ditutup dan tanda tangan melewati verifikasi.

Untuk transaksi RingCT tipe penuh, satu baris lagi ditambahkan ke matriks dengan output campuran, tetapi kita akan membicarakan ini di bawah ini.

Komitmen pedersen


Skema komitmen (sering menggunakan istilah bahasa Inggris - komitmen) digunakan sehingga satu pihak dapat membuktikan bahwa ia mengetahui rahasia tertentu (angka), tanpa benar-benar mengungkapkannya. Misalnya, Anda melemparkan sejumlah angka pada tulang, mempertimbangkan komitmen dan meneruskannya kepada pihak yang mengandalkan. Jadi, pada saat mengungkapkan nomor rahasia, inspektur secara independen mempertimbangkan komitmen, dengan demikian memastikan bahwa Anda tidak menipu dia.

Komitmen Monero digunakan untuk menyembunyikan jumlah transfer dan menggunakan opsi yang paling umum - Komitmen Pedersen. Ngomong-ngomong, fakta yang aneh - pada awalnya, para pengembang menyarankan menyembunyikan jumlah dengan pengocok biasa, yaitu, menambahkan output ke jumlah sewenang-wenang untuk memperkenalkan ketidakpastian, tetapi kemudian beralih ke komitmen (bukan fakta bahwa mereka menghemat ukuran transaksi, seperti yang akan kita lihat di bawah).
Secara umum, komitmen adalah sebagai berikut:
gambar
Di mana C adalah nilai komitmen itu sendiri, a adalah jumlah yang disembunyikan, H adalah titik tetap pada kurva eliptik (generator tambahan), dan x adalah beberapa topeng arbitrer yang menyembunyikan faktor yang dihasilkan secara acak. Topeng diperlukan di sini sehingga pihak ketiga tidak dapat memilih nilai komitmen dengan kekuatan kasar sederhana.

Saat menghasilkan jalan keluar baru, dompet menghitung komitmen untuknya, dan ketika membelanjakannya, ia mengambil nilai yang dihitung selama pembuatan atau menceritakannya kembali, tergantung pada jenis transaksi.

Ringct sederhana


Dalam kasus transaksi RingCT sederhana, untuk menjamin bahwa transaksi menciptakan output yang sama dengan jumlah input (tidak menghasilkan uang dari udara), komitmen yang pertama dan kedua harus sama, yaitu:
gambar

Komisi komitmen menganggap sedikit berbeda - tanpa topeng:
gambar
, di mana jumlah komisi, itu tersedia untuk umum.

Pendekatan ini memungkinkan kami untuk membuktikan kepada pihak yang mengandalkan bahwa kami menggunakan jumlah yang sama tanpa mengungkapkannya.

Untuk membuatnya lebih jelas, mari kita lihat sebuah contoh. Misalkan suatu transaksi menghabiskan dua output (yaitu, mereka menjadi input) pada 10 dan 5 XMR dan menghasilkan tiga output dengan total 12 XMR: 3, 4, dan 5 XMR. Pada saat yang sama membayar komisi 3 XMR. Dengan demikian, jumlah uang yang dihabiskan ditambah jumlah yang dihasilkan dan komisi sama dengan 15 XMR. Mari kita coba menghitung komitmen dan melihat perbedaan dalam jumlah mereka (ingat matematika):

gambar

Di sini kita melihat bahwa persamaan konvergen - jumlah topeng dari input dan output yang kita butuhkan adalah sama. Untuk melakukan ini, dompet menghasilkan secara acak x 1 , y 1 , y 2 dan y 3 , dan sisanya x 2 menghitung dengan cara ini:
gambar

Dengan menggunakan topeng ini, kami dapat membuktikan kepada siapa saja yang memeriksa bahwa kami tidak menghasilkan lebih banyak dana daripada yang kami keluarkan tanpa mengungkapkan jumlahnya. Asli, kan?

RingCT penuh


Dalam transaksi RingCT penuh, memeriksa jumlah transfer agak lebih rumit. Dalam transaksi ini, dompet tidak menghitung komitmen untuk entri, tetapi menggunakan yang dihitung ketika dihasilkan. Dalam hal ini, kita harus mengasumsikan bahwa perbedaan jumlah yang tidak lagi kita dapatkan sama dengan nol, tetapi sebaliknya:
gambar

Di sini z adalah perbedaan antara topeng input dan output. Jika kita menganggap zG sebagai kunci publik (yang merupakan de facto), maka z adalah kunci pribadi. Dengan demikian, kita mengetahui kunci privat publik dan terkait. Memiliki data ini, kita dapat menggunakannya dalam tanda tangan cincin MLSAG bersama dengan kunci publik dari output pengocok:
gambar

Dengan demikian, tanda tangan dering yang valid akan menjamin bahwa kami mengetahui semua kunci privat dari salah satu kolom, dan kami hanya dapat mengetahui kunci privat di baris terakhir jika transaksi tidak menghasilkan lebih banyak dana daripada yang dihabiskan. Ngomong-ngomong, inilah jawaban untuk pertanyaan โ€œmengapa perbedaan dalam jumlah komitmen tidak mengarah ke nolโ€ - jika zG = 0 , maka kita akan membuka kolom dengan output nyata.

Tetapi bagaimana penerima tahu berapa banyak uang yang mereka kirimkan kepadanya? Semuanya sederhana di sini - pengirim transaksi dan kunci pertukaran penerima menggunakan protokol Diffie-Hellman, menggunakan kunci transaksi dan kunci tampilan penerima, dan menghitung rahasia bersama. Pengirim menulis di bidang khusus data transaksi pada jumlah output yang dienkripsi dengan kunci bersama ini.

Bukti jangkauan


Tetapi apa yang terjadi jika Anda menggunakan angka negatif sebagai jumlah dalam komitmen? Ini dapat menghasilkan generasi koin tambahan! Hasil seperti itu tidak dapat diterima, oleh karena itu, kami memerlukan jaminan bahwa jumlah yang kami gunakan tidak negatif (tanpa mengungkapkan jumlah ini, tentu saja, jika tidak, ini adalah pekerjaan yang sangat banyak dan semuanya sia-sia). Dengan kata lain, kita harus membuktikan bahwa penjumlahannya ada dalam interval [0, 2 n - 1] .

Untuk ini, jumlah masing-masing output dibagi menjadi digit biner dan komitmen untuk setiap digit dianggap secara terpisah. Bagaimana ini terjadi, lebih baik untuk mempertimbangkan contoh.

Misalkan kita memiliki jumlah kecil dan pas dalam 4 bit (dalam praktiknya, ini adalah 64 bit), dan kami membuat output untuk jumlah 5 XMR. Kami mempertimbangkan komitmen untuk setiap kategori dan komitmen umum untuk seluruh jumlah:
gambar

Selanjutnya, setiap komitmen dicampur dengan pengganti (C i -2 i H) dan ditandatangani berpasangan oleh tanda tangan cincin Borromeo (tanda tangan cincin lain) yang diusulkan oleh Greg Maxwell pada tahun 2015 (lebih lanjut tentang itu dapat ditemukan di sini ):
gambar
Bersama-sama, ini disebut rentang bukti dan memastikan bahwa komitmen menggunakan jumlah dalam interval [0, 2 n - 1] .

Apa selanjutnya


Dalam implementasi saat ini, bukti jangkauan memakan banyak ruang - 6176 byte per output. Ini mengarah pada transaksi besar dan, karenanya, komisi lebih tinggi. Untuk mengurangi ukuran transaksi Monero, pengembang memperkenalkan bukannya Borromeo tanda tangan antipeluru - mekanisme bukti rentang tanpa komitmen bitwise. Menurut beberapa perkiraan , mereka dapat mengurangi ukuran bukti jangkauan hingga 94%. Ngomong-ngomong, pada pertengahan Juli, teknologi itu diaudit oleh Kudelski Security, yang tidak mengungkapkan kekurangan signifikan dalam teknologi itu sendiri atau dalam implementasinya. Teknologi ini sudah digunakan di jaringan uji, dan dengan garpu keras baru, mungkin dapat pindah ke jaringan utama.

Ajukan pertanyaan Anda, sarankan topik untuk artikel baru tentang teknologi cryptocurrency, dan berlangganan grup kami di Facebook untuk mengikuti perkembangan acara dan publikasi kami.

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


All Articles