Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui

Kami melanjutkan seri kami tentang blockchain Monero, dan artikel hari ini akan fokus pada protokol RingCT (Ring Confidential Transactions), yang memperkenalkan transaksi rahasia dan tanda tangan cincin baru. Sayangnya, hanya ada sedikit informasi di Internet tentang cara kerjanya, dan kami mencoba mengisi kesenjangan ini.

Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui

Kami akan berbicara tentang bagaimana jaringan menyembunyikan jumlah transfer menggunakan protokol ini, mengapa mereka meninggalkan tanda tangan cincin cryptonote klasik, dan bagaimana teknologi ini akan berkembang lebih jauh.

Karena protokol ini adalah salah satu teknologi paling kompleks di Monero, pembaca memerlukan pengetahuan dasar tentang desain blockchain ini dan pengetahuan sekilas tentang kriptografi kurva elips (untuk memoles pengetahuan ini, Anda dapat membaca bab pertama dari kami artikel sebelumnya tentang multitanda tangan).

Protokol RingCT

Salah satu kemungkinan serangan terhadap mata uang cryptonote adalah analisis blockchain berdasarkan pengetahuan tentang jumlah dan waktu transaksi yang dikirim. Hal ini memungkinkan secara signifikan mempersempit area pencarian jalan keluar yang menarik bagi penyerang. Untuk melindungi terhadap analisis tersebut, Monero telah menerapkan protokol transaksi anonim yang sepenuhnya menyembunyikan jumlah transfer di jaringan.

Perlu dicatat bahwa gagasan menyembunyikan jumlah bukanlah hal baru. Pengembang Bitcoin Core Greg Maxwell adalah salah satu orang pertama yang mendeskripsikannya dalam karyanya artikel Transaksi Rahasia. Implementasi RingCT saat ini adalah modifikasinya dengan kemungkinan menggunakan tanda tangan cincin (baik tanpa tanda tangan tersebut), dan itulah asal mula namanya - Transaksi Rahasia Cincin.

Antara lain, protokol membantu menghilangkan masalah dengan pencampuran keluaran debu - keluaran dalam jumlah kecil (biasanya diterima dalam bentuk uang kembalian dari transaksi), yang menimbulkan lebih banyak masalah daripada nilainya.

Pada bulan Januari 2017, terjadi hard fork pada jaringan Monero, yang memungkinkan penggunaan transaksi rahasia secara opsional. Dan sudah pada bulan September tahun yang sama, dengan hard fork versi 6, transaksi semacam itu menjadi satu-satunya yang diperbolehkan di jaringan.

RingCT menggunakan beberapa mekanisme sekaligus: tanda tangan grup anonim spontan tertaut berlapis-lapis (Multilayered Linkable Spontaneous Anonymous Group Signature, selanjutnya disebut MLSAG), skema komitmen (Pedersen Commitments) dan bukti jangkauan (istilah ini tidak memiliki terjemahan yang pasti ke dalam bahasa Rusia) .

Protokol RingCT memperkenalkan dua jenis transaksi anonim: sederhana dan lengkap. Dompet menghasilkan yang pertama ketika suatu transaksi menggunakan lebih dari satu input, yang kedua - dalam situasi sebaliknya. Mereka berbeda dalam validasi jumlah transaksi dan data yang ditandatangani dengan tanda tangan MLSAG (kita akan membicarakannya lebih lanjut di bawah). Selain itu, transaksi bertipe full dapat dihasilkan dengan sejumlah input berapa pun, tidak ada perbedaan mendasar. Di dalam buku "Nol ke Monero" Dalam hal ini, dikatakan bahwa keputusan untuk membatasi transaksi penuh pada satu input dilakukan dengan tergesa-gesa dan dapat berubah di masa mendatang.

tanda tangan MLSAG

