Bagaimana zk-ASM dapat menghadirkan internet yang aman dan tidak dapat dipercaya

Analisis Riset Asli Web3.com Ventures

0xFishylosopher

Catatan: Artikel ini merupakan artikel yang cukup padat secara teknis, dan mengasumsikan pemahaman konseptual dasar dengan zk-Proofs dan/atau zk-Rollups. Pengenalan yang lebih umum mengenai prinsip-prinsip ini dapat ditemukan di sini.

Perkenalan

Bukti Pengetahuan Nol, khususnya zk-SNARKs (Argumen Pengetahuan Non-interaktif Ringkas) mungkin merupakan salah satu teknologi paling penting di garis depan Web 3. Meskipun sebagian besar perhatian media dan investasi di sub-bidang ini tertuju pada zk -Rollup, solusi penskalaan yang memberikan skalabilitas besaran pada blockchain L1 seperti Ethereum, ini bukan satu-satunya penerapan zk-SNARKs. Dalam esai ini, saya akan menganalisis secara mendalam konsep kode Zero-Knowledge Majelis (atau zkASM), mengevaluasi kasus penggunaannya di zk-Rollups dan seterusnya, mengeksplorasi kemungkinan teoretisnya dalam menciptakan kembali Internet seperti yang kita tahu.

Prinsip Teknis

zk-ASM, seperti namanya, berisi dua bagian teknis utama: ZK dan ASM. Bagian ZK mengacu pada zk-SNARKs, atau Argumen Pengetahuan Non-Interaktif Ringkas, sedangkan bagian ASM mengacu pada kode Majelis. Untuk memahami potensi zk-ASM, pertama-tama kita harus memahami landasan teoretis dari kedua konsep yang tampaknya misterius ini.

zk-SNARK

zk-SNARKs adalah permata mahkota dari zk-Proofs: mereka adalah bukti singkat bahwa pernyataan tertentu adalah Benar jika bukti tersebut tidak mengungkapkan apa pun tentang data yang dibuktikan. Misalnya, pertimbangkan seseorang yang menyatakan pernyataan “Saya mengetahui m sehingga C(m) = 0”, di mana m adalah pesan sepanjang gigabyte dan C adalah sebuah fungsi. Zk-SNARK akan menjadi bukti yang sangat singkat (< 1GB) yang dapat diverifikasi dengan cepat dan bukti yang tidak mengungkapkan apa pun tentang m (selain informasi yang tersedia untuk umum) [1].

Jadi apa itu “C(m)”? Bagaimana manfaatnya? Fungsi ini sebenarnya adalah rangkaian aritmatika, atau representasi Grafik Asiklik Terarah (DAG) dari fungsi tertentu yang ingin kita jalankan, seperti yang ditunjukkan diagram [2]. Huruf “m” pada dasarnya adalah entri data ke dalam rangkaian, dan “node” spesifik dalam rangkaian adalah gerbang logika individual atau operasi aritmatika. Misalnya, node “+” mungkin memiliki “2” dan “3” sebagai masukan, dan mengeluarkan “5” ke operator berikutnya. Dengan demikian, operasi aritmatika atau logika sembarang dapat dikodekan dalam “rangkaian aritmatika”.

Setelah kita memiliki rangkaian aritmatika ini sebagai representasi kode yang ingin kita gunakan untuk menjalankan zk-SNARK, kita dapat mulai membuat zk-SNARK ini. Pada dasarnya, zk-SNARK dimungkinkan karena “teorema dasar aljabar,” yang menyatakan bahwa polinomial dengan derajat “d” memiliki paling banyak akar “d” [3]. Trik matematikanya terdiri dari dua langkah: (1) mengubah fungsi “f(m)” yang ingin kita buktikan menjadi polinomial (dan tetap menggunakannya), dan (2) menggunakan “teorema dasar aljabar” untuk berinteraksi dengan polinomial dan memberikan bukti ringkas. Dalam jargon teknis, bagian pertama disebut “Polynomial Commitment Scheme” (PCS), dan bagian kedua disebut “Polynomial Interactive Oracle Proof” (PIOP) [4].

