Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui

Kami meneruskan siri kami tentang blockchain Monero, dan artikel hari ini akan menumpukan pada protokol RingCT (Ring Confidential Transactions), yang memperkenalkan transaksi sulit dan tandatangan cincin baharu. Malangnya, terdapat sedikit maklumat di Internet tentang cara ia berfungsi, dan kami cuba mengisi jurang ini.

Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui

Kami akan bercakap tentang cara rangkaian menyembunyikan jumlah pemindahan menggunakan protokol ini, mengapa mereka meninggalkan tandatangan cincin cryptonote klasik, dan bagaimana teknologi ini akan berkembang lebih jauh.

Memandangkan protokol ini merupakan salah satu teknologi yang paling kompleks dalam Monero, pembaca memerlukan pengetahuan asas tentang reka bentuk blok ini dan pengetahuan lulus kriptografi lengkung eliptik (untuk menyempurnakan pengetahuan ini, anda boleh membaca bab pertama kami artikel sebelumnya tentang tandatangan berbilang).

Protokol RingCT

Salah satu kemungkinan serangan terhadap mata wang cryptonote ialah analisis blockchain berdasarkan pengetahuan tentang jumlah dan masa transaksi yang dihantar. Ini membenarkan menyempitkan dengan ketara kawasan carian untuk keluar yang menarik kepada penyerang. Untuk melindungi daripada analisis sedemikian, Monero telah melaksanakan protokol transaksi tanpa nama yang menyembunyikan sepenuhnya jumlah pemindahan pada rangkaian.

Perlu diingat bahawa idea menyembunyikan jumlah bukanlah perkara baru. Pemaju Bitcoin Core Greg Maxwell adalah salah seorang yang pertama menerangkannya dalam bukunya artikel Urus Niaga Sulit. Pelaksanaan semasa RingCT ialah pengubahsuaiannya dengan kemungkinan menggunakan tandatangan cincin (sama ada tanpa mereka), dan itulah cara ia mendapat namanya - Transaksi Sulit Cincin.

Antara lain, protokol membantu menghilangkan masalah dengan mencampurkan output habuk - output dalam jumlah yang kecil (biasanya diterima dalam bentuk perubahan daripada urus niaga), yang menimbulkan lebih banyak masalah daripada yang sepatutnya.

Pada Januari 2017, rangkaian Monero telah berlaku, membenarkan penggunaan pilihan transaksi sulit. Dan sudah pada bulan September tahun yang sama, dengan garpu keras versi 6, transaksi sedemikian menjadi satu-satunya yang dibenarkan di rangkaian.

RingCT menggunakan beberapa mekanisme serentak: tandatangan kumpulan tanpa nama spontan berbilang lapisan (Tandatangan Kumpulan Tanpa Nama Spontan Boleh Dipaut Berbilang Lapisan, selepas ini dirujuk sebagai MLSAG), skim komitmen (Komitmen Pedersen) dan bukti julat (istilah ini tidak mempunyai terjemahan yang mantap ke dalam bahasa Rusia) .

Protokol RingCT memperkenalkan dua jenis transaksi tanpa nama: mudah dan penuh. Dompet menjana yang pertama apabila transaksi menggunakan lebih daripada satu input, yang kedua - dalam situasi yang bertentangan. Mereka berbeza dalam pengesahan jumlah transaksi dan data yang ditandatangani dengan tandatangan MLSAG (kita akan bercakap lebih lanjut mengenai perkara ini di bawah). Selain itu, urus niaga jenis penuh boleh dijana dengan sebarang bilangan input, tiada perbezaan asas. Dalam buku "Sifar kepada Monero" Dalam hal ini, dikatakan bahawa keputusan untuk mengehadkan urus niaga penuh kepada satu input dibuat secara tergesa-gesa dan mungkin berubah pada masa hadapan.

Tandatangan MLSAG