Mari kita ingat apa itu input transaksi yang ditandatangani. Setiap transaksi menghabiskan dan menghasilkan sejumlah dana. Penghasilan dana terjadi dengan menciptakan keluaran transaksi (analogi langsungnya adalah tagihan), dan keluaran yang dibelanjakan transaksi tersebut (toh, dalam kehidupan nyata kita membelanjakan uang kertas) menjadi masukan (hati-hati, mudah sekali bingung Di Sini).

Sebuah masukan mereferensikan beberapa keluaran, namun hanya menggunakan satu keluaran, sehingga menciptakan β€œtabir asap” yang menyulitkan analisis riwayat terjemahan. Jika suatu transaksi memiliki lebih dari satu masukan, maka struktur tersebut dapat direpresentasikan sebagai matriks, dimana baris adalah masukan dan kolom adalah keluaran campuran. Untuk membuktikan kepada jaringan bahwa transaksi tersebut menghabiskan keluarannya dengan tepat (mengetahui kunci rahasianya), masukan tersebut ditandatangani dengan tanda tangan cincin. Tanda tangan seperti itu menjamin bahwa penandatangan mengetahui kunci rahasia untuk semua elemen kolom mana pun.

Transaksi rahasia tidak lagi menggunakan transaksi klasik cryptonote tanda tangan cincin, mereka digantikan oleh MLSAG - versi tanda tangan cincin satu lapis serupa yang diadaptasi untuk banyak masukan, LSAG.

Disebut multilayer karena menandatangani beberapa input sekaligus, yang masing-masing dicampur dengan beberapa input lainnya, yaitu sebuah matriks ditandatangani, dan bukan satu baris. Seperti yang akan kita lihat nanti, ini membantu menghemat ukuran tanda tangan.

Mari kita lihat bagaimana tanda tangan cincin terbentuk, dengan menggunakan contoh transaksi yang menghabiskan 2 keluaran nyata dan menggunakan m - 1 keluaran acak dari blockchain untuk pencampuran. Mari kita nyatakan kunci publik dari keluaran yang kita belanjakan sebagai
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui, dan gambar-gambar utama untuknya: Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui Jadi, kita mendapatkan matriks ukuran 2xm. Pertama, kita perlu menghitung apa yang disebut tantangan untuk setiap pasangan keluaran:
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui
Kami memulai penghitungan dengan keluaran, yang kami keluarkan menggunakan kunci publiknya:Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahuidan angka acakTransaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahuiHasilnya, kami mendapatkan nilai berikut:
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui, yang kami gunakan untuk menghitung tantangan
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahuipasangan keluaran berikutnya (untuk memudahkan memahami apa yang kita gantikan di mana, kami telah menyorot nilai-nilai ini dalam warna berbeda). Semua nilai berikut dihitung dalam lingkaran menggunakan rumus yang diberikan pada ilustrasi pertama. Hal terakhir yang harus dihitung adalah tantangan untuk sepasang output riil.

Seperti yang bisa kita lihat, semua kolom kecuali kolom yang berisi keluaran nyata menggunakan angka yang dihasilkan secara acakTransaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui. Untuk Ο€- kolom kita juga membutuhkannya. Mari bertransformasiTransaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahuidi s:Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui
Tanda tangan itu sendiri adalah gabungan dari semua nilai berikut:

Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui

Data ini kemudian ditulis menjadi transaksi.

Seperti yang bisa kita lihat, MLSAG hanya berisi satu tantangan c0, yang memungkinkan Anda menghemat ukuran tanda tangan (yang sudah memerlukan banyak ruang). Selanjutnya, setiap inspektur, menggunakan data tersebutTransaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui, mengembalikan nilai c1,…, cm dan memeriksanyaTransaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui. Dengan demikian, cincin kami ditutup dan tanda tangan telah diverifikasi.

Untuk transaksi RingCT tipe lengkap, baris lain ditambahkan ke matriks dengan keluaran campuran, tetapi kita akan membicarakannya di bawah.

Komitmen Pedersen