Meskipun implementasi spesifik PCS dan PIOP berada di luar cakupan artikel ini, sejauh ini kami telah mendapatkan sketsa kasar untuk langkah-langkah inti zk-SNARK:

  1. Miliki fungsi pilihan (fungsi kode, persamaan matematika, dll.) yang ingin Anda jalankan zk-SNARK

  2. Encode fungsi ini sebagai rangkaian aritmatika C(m)

  3. Jalankan PCS untuk mendapatkan representasi polinomial dari rangkaian aritmatika ini

  4. Jalankan PIOP untuk mendapatkan bukti logaritma yang ringkas dengan ukuran “m” asli

Dan viola, kami memiliki zk-SNARK yang dibuat khusus yang dapat membuktikan bahwa seseorang mengetahui pesan tertentu tanpa mengungkapkan apa pesan tersebut.

Kode Perakitan

Bagian kedua dari teka-teki zk-ASM adalah gagasan Kode Majelis. Kode perakitan adalah kelas bahasa yang berisi instruksi bahasa yang sangat rendah yang mudah dibaca oleh mesin tetapi cukup sulit untuk diuraikan oleh manusia. Tidak seperti bahasa tingkat yang lebih tinggi, seperti Python, Java, atau bahkan C, bahasa Majelis mengandung fungsi yang sangat primitif, seperti memindahkan, membandingkan, menambah, dan melompati serangkaian register data pada prosesor dan lokasi memori yang dikodekan secara keras. Misalnya, kode Python untuk mencetak angka 1 hingga 9 di layar adalah 123456789:

Cukup mudah dimengerti, bukan? Sekarang inilah versi Majelis x86 [5]:

Jauh lebih buruk, terutama untuk operasi sederhana seperti itu. Jadi mengapa menggunakan bahasa Majelis? Seperti disebutkan di atas, meskipun instruksi ini mungkin tidak mudah dibaca oleh manusia, instruksi ini sangat mudah untuk “dirangkai” menjadi kode byte 110011001 agar dapat dibaca dan dijalankan oleh mesin (ini disebut assembler) [6]. Sebagai perbandingan, bahasa tingkat tinggi seperti Python dan Java lebih mudah dibaca oleh manusia, namun program yang ditulis dalam bahasa tersebut tidak dapat langsung dieksekusi oleh prosesor. Sebaliknya, kita perlu mengandalkan “kompiler” yang memakan kode Python atau Java yang kita tulis dan mengeluarkan dump kode assembly seperti di atas untuk dirakit dan dieksekusi oleh mesin. Kita dapat mengharapkan bagian Python atau Java yang sama berjalan dengan lancar di berbagai prosesor dan sistem operasi yang berbeda karena kompiler melakukan pekerjaan berat, mengkompilasi kode sumber Anda ke dalam bahasa Majelis yang khusus untuk prosesor atau sistem operasi tersebut.

Karena semua bahasa dikompilasi menjadi kode assembly (yang kemudian dikompilasi menjadi biner yang dapat dieksekusi), assembly pada dasarnya seperti “induk dari semua bahasa”. Sekarang anggaplah kita dapat mengubah semua operan dalam bahasa Majelis (seperti x86 atau RISC-V) menjadi representasi rangkaian aritmatika, sehingga kita dapat memberikan bukti zk-SNARK dari semua operan dalam Majelis ini bahasa. Ini berarti bahwa kami secara teoritis mampu menyediakan zk-SNARK dari program apa pun yang ditulis dalam bahasa tingkat tinggi yang sewenang-wenang (seperti Python atau Java) yang dikompilasi ke bahasa Majelis ini. Dan itulah mengapa kita perlu memikirkan zk-ASM.

Aplikasi praktis

zk-EVM Rollup: Poligon zk-ASM

Salah satu aplikasi terpenting untuk zk-ASM adalah membuat zk-Rollups, atau zk-EVMs yang kompatibel dengan Mesin Virtual Ethereum. Zk-EVM sangat penting untuk skalabilitas blockchain karena memungkinkan pemrogram untuk menerapkan rantai L2 berbasis zk-Rollup tanpa memodifikasi banyak (jika ada) kode mereka [7]. Dalam bidang ini, zk-EVM Polygon adalah studi kasus teladan yang menunjukkan bagaimana zk-ASM dapat digunakan untuk mencapai tujuan ini.