Mari kita ingat apakah input transaksi yang ditandatangani. Setiap transaksi membelanjakan dan menjana beberapa dana. Dana dijana dengan mencipta output transaksi (analogi langsung ialah wang kertas), dan output yang dibelanjakan oleh transaksi (lagipun, dalam kehidupan sebenar kita membelanjakan wang kertas) menjadi input (berhati-hati, sangat mudah untuk dikelirukan di sini) .

Input merujuk berbilang output, tetapi membelanjakan hanya satu, dengan itu mencipta "skrin asap" untuk menyukarkan menganalisis sejarah terjemahan. Jika transaksi mempunyai lebih daripada satu input, maka struktur sedemikian boleh diwakili sebagai matriks, di mana baris adalah input dan lajur adalah output bercampur. Untuk membuktikan kepada rangkaian bahawa transaksi membelanjakan dengan tepat outputnya (mengetahui kunci rahsia mereka), input ditandatangani dengan tandatangan cincin. Tandatangan sedemikian menjamin bahawa penandatangan mengetahui kunci rahsia untuk semua elemen mana-mana lajur.

Urus niaga sulit tidak lagi menggunakan transaksi klasik cryptonote tandatangan cincin, ia telah digantikan oleh MLSAG - versi tandatangan cincin satu lapisan serupa yang disesuaikan untuk berbilang input, LSAG.

Mereka dipanggil multilayer kerana mereka menandatangani beberapa input sekaligus, setiap satunya bercampur dengan beberapa yang lain, iaitu matriks ditandatangani, dan bukan satu baris. Seperti yang akan kita lihat nanti, ini membantu menjimatkan saiz tandatangan.

Mari kita lihat bagaimana tandatangan cincin terbentuk, menggunakan contoh transaksi yang membelanjakan 2 output sebenar dan menggunakan m - 1 yang rawak daripada blockchain untuk pencampuran. Mari kita nyatakan kunci awam bagi output yang kita belanjakan sebagai
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui, dan imej utama untuk mereka dengan sewajarnya: Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui Oleh itu, kita mendapat matriks saiz 2 x m. Pertama, kita perlu mengira apa yang dipanggil cabaran untuk setiap pasangan output:
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui
Kami memulakan pengiraan dengan output, yang kami belanjakan menggunakan kunci awam mereka:Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahuidan nombor rawakTransaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahuiAkibatnya, kami mendapat nilai berikut:
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui, yang kami gunakan untuk mengira cabaran
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahuisepasang output seterusnya (untuk memudahkan untuk memahami apa yang kita gantikan di mana, kami telah menyerlahkan nilai ini dalam warna yang berbeza). Semua nilai berikut dikira dalam bulatan menggunakan formula yang diberikan dalam ilustrasi pertama. Perkara terakhir untuk dikira ialah cabaran untuk sepasang output sebenar.

Seperti yang kita dapat lihat, semua lajur kecuali yang mengandungi output sebenar menggunakan nombor yang dijana secara rawakTransaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui. Untuk Ο€- lajur kami juga memerlukannya. Jom tukarTransaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahuidalam s:Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui
Tandatangan itu sendiri adalah tuple dari semua nilai ini:

Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui

Data ini kemudiannya ditulis ke dalam transaksi.

Seperti yang kita dapat lihat, MLSAG mengandungi hanya satu cabaran c0, yang membolehkan anda menjimatkan saiz tandatangan (yang sudah memerlukan banyak ruang). Selanjutnya, mana-mana pemeriksa, menggunakan dataTransaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui, memulihkan nilai c1,…, cm dan semak ituTransaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui. Oleh itu, cincin kami ditutup dan tandatangan telah disahkan.

Untuk transaksi RingCT jenis penuh, satu lagi baris ditambahkan pada matriks dengan keluaran bercampur, tetapi kita akan membincangkan perkara ini di bawah.

Komitmen Pedersen

Skim kewajipan (istilah Inggeris komitmen lebih kerap digunakan) digunakan supaya satu pihak dapat membuktikan bahawa mereka mengetahui sesuatu rahsia (nombor) tanpa mendedahkannya sebenarnya. Sebagai contoh, anda membaling nombor tertentu pada dadu, pertimbangkan komitmen dan menyerahkannya kepada pihak yang mengesahkan. Oleh itu, pada masa mendedahkan nombor rahsia, pengesah secara bebas mengira komitmen, dengan itu memastikan bahawa anda tidak menipunya.