Skema kewajiban (istilah bahasa Inggris komitmen lebih sering digunakan) digunakan agar salah satu pihak dapat membuktikan bahwa mereka mengetahui suatu rahasia (angka) tertentu tanpa benar-benar mengungkapkannya. Misalnya, Anda melempar nomor tertentu pada dadu, mempertimbangkan komitmen dan meneruskannya ke pihak yang memverifikasi. Jadi, pada saat nomor rahasia diungkapkan, pemeriksa secara mandiri menghitung komitmennya, sehingga memastikan bahwa Anda tidak menipunya.

Komitmen Monero digunakan untuk menyembunyikan jumlah transfer dan menggunakan opsi paling umum - komitmen Pedersen. Omong-omong, fakta menarik - pada awalnya pengembang mengusulkan untuk menyembunyikan jumlah dengan pencampuran biasa, yaitu menambahkan keluaran untuk jumlah yang sewenang-wenang untuk menimbulkan ketidakpastian, tetapi kemudian mereka beralih ke komitmen (bukan fakta bahwa mereka menghemat ukuran transaksi, seperti yang akan kita lihat di bawah).
Secara umum, komitmen terlihat seperti ini:
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahuiΠ“Π΄Π΅ C β€” arti komitmen itu sendiri, a - jumlah tersembunyi, H adalah titik tetap pada kurva elips (generator tambahan), dan x β€” semacam topeng yang berubah-ubah, faktor persembunyian yang dihasilkan secara acak. Topeng diperlukan di sini agar pihak ketiga tidak bisa begitu saja menebak nilai komitmen.

Ketika keluaran baru dihasilkan, dompet menghitung komitmennya, dan ketika dibelanjakan, dompet tersebut mengambil nilai yang dihitung selama pembuatan atau menghitung ulang, bergantung pada jenis transaksi.

RingCT sederhana

Dalam kasus transaksi RingCT sederhana, untuk memastikan bahwa transaksi tersebut menghasilkan output dalam jumlah yang sama dengan jumlah input (tidak menghasilkan uang begitu saja), diperlukan jumlah komitmen yang pertama dan kedua. yang sama, yaitu:
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui
Komisi komitmen mempertimbangkannya sedikit berbeda - tanpa topeng:
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahuiDimana a β€” jumlah komisi, tersedia untuk umum.

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

Agar lebih jelas, mari kita lihat sebuah contoh. Katakanlah sebuah transaksi menghabiskan dua output (artinya menjadi input) sebesar 10 dan 5 XMR dan menghasilkan tiga output senilai 12 XMR: 3, 4 dan 5 XMR. Pada saat yang sama, dia membayar komisi sebesar 3 XMR. Jadi, jumlah uang yang dibelanjakan ditambah jumlah yang dihasilkan dan komisi sama dengan 15 XMR. Mari kita coba menghitung komitmen dan melihat perbedaan jumlahnya (ingat perhitungannya):

Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui
Di sini kita melihat bahwa agar persamaan tersebut konvergen, kita memerlukan jumlah masker masukan dan keluaran yang sama. Untuk melakukan ini, dompet dibuat secara acak x1, y1, y2 dan y3, dan sisanya x2 menghitung seperti ini:
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui
Dengan menggunakan topeng ini, kami dapat membuktikan kepada verifikator mana pun bahwa kami tidak menghasilkan dana lebih banyak daripada yang kami belanjakan, tanpa mengungkapkan jumlahnya. Asli kan?

DeringCT penuh