Ketika pemrogram mengembangkan blockchain Ethereum L1, mereka biasanya membuat kode dalam Solidity, yang merupakan bahasa tingkat tinggi yang mirip dengan C. Kode Soliditas ini dikompilasi menjadi serangkaian Opcode EVM, seperti ADD, SLOAD, dan EQ, sebelum dieksekusi pada blockchain L1 [8]. Secara default, proses ini jelas tidak membuat zk-Proof apa pun. Trik Polygon adalah membuat metode untuk menafsirkan setiap Opcode EVM ke dalam zk-ASM yang ditulis khusus, yang sangat ramah zk-SNARK. Kemudian, L2 zk-EVM mereka akan mengeksekusi zk-ASM, sekaligus membuat sirkuit zk-SNARK dari ASM untuk membuat bukti zk-SNARK [9]. Misalnya, opcode ADD di EVM akan diterjemahkan ke zk-ASM Polygon sebagai berikut [10]:

Karena sulap Polygon zk-EVM terjadi di tingkat Majelis, ini adalah dua tingkat yang dihapus dari kode yang rata-rata disentuh oleh programmer Ethereum, yaitu tingkat “Soliditas”. Inilah alasan mengapa sebagian besar pengembang dapat mem-porting kode EVM mereka yang dibuat untuk mainnet Ethereum langsung ke Polygon zk-EVM. Selain itu, karena Polygon zk-EVM “menjaga” tumpukan teknologi Ethereum hingga ke tingkat opcode, semua infrastruktur debugging yang bergantung pada analisis opcode yang dikompilasi akan tetap dapat digunakan dan utuh. Ini tidak seperti beberapa desain zk-EVM lainnya, seperti zk-Sync, yang tidak menyediakan zk-Proofs pada tingkat opcode. Jadi, bahkan ketika Polygon menemukan dan membuktikan bahasa Majelisnya sendiri, Vitalik menulis bahwa “ia masih dapat memverifikasi kode EVM, ia hanya menggunakan beberapa logika internal yang berbeda untuk melakukannya” [11].

Melampaui Rollup: zk-WASM

zk-EVM bukanlah satu-satunya aplikasi untuk zk-ASM. Ingat pernyataan kami sebelumnya bahwa bahasa Majelis pada dasarnya adalah “ibu dari semua bahasa,” dan bahwa pembuatan zk-ASM akan membuka zk-Proofs untuk program generik yang ditulis dalam bahasa apa pun yang dikompilasi ke bahasa Majelis tersebut. Web Assembly, atau WASM, adalah salah satu bahasa assembly yang paling penting. Pertama kali diterbitkan pada tahun 2018, tujuan WASM adalah untuk menciptakan bahasa Majelis yang meningkatkan kecepatan eksekusi Aplikasi Web dan memberikan pelengkap eksekusi untuk Javascript, bahasa pengkodean utama di balik Web [12].

Pada dasarnya, seiring dengan berkembangnya Web selama bertahun-tahun, semakin besarnya ukuran dan kompleksitas Aplikasi Web berarti bahwa seringkali browser menjadi sangat lambat untuk mengkompilasi segala sesuatu yang ditulis dalam Javascript, dan harus bergantung pada siklus kompilasi-optimasi-pemuatan ulang yang kompleks [12]. WebAssembly, di sisi lain, menghilangkan kebutuhan untuk bergantung pada mesin eksekusi browser yang kompleks dengan menyediakan bahasa assembly yang portabel, modular, dan mudah dieksekusi. Selain itu, sebagai bahasa Majelis, WASM memungkinkan pemrogram untuk langsung menulis cuplikan kode dalam C, C++, Rust, Java, atau Ruby yang berjalan secara asli di browser. Oleh karena itu WASM telah menjadi teknologi pilihan untuk “menyediakan fungsi terdistribusi tanpa server” [13].