Komitmen Monero digunakan untuk menyembunyikan jumlah pemindahan dan menggunakan pilihan yang paling biasa - komitmen Pedersen. By the way, fakta yang menarik - pada mulanya pemaju mencadangkan menyembunyikan jumlah dengan pencampuran biasa, iaitu, menambah output untuk jumlah sewenang-wenangnya untuk memperkenalkan ketidakpastian, tetapi kemudian mereka beralih kepada komitmen (ia bukan fakta bahawa mereka menjimatkan saiz transaksi, seperti yang akan kita lihat di bawah).
Secara umum, komitmen kelihatan seperti ini:
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahuiΠ“Π΄Π΅ C - maksud komitmen itu sendiri, a - jumlah tersembunyi, H ialah titik tetap pada lengkung elips (penjana tambahan), dan x β€” sejenis topeng sewenang-wenangnya, faktor persembunyian yang dijana secara rawak. Topeng diperlukan di sini supaya pihak ketiga tidak boleh meneka nilai komitmen.

Apabila output baharu dijana, dompet mengira komitmen untuknya dan apabila dibelanjakan, ia mengambil sama ada nilai yang dikira semasa penjanaan atau mengiranya semula, bergantung pada jenis transaksi.

RingCT mudah

Dalam kes urus niaga RingCT yang mudah, untuk memastikan bahawa urus niaga itu menghasilkan output dalam jumlah yang sama dengan jumlah input (tidak menghasilkan wang secara tiba-tiba), adalah perlu bahawa jumlah komitmen pertama dan kedua yang sama, iaitu:
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui
Komisen komitmen menganggapnya sedikit berbeza - tanpa topeng:
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahuiJika a β€” jumlah komisen, ia tersedia untuk umum.

Pendekatan ini membolehkan kami membuktikan kepada pihak yang bergantung bahawa kami menggunakan jumlah yang sama tanpa mendedahkannya.

Untuk membuat perkara lebih jelas, mari kita lihat contoh. Katakan transaksi membelanjakan dua output (bermaksud ia menjadi input) sebanyak 10 dan 5 XMR dan menjana tiga output bernilai 12 XMR: 3, 4 dan 5 XMR. Pada masa yang sama, dia membayar komisen sebanyak 3 XMR. Oleh itu, jumlah wang yang dibelanjakan ditambah jumlah yang dijana dan komisen adalah sama dengan 15 XMR. Mari cuba kira komitmen dan lihat perbezaan dalam jumlahnya (ingat matematik):

Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui
Di sini kita melihat bahawa untuk persamaan menumpu, kita memerlukan jumlah topeng input dan output adalah sama. Untuk melakukan ini, dompet menjana secara rawak x1, y1, y2 dan y3, dan selebihnya x2 mengira seperti ini:
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui
Menggunakan topeng ini, kami boleh membuktikan kepada mana-mana pengesah bahawa kami tidak menjana lebih banyak dana daripada yang kami belanjakan, tanpa mendedahkan jumlahnya. Asli, kan?

RingCT penuh

Dalam urus niaga RingCT penuh, menyemak jumlah pindahan adalah sedikit lebih rumit. Dalam urus niaga ini, dompet tidak mengira semula komitmen untuk input, tetapi menggunakan yang dikira apabila ia dijana. Dalam kes ini, kita mesti menganggap bahawa kita tidak lagi akan mendapat perbezaan dalam jumlah yang sama dengan sifar, tetapi sebaliknya:
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui
ia adalah z β€” perbezaan antara topeng input dan output. Jika kita pertimbangkan zG sebagai kunci awam (yang secara de facto adalah), maka z ialah kunci peribadi. Oleh itu, kami mengetahui kunci awam dan kunci peribadi yang sepadan. Dengan data ini di tangan, kami boleh menggunakannya dalam tandatangan cincin MLSAG bersama-sama dengan kunci awam output yang dicampur:
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui
Oleh itu, tandatangan cincin yang sah akan memastikan bahawa kami mengetahui semua kunci peribadi salah satu lajur, dan kami hanya boleh mengetahui kunci peribadi dalam baris terakhir jika transaksi tidak menjana lebih banyak dana daripada yang dibelanjakan. Ngomong-ngomong, berikut ialah jawapan kepada soalan "mengapa perbezaan dalam jumlah komitmen tidak membawa kepada sifar" - jika zG = 0, maka kami akan mengembangkan lajur dengan output sebenar.

