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.

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
, dan gambar utama masing-masing:
Jadi, kita mendapatkan matriks
2 x m . Pertama, kita perlu menghitung apa yang disebut tantangan untuk setiap pasangan output:
Kami memulai perhitungan dengan output yang kami habiskan menggunakan kunci publik mereka:
dan angka acak
Hasilnya, kami mendapatkan nilai:
yang kami gunakan untuk menghitung tantangan
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

. Untuk kolom ฯth, kita juga membutuhkannya. Konversi

dalam s:
Tanda tangan itu sendiri adalah tuple dari semua nilai ini:
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

, mengembalikan nilai c
1 , ...,
cm dan memverifikasi itu

. 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:
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:
Komisi komitmen menganggap sedikit berbeda - tanpa topeng:
, 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):
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:
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:
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:
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:
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 ):
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.