Jadi mengapa dan bagaimana zk-SNARK muncul? WASM unik karena merupakan teknologi sisi klien, yang mampu berinteraksi langsung dengan input dan data pengguna. Karena seringkali hal ini mencakup data sensitif seperti kata sandi dan informasi pribadi, kita memerlukan teknologi yang (1) memastikan bahwa program dijalankan dengan benar, dan (2) informasi sensitif kita tidak bocor. Seperti dijelaskan di atas, zk-SNARK adalah solusi sempurna untuk menyelesaikan kedua masalah ini, dan dengan demikian merupakan bagian penting dalam mengamankan WASM [14].

Meskipun pengembangan zk-WASM masih dalam tahap awal, baru-baru ini ada beberapa proyek yang merilis prototipe sirkuit zk-SNARK untuk WebAssembly. Misalnya, Emulator zk-SNARK “ZAWA” Delphinus Lab menyajikan metode untuk menyandikan operan dan semantik mesin virtual WASM ke dalam sirkuit aritmatika, yang memungkinkannya melakukan pembuktian zk-SNARK [13]. Seiring berjalannya waktu, sirkuit zk-WASM pasti akan terus dioptimalkan, sehingga memungkinkan program yang ditulis dalam bahasa umum (seperti C, C++, Rust, dan Ruby) mengadopsi paradigma zk-Proofs.

Kesimpulan

Sepanjang esai ini, kami telah mengeksplorasi dasar-dasar teoretis zk-ASM serta memeriksa dua studi kasus paradigmatik zk-ASM: penggunaan zk-ASM oleh Polygon untuk membuat zk-EVM tingkat opcode, serta penerapan zk -SNARK ke WebAssembly untuk membuat zk-WASM. Pada akhirnya, zk-ASM menjanjikan untuk menyatukan interoperabilitas dan skala Web 2 dengan kepercayaan dan keamanan Web 3.

Di satu sisi, blockchain semakin berupaya untuk melampaui hambatan throughput mereka saat ini dan berpotensi mendukung eksekusi, sementara di sisi lain, metode Web 2 semakin banyak diserang karena tidak cukup melindungi data dan privasi pengguna. Karena pemrogram dapat menggunakan paradigma desain Web 3 dalam kode Web 2 mereka dan memperkenalkan bahasa dan kode Web 2 ke dalam blockchain, zk-ASM generik dapat mewakili titik penggabungan di dunia Web 2 dan Web 3 [15]. Dalam hal ini, zk-ASM memungkinkan kita membayangkan kembali Internet yang lebih aman dan tidak dapat dipercaya.

🐦 @0xfishylosopher

📅 17 Desember 2022

Penafian: informasi yang disajikan di atas adalah murni pendidikan, bukan merupakan nasihat keuangan, dan mewakili pandangan penulis sendiri. Delphinus Lab adalah perusahaan portofolio dari Web3.com Ventures.

Referensi

[1] https://z.cash/technology/zksnarks/

[2] https://cs251.stanford.edu/lectures/lecture14.pdf

[3] https://www.britannica.com/science/fundamental-theorem-of-algebra

[4] Membangun SNARK yang efisien: https://cs251.stanford.edu/lectures/lecture15.pdf

[5] Contoh dari: https://www.tutorialspoint.com/assembly_programming/assembly_loops.htm

[6] https://en.wikipedia.org/wiki/Assembly_lingual

[7] https://www.alchemy.com/overviews/zkevm

[8] Untuk daftar opcode: https://ethereum.org/en/developers/docs/evm/opcodes/

[9] https://wiki.polygon.technology/docs/zkEVM/zkASM/introduction

[10] https://wiki.polygon.technology/docs/zkEVM/zkASM/some-examples

[11] https://vitalik.ca/general/2022/08/04/zkevm.html

[12] https://blog.developer.adobe.com/understanding-webassembly-wasm-d5b592208ecc

[13] https://jhc.sjtu.edu.cn/~hongfeifu/manuscriptb.pdf

[14] https://hyperoracle.medium.com/zkwasm-the-next-chapter-of-zk-and-zkvm-471038b1fba6

[15] https://delphinuslab.com/zk-wasm/