Bagaimanakah penerima dana mengetahui jumlah wang yang dihantar kepadanya? Segala-galanya mudah di sini - pengirim urus niaga dan kunci pertukaran penerima menggunakan protokol Diffie-Hellman, menggunakan kunci transaksi dan kunci paparan penerima dan mengira rahsia yang dikongsi. Pengirim menulis data tentang jumlah output, disulitkan dengan kunci kongsi ini, dalam medan khas transaksi.

Bukti julat

Apakah yang berlaku jika anda menggunakan nombor negatif sebagai jumlah dalam komitmen? Ini boleh membawa kepada penjanaan syiling tambahan! Keputusan ini tidak boleh diterima, jadi kami perlu menjamin bahawa jumlah yang kami gunakan tidak negatif (tanpa mendedahkan jumlah ini, sudah tentu, jika tidak, terdapat banyak kerja dan semuanya sia-sia). Dalam erti kata lain, kita mesti membuktikan bahawa jumlah adalah dalam selang [0, 2n - 1].

Untuk melakukan ini, jumlah setiap output dibahagikan kepada digit binari dan komitmen dikira untuk setiap digit secara berasingan. Adalah lebih baik untuk melihat bagaimana ini berlaku dengan contoh.

Mari kita anggap bahawa jumlah kita adalah kecil dan sesuai dengan 4 bit (dalam amalan ini adalah 64 bit), dan kita mencipta output bernilai 5 XMR. Kami mengira komitmen untuk setiap kategori dan jumlah komitmen untuk keseluruhan jumlah:Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahui
Seterusnya, setiap komitmen dicampurkan dengan pengganti (Ci-2iH) dan ditandatangani secara berpasangan dengan tandatangan cincin Borromeo (tandatangan cincin lain), yang dicadangkan oleh Greg Maxwell pada 2015 (anda boleh membaca lebih lanjut mengenainya di sini):
Transaksi sulit dalam Monero, atau cara memindahkan perkara yang tidak diketahui ke destinasi yang tidak diketahuiSecara keseluruhan, ini dipanggil julat bukti dan membolehkan anda memastikan bahawa komitmen menggunakan jumlah dalam julat [0, 2n - 1].

Apa seterusnya?

Dalam pelaksanaan semasa, bukti julat mengambil banyak ruang - 6176 bait setiap output. Ini membawa kepada transaksi yang lebih besar dan oleh itu bayaran yang lebih tinggi. Untuk mengurangkan saiz urus niaga Monero, pembangun memperkenalkan kalis peluru dan bukannya tandatangan Borromeo - mekanisme kalis pelbagai tanpa komitmen bitwise. Mengikut beberapa anggaran, mereka mampu mengurangkan saiz julat kalis sehingga 94%. By the way, pada pertengahan Julai teknologi berlalu audit daripada Kudelski Security, yang tidak mendedahkan sebarang kelemahan ketara sama ada dalam teknologi itu sendiri atau dalam pelaksanaannya. Teknologi ini telah digunakan dalam rangkaian ujian, dan dengan garpu keras baharu, ia mungkin boleh bergerak ke rangkaian utama.

Tanya soalan anda, cadangkan topik untuk artikel baharu tentang teknologi dalam bidang mata wang kripto, dan juga melanggan kumpulan kami di Facebookuntuk mengikuti perkembangan acara dan penerbitan kami.

Sumber: www.habr.com

Tambah komen