Bukti / argumen tanpa pengetahuan adalah teknologi kriptografi yang muncul yang menjanjikan untuk membawa kita lebih dekat ke Holy Grail dari blockchain: memberikan privasi data dan kemampuan audit.
Aplikasi potensial untuk pengetahuan nol meliputi, tetapi tidak terbatas pada:
Aplikasi lain untuk bukti tanpa pengetahuan adalah membantu
skala blockchains. ZKP memungkinkan untuk "mengompresi" perhitungan untuk transaksi blockchain tanpa mengorbankan keamanan.
Pada artikel ini, kami menjelaskan bagaimana zero-knowledge (khususnya, Bulletproofs ) dapat diterapkan untuk membangun layanan yang berfokus pada privasi menggunakan platform Exonum Bitfury.
Analisis situasi
Dimungkinkan untuk mencapai
beberapa tingkat privasi data di aplikasi blockchain menggunakan pendekatan "taman bertembok", di mana data disembunyikan karena aksesnya dibatasi dengan bantuan firewall, kontrol akses berbasis peran,
parit dan langkah-langkah keamanan perimeter lainnya. . Data sensitif dalam blockchain dapat dienkripsi (mungkin, dengan skema enkripsi kunci publik, dengan kunci publik yang relevan dikelola oleh blockchain yang sama) dan / atau disimpan di luar blockchain (dalam hal ini, blockchain hanya menyimpan sidik jari hash dari data). Pendekatan ini digunakan dalam banyak kerangka kerja buku besar yang dibolehkan.
Namun, kelemahan dari pendekatan "taman bertembok" menjadi semakin jelas. Terus terang, pendekatan ini bertentangan dengan salah satu nilai jual utama blockchain - kemampuan audit. Jika data pada blockchain tidak dapat diaudit dengan berkonsultasi dengan logika kontrak pintar, blockchain menjadi layanan
timestamping tertaut yang dimuliakan. Fakta bahwa ada beberapa data di blockchain tidak lagi berarti bahwa data ini valid sesuai aturan kontrak pintar. Kerugian utama kedua dari pendekatan taman bertembok adalah bahwa ia tidak berskala. CTO R3 Richard Brown, misalnya, dengan tepat
membandingkan model privasi dari solusi mereka dengan saluran Slack - sulit untuk secara aman menambah atau menghapus peserta dari taman, terlebih lagi ketika tidak ada harapan sebelumnya mengenai jumlah dan identitas ini. peserta
Di sinilah
nol pengetahuan bisa berharga. Dengan desain, bukti dan argumen nol-pengetahuan meyakinkan meyakinkan pernyataan tentang data pribadi tanpa mengungkapkan apa pun tentang data kecuali pernyataan yang dibuktikan. Mudah untuk membuat bukti tanpa pengetahuan yang dapat diverifikasi
secara universal , tanpa mengorbankan privasi! ² Fitur ini persis apa yang diperlukan untuk membangun sistem yang menjaga privasi dan diaudit pada saat yang sama.
Penelitian kami
Untuk menunjukkan penggunaan bukti tanpa pengetahuan, kami akan membangun layanan cryptocurrency dengan fungsionalitas yang mirip dengan layanan tutorial di
dokumentasi Exonum . Layanan ini memungkinkan untuk mendaftarkan pengguna dan dompet (memberikan saldo token awal sebagai hadiah) dan mentransfer token di antara pihak yang terdaftar. Semua transaksi dikonfirmasi dengan bantuan cryptosystem tanda tangan digital, Ed25519, yang dibangun ke dalam layanan Exonum. Kami tidak menyembunyikan identitas pihak yang bertransaksi (yaitu, kunci publik mereka), tetapi kami menyembunyikan jumlah token yang sedang ditransaksikan dan saldo setiap akun dalam sistem. Kami juga membahas bagaimana kami dapat meningkatkan layanan untuk menyembunyikan entitas yang bertransaksi di akhir artikel.
Layanan ini sepenuhnya bersumber terbuka dan dapat diakses di
sini .
Latar belakang kriptografi
Untuk memahami bagaimana layanan ini bekerja, pertama-tama kita harus memperkenalkan diri kepada inti kriptografi primitif yang mendukung Bulletproofs - sebuah konsep yang disebut
komitmen Pedersen . Skema komitmen kriptografi agak seperti fungsi hash: seseorang memasukkan data rahasia (pembukaan) dan mendapatkan output yang diacak (komitmen). Orang kemudian dapat mengungkapkan pembukaan untuk membuktikan bahwa nilai yang dikomitmenkan sesuai dengan itu.
Perbedaannya dengan fungsi hash adalah bahwa selain
mengikat (tidak ada yang bisa merancang dua celah berbeda menghasilkan komitmen yang sama), skema komitmen juga diharapkan untuk
bersembunyi (tidak mungkin untuk membalikkan skema dan menghasilkan celah yang diberikan komitmen). Fungsi hash bersembunyi jika inputnya terdistribusi secara merata tentang seluruh ruang input, tetapi asumsi ini paling sering tidak berlaku untuk komitmen (memang, harus mungkin untuk berkomitmen pada nilai dari set yang sangat kecil, seperti Boolean). Dengan demikian, pembukaan mengandung, selain muatan,
faktor yang
menyilaukan yang membuatnya (setidaknya secara statistik) tidak mungkin untuk menebak muatan yang diberikan komitmen.
Skema komitmen Pedersen menggunakan kelompok
prime-order , di mana
masalah logaritma diskrit (DLP) diyakini sulit, bersama dengan dua generator,
G dan
H. G dan
H harus dipilih sedemikian rupa sehingga hubungan log diskrit di antara mereka tidak diketahui; dengan kata lain, tidak ada yang tahu
k sehingga
H = kG. ³ Pembukaan adalah pasangan
(x, r) , di mana
x adalah nilai yang dikomit dan
r adalah faktor blinding; keduanya adalah skalar grup (pada dasarnya, bilangan bulat dengan "overflow" mirip dengan tipe bilangan bulat terbatas yang digunakan dalam sebagian besar bahasa pemrograman). Komitmen dihitung sebagai
Comm (x; r) = xG + rH . Dapat dibuktikan bahwa jika DLP dalam grup sulit, komitmen Pedersen mengikat secara komputasi dan bersembunyi dengan sempurna .⁴
Properti penting untuk komitmen Pedersen adalah bahwa komitmen tersebut bersifat aditif: jumlah (atau perbedaan) dari 2 komitmen adalah komitmen terhadap jumlah (atau perbedaan) dari nilai-nilai yang dikomit. Memang,
C1 = x1 G + r1 H; C2 = x2 G + r2 H => C1 + C2 = (x1 + x2) G + (r1 + r2) H = Comm(x1 + x2; r1 + r2).
Kami tidak menyertakan detail di sini tentang bagaimana antipeluru dibangun dan diverifikasi, tetapi informasi lebih lanjut dapat ditemukan di sumber daya berikut - [
1 ] dan [
2 ]. Cukuplah untuk dicatat bahwa batas atas terikat
M diasumsikan memiliki bentuk
2 ^ (2 ^ n) , yang mengarah pada konstruksi bukti paling efisien.
Membangun layanan
Dengan sepengetahuan kami, kami dapat dengan aman menyembunyikan saldo akun dan mentransfer jumlah dengan bantuan komitmen Pedersen. Menggunakan bukti jangkauan, kami dapat membuktikan / memverifikasi bahwa transfer sudah benar:
- Jumlah yang ditransfer positif
- Pengirim memiliki saldo yang cukup di akunnya.
Untuk bukti pertama, kami mengambil komitmen untuk jumlah transfer,
C_a (langsung hadir dalam transaksi transfer), dan memverifikasi bahwa nilai yang dilakukan dalam
C_a-Comm (1; 0) terletak pada kisaran
[0, M) . Memang, ini setara dengan membuktikan bahwa
C_a sesuai dengan nilai dalam rentang
[1, M] . Pengirim dapat memberikan bukti ini, karena ia tahu jumlah yang ditransfer
a .
Untuk bukti kedua, kita perlu mengambil komitmen untuk saldo saat ini pengirim,
C_s , dan memverifikasi bahwa nilai yang dilakukan dalam
C_s-C_a terletak pada kisaran
[0, M) . Sekali lagi, pengirim dapat menghasilkan bukti ini karena ia tahu celah untuk
C_s dan
C_a .
Untuk menerapkan transfer ke status blockchain, kami kurangi komitmen jumlah
C_a dari komitmen saldo pengirim (seperti yang telah kami verifikasi, itu tidak dapat mengarah ke keseimbangan negatif, atau ke peningkatan saldo pengirim), dan kemudian menambahkan
C_a ke penerima komitmen keseimbangan.
Detail utama
Penting untuk dicatat bahwa ada beberapa kondisi yang dapat membuat layanan yang diimplementasikan lebih kompleks.
Penerima transfer harus mencari tahu pembukaan ke
C_a dari suatu tempat; jika tidak, ia tidak lagi mengetahui pembukaan saldo dan tidak bisa lagi melakukan apa pun dengan dompetnya. Pembukaan tidak hadir dalam plaintext dari transaksi transfer (yang merupakan keseluruhan poin). Kita
dapat mengasumsikan bahwa penerima secara andal mendapatkan pembukaan melalui saluran off-chain (misalnya, dikirim oleh pengirim melalui Telegram), tetapi itu bukan skenario ilustratif. Jadi alih-alih, kami mengenkripsi pembukaan menggunakan enkripsi kunci-publik dua pihak berdasarkan pertukaran kunci Diffie-Hellman (libsodium menyebut jenis
kotak enkripsi ini). Untuk manfaat tambahan, kunci Curve25519 yang diperlukan untuk rutinitas
kotak dapat dikonversi dari kunci Ed25519, jadi kami dapat terus menggunakan satu kunci tombol untuk setiap pengguna alih-alih memperkenalkan kunci enkripsi terpisah .⁵

