Vitalik Buterin melalui Blog Vitalik Buterin
Ini adalah cerminan dari postingan di https://medium.com/@VitalikButerin/zk-snarks-under-the-hood-b33151a013f6
Ini adalah bagian ketiga dari serangkaian artikel yang menjelaskan cara kerja teknologi di balik zk-SNARKs; artikel sebelumnya tentang program aritmatika kuadrat dan pasangan kurva eliptik adalah bacaan wajib, dan artikel ini akan mengasumsikan pengetahuan tentang kedua konsep tersebut. Pengetahuan dasar tentang apa itu zk-SNARK dan apa yang dilakukannya juga diasumsikan. Lihat juga Artikel Christian Reitwiessner di sini untuk pengenalan teknis lainnya.
Pada artikel sebelumnya, kami memperkenalkan program aritmatika kuadrat, suatu cara untuk merepresentasikan masalah komputasi apa pun dengan persamaan polinomial yang lebih mudah menerima berbagai bentuk tipu daya matematika. Kami juga memperkenalkan pasangan kurva elips, yang memungkinkan bentuk enkripsi homomorfik satu arah yang sangat terbatas yang memungkinkan Anda melakukan pemeriksaan kesetaraan. Sekarang, kita akan memulai dari bagian terakhir yang kita tinggalkan, dan menggunakan pasangan kurva elips, bersama dengan beberapa trik matematika lainnya, agar pembukti dapat membuktikan bahwa mereka mengetahui solusi untuk QAP tertentu tanpa mengungkapkan hal lain tentang QAP tersebut. solusi sebenarnya.
Artikel ini akan fokus pada Protokol Pinokio oleh Parno, Gentry, Howell dan Raykova dari tahun 2013 (sering disebut PGHR13); terdapat beberapa variasi pada mekanisme dasarnya, sehingga skema zk-SNARK yang diterapkan dalam praktiknya mungkin bekerja sedikit berbeda, namun prinsip dasarnya secara umum akan tetap sama.
Untuk memulai, mari kita masuk ke asumsi kunci kriptografi yang mendasari keamanan mekanisme yang akan kita gunakan: the *pengetahuan tentang eksponen* asumsi.
Pada dasarnya, jika Anda mendapatkan sepasang poin � dan �, di mana �⋅�=�, dan Anda mendapatkan sebuah poin �, maka tidak mungkin menghasilkan �⋅� kecuali � “diturunkan” dari � dengan cara tertentu yang kamu tahu. Hal ini mungkin tampak jelas secara intuitif, namun asumsi ini sebenarnya tidak dapat diturunkan dari asumsi lain (misalnya kekerasan log diskrit) yang biasanya kita gunakan ketika membuktikan keamanan protokol berbasis kurva elips, sehingga zk-SNARK sebenarnya bersandar pada landasan yang agak sempit. fondasi yang lebih goyah daripada kriptografi kurva elips pada umumnya — meskipun masih cukup kokoh sehingga sebagian besar kriptografer tidak keberatan dengan hal tersebut.
Sekarang, mari kita bahas bagaimana hal ini dapat digunakan. Misalkan sepasang titik (�,�) jatuh dari langit, dimana �⋅�=�, namun tidak ada yang mengetahui berapa nilai �. Sekarang, misalkan saya mendapatkan sepasang titik (�,�) di mana �⋅�=�. Kemudian, asumsi KoE menyiratkan bahwa satu-satunya cara saya dapat membuat pasangan poin tersebut adalah dengan mengambil � dan �, dan mengalikan keduanya dengan beberapa faktor r. yang saya tahu secara pribadi. Perhatikan juga bahwa berkat keajaiban pasangan kurva elips, periksa bahwa �=�⋅� sebenarnya tidak perlu diketahui � – sebagai gantinya, Anda cukup memeriksa apakah �(�,�)=�(�,�).
Ayo lakukan sesuatu yang lebih menarik. Misalkan kita mempunyai sepuluh pasang titik yang jatuh dari langit: (�1,�1),(�2,�2)…(�10,�10). Dalam semua kasus, ��⋅�=��. Misalkan saya kemudian memberi Anda sepasang titik (�,�) di mana �⋅�=�. Apa yang kamu tahu sekarang? Anda tahu bahwa � adalah suatu kombinasi linier �1⋅�1+�2⋅�2+…+�10⋅�10, yang mana saya mengetahui koefisiennya �1,�2…�10. Artinya, satu-satunya cara untuk mendapatkan pasangan titik tersebut (�,�) adalah dengan mengambil beberapa kelipatan �1,�2…�10 dan menjumlahkannya, lalu membuat perhitungan yang sama dengan �1,�2… �10.
Perhatikan bahwa, mengingat kumpulan �1…�10 poin tertentu yang mungkin ingin Anda periksa kombinasi liniernya, Anda tidak dapat benar-benar membuat �1…�10 poin yang menyertainya tanpa mengetahui apa itu �, dan jika Anda tahu apa itu � kemudian Anda dapat membuat pasangan (�,�) di mana �⋅�=� untuk apa pun � yang Anda inginkan, tanpa perlu repot membuat kombinasi linier. Oleh karena itu, agar hal ini berhasil, sangatlah penting bahwa siapa pun yang membuat poin-poin tersebut dapat dipercaya dan benar-benar menghapus – setelah mereka membuat sepuluh poin tersebut. Dari sinilah konsep “penyiapan tepercaya” berasal.
Ingatlah bahwa penyelesaian QAP adalah himpunan polinomial (�,�,�) sehingga �(�)⋅�(�)−�(�)=�(�)⋅�(�), dimana:
- � merupakan kombinasi linier dari himpunan polinomial {�1…��}
- � merupakan kombinasi linier dari {�1…��} dengan koefisien yang sama
- � merupakan kombinasi linier dari {�1…��} dengan koefisien yang sama
Himpunan {�1…��},{�1…��} dan {�1…��} serta polinomial � merupakan bagian dari rumusan masalah.
Namun, dalam sebagian besar kasus dunia nyata, �,� dan � sangatlah besar; untuk sesuatu dengan ribuan gerbang sirkuit seperti fungsi hash, polinomial (dan faktor kombinasi linier) mungkin memiliki ribuan suku. Oleh karena itu, daripada meminta pembukti memberikan kombinasi linier secara langsung, kita akan menggunakan trik yang telah diperkenalkan di atas agar pembukti membuktikan bahwa mereka memberikan sesuatu yang merupakan kombinasi linier, namun tanpa mengungkapkan hal lain.
Anda mungkin telah memperhatikan bahwa trik di atas bekerja pada titik kurva elips, bukan polinomial. Oleh karena itu, yang sebenarnya terjadi adalah kami menambahkan nilai berikut ke pengaturan tepercaya:
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
- �⋅�1(�),�⋅�1(�)⋅��
- �⋅�2(�),�⋅�2(�)⋅��
- ...
Anda dapat menganggap t sebagai “titik rahasia” di mana polinomial dievaluasi. � adalah “generator” (titik kurva elips acak yang ditentukan sebagai bagian dari protokol) dan �,��,�� dan �� adalah “limbah beracun”, angka yang mutlak harus dihapus dengan cara apa pun, atau jika tidak, siapa pun yang memilikinya akan dapat membuat bukti palsu. Sekarang, jika seseorang memberi Anda sepasang poin �, � sehingga �⋅��=� (pengingat: kita tidak memerlukan �� untuk memeriksanya, karena kita dapat melakukan pemeriksaan berpasangan), maka Anda tahu apa yang mereka yang diberikan kepada Anda adalah kombinasi linear dari polinomial �� yang dievaluasi pada �.
Oleh karena itu, sejauh ini pembuktian harus memberikan:
- ��=�⋅�(�),��′=�⋅�(�)⋅��
- ��=�⋅�(�),��′=�⋅�(�)⋅��
- ��=�⋅�(�),��′=�⋅�(�)⋅��
Perhatikan bahwa pembukti sebenarnya tidak perlu mengetahui (dan tidak seharusnya mengetahui!) �,��,�� atau �� untuk menghitung nilai-nilai ini; sebaliknya, pembukti harus dapat menghitung nilai-nilai ini hanya dari poin yang kita tambahkan ke pengaturan tepercaya.
Langkah selanjutnya adalah memastikan ketiga kombinasi linier mempunyai koefisien yang sama. Hal ini dapat kita lakukan dengan menambahkan kumpulan nilai lain ke pengaturan tepercaya: �⋅(��(�)+��(�)+��(�))⋅�, dengan � adalah angka lain yang harus dianggap “beracun” sampah” dan dibuang segera setelah pengaturan tepercaya selesai. Kita kemudian dapat meminta pembukti membuat kombinasi linier dengan nilai-nilai ini dengan koefisien yang sama, dan menggunakan trik pemasangan yang sama seperti di atas untuk memverifikasi bahwa nilai ini cocok dengan �+�+� yang disediakan.
Terakhir, kita perlu membuktikan bahwa �⋅�−�=�⋅�. Kami melakukan ini sekali lagi dengan pemeriksaan berpasangan:
�(��,��)/�(��,�)?=�(�ℎ,�⋅�(�))
Dimana �ℎ=�⋅�(�). Jika hubungan antara persamaan ini dan �⋅�−�=�⋅� tidak masuk akal bagi Anda, kembalilah dan baca artikel tentang berpasangan.
Kita telah melihat di atas bagaimana mengubah �,� dan � menjadi titik kurva elips; � hanyalah generator (yaitu titik kurva elips yang setara dengan angka satu). Kita dapat menambahkan �⋅�(�) ke pengaturan tepercaya. � lebih sulit; � hanyalah sebuah polinomial, dan kami hanya memperkirakan sedikit sebelumnya tentang berapa koefisiennya untuk masing-masing solusi QAP. Oleh karena itu, kita perlu menambahkan lebih banyak data ke pengaturan tepercaya; khususnya urutannya:
�,�⋅�,�⋅�2,�⋅�3,�⋅�4….
Dalam pengaturan tepercaya Zcash, urutan di sini mencapai sekitar 2 juta; ini adalah berapa banyak kekuatan � yang Anda perlukan untuk memastikan bahwa Anda akan selalu dapat menghitung �(�), setidaknya untuk contoh QAP spesifik yang mereka pedulikan. Dan dengan itu, pemverifikasi dapat memberikan semua informasi kepada verifikator untuk melakukan pemeriksaan akhir.
Ada satu detail lagi yang perlu kita diskusikan. Seringkali kita tidak hanya ingin membuktikan secara abstrak bahwa ada solusi untuk suatu masalah tertentu; sebaliknya, kami ingin membuktikan kebenaran dari beberapa solusi spesifik (misalnya membuktikan bahwa jika Anda menggunakan kata “sapi” dan SHA3 melakukan hash jutaan kali, hasil akhirnya dimulai dengan 0x73064fe5), atau bahwa ada solusi jika Anda membatasi beberapa parameter. Misalnya, dalam contoh mata uang kripto yang jumlah transaksi dan saldo akunnya dienkripsi, Anda ingin membuktikan bahwa Anda mengetahui beberapa kunci dekripsi k sehingga:
decrypt(old_balance, k) >= decrypt(tx_value, k)
decrypt(old_balance, k) - decrypt(tx_value, k) = decrypt(new_balance, k)
yang terenkripsi old_balance
, tx_value
dan new_balance
harus dinyatakan secara publik, karena nilai-nilai tersebut adalah nilai-nilai spesifik yang ingin kami verifikasi pada saat itu; hanya kunci dekripsi yang harus disembunyikan. Sedikit modifikasi pada protokol diperlukan untuk membuat “kunci verifikasi khusus” yang sesuai dengan batasan tertentu pada input.
Sekarang, mari kita mundur sedikit. Pertama-tama, inilah algoritma verifikasi secara keseluruhan, milik ben Sasson, Tromer, Virza dan Chiesa:
Baris pertama membahas parameterisasi; pada dasarnya, Anda dapat menganggap fungsinya sebagai untuk membuat “kunci verifikasi khusus” untuk contoh spesifik dari masalah tersebut di mana beberapa argumen ditentukan. Baris kedua adalah pemeriksaan kombinasi linier untuk �,� dan �; baris ketiga adalah pemeriksaan apakah kombinasi linier mempunyai koefisien yang sama, dan baris keempat adalah pemeriksaan hasil kali �⋅�−�=�⋅�.
Secara keseluruhan, proses verifikasinya adalah beberapa perkalian kurva elips (satu untuk setiap variabel masukan “publik”), dan lima pemeriksaan pasangan, salah satunya mencakup perkalian pasangan tambahan. Pembuktiannya berisi delapan titik kurva elips: sepasang titik masing-masing untuk �(�),�(�) dan �(�), satu titik �� untuk �⋅(�(�)+�(�)+�(� )), dan titik �ℎ untuk �(�). Tujuh titik ini berada pada kurva �� (masing-masing 32 byte, karena Anda dapat mengompresi koordinat � menjadi satu bit), dan dalam implementasi Zcash, satu titik (��) berada pada kurva bengkok di ��2 (64 byte), jadi ukuran total buktinya adalah ~288 byte.
Dua bagian tersulit secara komputasi dalam membuat bukti adalah:
- Membagi (�⋅�−�)/� untuk mendapatkan � (algoritma berdasarkan Transformasi Fourier Cepat dapat melakukan ini dalam waktu sub-kuadrat, tetapi komputasinya masih cukup intensif)
- Membuat perkalian dan penjumlahan kurva elips untuk menghasilkan nilai �(�),�(�),�(�) dan �(�) serta pasangannya yang bersesuaian
Alasan mendasar mengapa membuat pembuktian sangat sulit adalah kenyataan bahwa gerbang logika biner tunggal dalam perhitungan awal berubah menjadi operasi yang harus diproses secara kriptografis melalui operasi kurva elips jika kita membuat pembuktian tanpa pengetahuan darinya. . Fakta ini, bersama dengan superlinearitas transformasi Fourier cepat, berarti pembuatan bukti memerlukan waktu ~20–40 detik untuk transaksi Zcash.
Pertanyaan lain yang sangat penting adalah: bisakah kita mencoba membuat pengaturan tepercaya sedikit… tidak terlalu menuntut kepercayaan? Sayangnya kita tidak bisa membuatnya sepenuhnya tidak dapat dipercaya; asumsi KoE sendiri tidak memungkinkan pembuatan pasangan independen (��,��⋅�) tanpa mengetahui apa itu �. Namun, kita dapat meningkatkan keamanan secara signifikan dengan menggunakan komputasi multipihak �-of-� – yaitu, membangun pengaturan tepercaya antara � pihak sedemikian rupa sehingga selama setidaknya salah satu peserta menghapus limbah beracun mereka maka Anda baik-baik saja. .
Untuk mendapatkan sedikit gambaran bagaimana Anda akan melakukan ini, berikut adalah algoritma sederhana untuk mengambil set yang sudah ada (�,�⋅�,�⋅�2,�⋅�3…), dan “menambahkan” rahasia Anda sendiri sehingga Anda memerlukan rahasia Anda dan rahasia sebelumnya (atau kumpulan rahasia sebelumnya) untuk melakukan cheat.
Set outputnya sederhana:
�,(�⋅�)⋅�,(�⋅�2)⋅�2,(�⋅�3)⋅�3…
Perhatikan bahwa Anda dapat membuat himpunan ini hanya dengan mengetahui himpunan dan s asli, dan himpunan baru berfungsi dengan cara yang sama seperti himpunan lama, kecuali sekarang menggunakan �⋅� sebagai “limbah beracun” dan bukan �. Selama Anda dan orang (atau orang-orang) yang membuat kumpulan sebelumnya tidak gagal menghapus limbah beracun Anda dan kemudian berkolusi, kumpulan tersebut “aman”.
Melakukan hal ini untuk pengaturan tepercaya yang lengkap agak lebih sulit, karena ada beberapa nilai yang terlibat, dan algoritme harus dilakukan antar pihak dalam beberapa putaran. Ini adalah area penelitian aktif untuk melihat apakah algoritme komputasi multi-pihak dapat disederhanakan lebih lanjut dan dibuat agar memerlukan lebih sedikit putaran atau dibuat lebih dapat diparalelkan, karena semakin banyak Anda dapat melakukannya, semakin banyak pihak yang dapat dimasukkan ke dalam prosedur penyiapan tepercaya . Masuk akal untuk melihat mengapa pengaturan tepercaya antara enam peserta yang semuanya mengenal dan bekerja satu sama lain mungkin membuat beberapa orang tidak nyaman, namun pengaturan tepercaya dengan ribuan peserta hampir tidak bisa dibedakan dari tidak ada kepercayaan sama sekali – dan jika Anda benar-benar paranoid , Anda dapat masuk dan berpartisipasi dalam prosedur penyiapan sendiri, dan pastikan Anda menghapus nilai Anda secara pribadi.
Bidang penelitian aktif lainnya adalah penggunaan pendekatan lain yang tidak menggunakan pasangan dan paradigma pengaturan tepercaya yang sama untuk mencapai tujuan yang sama; melihat Presentasi terbaru Eli ben Sasson untuk satu alternatif (walaupun hati-hati, setidaknya secara matematis sama rumitnya dengan SNARK!)
Terima kasih khusus kepada Ariel Gabizon dan Christian Reitwiessner yang telah mengulasnya.
- Konten Bertenaga SEO & Distribusi PR. Dapatkan Amplifikasi Hari Ini.
- PlatoData.Jaringan Vertikal Generatif Ai. Berdayakan Diri Anda. Akses Di Sini.
- PlatoAiStream. Intelijen Web3. Pengetahuan Diperkuat. Akses Di Sini.
- PlatoESG. Karbon, teknologi bersih, energi, Lingkungan Hidup, Tenaga surya, Penanganan limbah. Akses Di Sini.
- PlatoHealth. Kecerdasan Uji Coba Biotek dan Klinis. Akses Di Sini.
- BlockOffset. Modernisasi Kepemilikan Offset Lingkungan. Akses Di Sini.
- Sumber: Kecerdasan Data Plato.