Dalam transaksi RingCT penuh, memeriksa jumlah transfer sedikit lebih rumit. Dalam transaksi ini, dompet tidak menghitung ulang komitmen untuk input, namun menggunakan komitmen yang dihitung saat dibuat. Dalam hal ini, kita harus berasumsi bahwa kita tidak lagi mendapatkan selisih jumlah yang sama dengan nol, melainkan:
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui
Di sini z β€” perbedaan antara masker masukan dan keluaran. Jika kita mempertimbangkan zG sebagai kunci publik (yang secara de facto adalah), lalu z adalah kunci pribadi. Jadi, kita mengetahui kunci publik dan kunci privat yang terkait. Dengan data ini di tangan, kita dapat menggunakannya dalam tanda tangan cincin MLSAG bersama dengan kunci publik dari keluaran yang dicampur:
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui
Jadi, tanda tangan cincin yang valid akan memastikan bahwa kita mengetahui semua kunci privat dari salah satu kolom, dan kita hanya dapat mengetahui kunci privat di baris terakhir jika transaksi tersebut tidak menghasilkan lebih banyak dana daripada yang dibelanjakan. Omong-omong, inilah jawaban atas pertanyaan β€œmengapa perbedaan jumlah komitmen tidak menghasilkan nol” - jika zG = 0, lalu kita akan memperluas kolom dengan keluaran nyata.

Bagaimana penerima dana mengetahui berapa jumlah uang yang dikirimkan kepadanya? Semuanya sederhana di sini - pengirim transaksi dan penerima bertukar kunci menggunakan protokol Diffie-Hellman, menggunakan kunci transaksi dan kunci tampilan penerima dan menghitung rahasia bersama. Pengirim menulis data tentang jumlah keluaran, dienkripsi dengan kunci bersama ini, di bidang transaksi khusus.

Bukti jangkauan

Apa yang terjadi jika Anda menggunakan angka negatif sebagai jumlah komitmen? Hal ini dapat menghasilkan koin tambahan! Hasil ini tidak dapat diterima, jadi kami perlu menjamin bahwa jumlah yang kami gunakan tidak negatif (tentu saja tanpa mengungkapkan jumlah tersebut, jika tidak maka akan banyak pekerjaan yang dilakukan dan semuanya sia-sia). Dengan kata lain, kita harus membuktikan bahwa jumlah tersebut berada dalam interval [0, 2n - 1].

Untuk melakukan hal ini, jumlah setiap output dibagi menjadi digit biner dan komitmen dihitung untuk setiap digit secara terpisah. Lebih baik melihat bagaimana hal ini terjadi dengan sebuah contoh.

Mari kita asumsikan bahwa jumlah kita kecil dan masuk ke dalam 4 bit (dalam praktiknya ini adalah 64 bit), dan kita membuat keluaran senilai 5 XMR. Kami menghitung komitmen untuk setiap kategori dan total komitmen untuk keseluruhan jumlah:Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahui
Selanjutnya, setiap komitmen dicampur dengan pengganti (Ci-2iH) dan ditandatangani berpasangan dengan tanda tangan cincin Borromeo (tanda tangan cincin lainnya), diusulkan oleh Greg Maxwell pada tahun 2015 (Anda dapat membaca lebih lanjut tentangnya di sini):
Transaksi rahasia di Monero, atau cara mentransfer sesuatu yang tidak diketahui ke tujuan yang tidak diketahuiSecara keseluruhan, ini disebut bukti kisaran dan memungkinkan Anda memastikan bahwa komitmen menggunakan jumlah dalam kisaran tersebut [0, 2n - 1].

Apa selanjutnya?

Dalam implementasi saat ini, bukti rentang memakan banyak ruang - 6176 byte per output. Hal ini menyebabkan transaksi lebih besar dan karenanya biaya lebih tinggi. Untuk mengurangi ukuran transaksi Monero, pengembang memperkenalkan antipeluru alih-alih tanda tangan Borromeo - sebuah mekanisme bukti jangkauan tanpa komitmen bitwise. Menurut beberapa perkiraan, mereka mampu mengurangi ukuran jangkauan bukti hingga 94%. Ngomong-ngomong, pada pertengahan Juli teknologinya berlalu audit dari Kudelski Security, yang tidak mengungkapkan adanya kekurangan berarti baik pada teknologi itu sendiri maupun pada implementasinya. Teknologi ini sudah digunakan di jaringan pengujian, dan dengan hard fork baru, teknologi tersebut mungkin dapat berpindah ke jaringan utama.

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

Sumber: www.habr.com

Tambah komentar