Setelah kami mengenkripsi enkripsi, kami tidak dapat lagi menerapkan transfer secara atomik. Memang, pengirim dapat secara jahat atau tidak sengaja menyediakan sampah alih-alih enkripsi pembukaan, dan logika blockchain tidak akan dapat memberi tahu bahwa ini adalah masalahnya. ⁶ Dengan demikian, kami meminta penerima untuk secara eksplisit menerima transfer melalui transaksi terpisah.

Sebelum transfer diterima, ia memodifikasi komitmen keseimbangan pengirim (jika tidak, kami akan mengizinkan pengeluaran ganda!), Tapi bukan yang penerima.

Setelah transaksi penerimaan dikonfirmasi oleh jaringan blockchain, saldo penerima diperbarui, dan transfer selesai.

Untuk mencegah kebuntuan, transfer menentukan penundaan waktu-kunci (dalam ketinggian relatif blockchain,
CSV ala Bitcoin) bagi penerima untuk memberi sinyal penerimaan. Jika kunci waktu kedaluwarsa, transfer secara otomatis dikembalikan ke pengirim (Exonum memungkinkan ini melalui
Layanan :: beforeCommit () hook).
Masalah lain lebih rumit. Untuk menghasilkan bukti saldo yang cukup, pengirim perlu mengetahui saldo saat ini, yang mungkin tidak selalu demikian. Transaksi penerimaan atau pengembalian uang yang menyimpang dapat meningkatkan saldo pengirim tanpa disadari; dalam hal ini, transfer akan gagal verifikasi, dan pengirim akan cukup frustrasi.
Untuk mengatasi masalah ini, kami mengizinkan transfer untuk merujuk apa yang menurut pengirim adalah keadaan dompetnya saat ini (lebih tepatnya, referensi berupa jumlah peristiwa yang mengubah saldo akun - transfer dan pengembalian uang). Saat memeriksa bukti saldo yang cukup, kami menggunakan negara referensi untuk mendapatkan komitmen saldo pengirim. Selain itu, kami memeriksa bahwa tidak ada transfer keluar yang terjadi sejak negara referensi. Jika demikian, kami dapat yakin bahwa jika kami mengurangi jumlah transfer dari saldo
saat ini pengirim, kami akan berakhir dengan nilai non-negatif. Memang, peristiwa dalam riwayat akun setelah titik referensi (transfer masuk dan pengembalian uang) hanya dapat meningkatkan saldo! ⁷
Dengan titik referensi di tempat, pengirim masih agak dibatasi; ia tidak boleh memiliki transfer yang tertunda saat membuat transfer baru. Namun, pembatasan ini jauh lebih membatasi daripada persyaratan untuk mengetahui status akun seseorang pada saat transfer; Pada dasarnya, kami membuat pengirim bergantung pada apa yang
dia lakukan sebelumnya, tetapi tidak pada tindakan orang lain.
Implementasi
Kami menggunakan pustaka antipeluru yang ditulis dalam
Rust murni, yang baru saja mencapai
tahap pra-rilis . Karena platform Exonum ditulis dalam Rust, itu terintegrasi dengan perpustakaan dengan mulus. Sebagai bonus, tidak seperti versi antipeluru yang dijelaskan dalam whitepaper asli (yang sedang dikembangkan di
C dan menggunakan kurva eliptik secp256k1 Bitcoin), perpustakaan yang kami gunakan didasarkan pada Curve25519, yang sudah digunakan di Exonum sebagai komponen utama dari Ed25519 cryptosystem tanda tangan digital.
Menerapkan layanan berdasarkan uraian di atas cukup mudah. Bagian yang paling sulit adalah membangun bukti Merkle yang mengotentikasi informasi yang dikembalikan kepada pengguna sehingga dia tidak harus mempercayai secara membuta node Exonum yang dia komunikasikan. Meningkatkan pengalaman pengembang layanan dalam hal ini adalah salah satu tujuan utama dari
rilis Exonum 1.0 .
Langkah selanjutnya
Layanan yang kami bangun tidak menyembunyikan identitas pengirim dan penerima transfer, yang merupakan batasan utama untuk aplikasi dunia nyata. Untungnya, ada cara untuk mengatasi masalah ini.
Teknik generik yang digunakan dalam
zCash (tetapi pada prinsipnya berlaku untuk kasus penggunaan lainnya, seperti
Ethereum ) didasarkan pada pembuatan
pohon Merkle dari status sistem. Sebagai contoh, zCash membangun
pohon catatan komitmen , yang kira-kira setara dengan output transaksi yang pernah dibuat dalam Bitcoin. Bukti tanpa pengetahuan kemudian mencakup jalur otentikasi (alias cabang Merkle) di pohon ini, mengungkapkan sesuatu tentang elemen pohon tanpa mengungkapkan elemen mana yang dimaksud. Kelemahan dari pendekatan ini adalah bahwa fungsi hash kriptografis yang digunakan untuk membangun pohon Merkle sulit untuk ditransfer ke ranah tanpa pengetahuan; bukti yang dihasilkan menjadi mahal secara komputasi - satu bukti dapat mengambil detik atau bahkan beberapa menit untuk dibuat. Mencari lebih banyak fungsi hash kriptografis “ramah-ZKP” adalah area penelitian aktif.
Jika kami mengakui kendala tambahan, mungkin ada solusi yang lebih mudah. Misalnya, sebuah makalah terbaru oleh
Narula et al . menggambarkan sistem dengan jumlah peserta terbatas yang diketahui secara apriori, yang dapat bertransaksi di antara mereka sendiri tanpa mengungkapkan peserta atau jumlah yang ditransfer untuk transaksi apa pun. (Pikirkan jaringan blockchain yang berfokus pada privasi untuk transfer antar bank.)
Pada catatan yang lebih biasa, mungkin ada banyak perbaikan teknis yang dapat dinikmati layanan yang dikembangkan: lebih banyak cakupan pengujian, pemisahan tanda tangan dan kunci enkripsi, pembandingan, dll. Peningkatan besar pada layanan UX akan memungkinkan pemesanan transaksi deterministik yang berasal dari pengguna yang sama, yang kami rencanakan untuk selesaikan tidak lama setelah merilis Exonum 1.0.
Kesimpulan
Kami telah menjelaskan cara membuat cryptotoken berbasis akun dengan privasi kuat yang diaktifkan oleh bukti tanpa pengetahuan (khususnya, anti peluru). Logika token diimplementasikan sebagai layanan Exonum. Meskipun saat ini layanan hanyalah bukti konsep, ini menunjukkan bagaimana platform Exonum dapat digunakan untuk membangun di atas primitif kriptografi kompleks dengan overhead yang sangat rendah yang dikenakan oleh lingkungan eksekusi.
- Ada perbedaan rumit antara bukti dan argumen, yang tidak akan kita bahas di sini. Demi kesederhanaan, kami akan merujuk ke semua konstruksi tanpa pengetahuan dalam artikel ini sebagai bukti tanpa pengetahuan meskipun ini tidak selalu benar dari sudut pandang teoretis.
- Ini dapat dicapai melalui teknik yang sangat umum yang dikenal sebagai transformasi Fiat - Shamir , yang mengubah protokol bukti interaktif menjadi non-interaktif, yang dapat diverifikasi secara universal. Mengorbankan kekakuan ilmiah sekali lagi, kami tidak akan secara eksplisit mengklarifikasi bahwa bukti tanpa pengetahuan yang kami gunakan adalah non-interaktif.
- Generator biasanya dipilih dengan metode “nothing up my sleeve”. Misalnya, G dapat menjadi bagian dari spesifikasi grup untuk penggunaannya dalam kriptografi kunci publik, dan H diturunkan dari G melalui fungsi hash: H ~ hash (G) .
- Yang terakhir berarti bahwa bahkan musuh dengan kekuatan komputasi yang tak terbatas tidak dapat menyimpulkan apa yang dilakukan komitmen; memang, jika DLP dalam grup rusak, setiap komitmen dapat dibuka dengan nilai yang memungkinkan.
- Ini sebagian merupakan keputusan pembuktian konsep; secara umum, menggunakan kembali kunci untuk tujuan yang berbeda adalah ide yang buruk.
- Secara teori dimungkinkan untuk memberikan bukti nol-pengetahuan untuk nilai terenkripsi yang setara dengan saldo yang dijanjikan; namun, hal itu akan menambah kerumitan sistem.
- Perlu disebutkan bahwa beberapa transfer melanggar aturan "tidak ada transfer keluar karena negara yang dirujuk" masih bisa benar; kami tidak punya cara untuk memverifikasi ini.