perkenalan

Bukti tanpa pengetahuan, terutama zk-SNARKs (Argumen Pengetahuan Non-Interaktif Ringkas Pengetahuan Nol), mungkin merupakan salah satu teknologi mutakhir yang paling penting di Web 3. Saat ini, sebagian besar perhatian media dan investasi di subbidang ini terfokus pada zk-Rollups, solusi penskalaan yang memberikan skalabilitas besar-besaran pada blockchain L1 seperti Ethereum. Meskipun demikian, zk-Rollups sama sekali bukan satu-satunya penggunaan zk-SNARKs. Artikel ini akan memberikan analisis mendalam tentang konsep zero-knowledge assembly code (zkASM), mengevaluasi kasus penggunaannya di zk-Rollups dan aspek lainnya, serta mengeksplorasi potensinya dalam menciptakan kembali Internet dari tingkat teoretis.

Prinsip teknis

Seperti namanya, zk-ASM terutama terdiri dari dua komponen teknis: ZK dan ASM. ZK mengacu pada zk-SNARKs, yang merupakan argumen pengetahuan non-interaktif yang ringkas, dan ASM mengacu pada kode perakitan. Untuk memahami potensi zk-ASM, pertama-tama kita harus memahami dasar teori dari dua konsep yang tampaknya tidak jelas ini.

zk-SNARK

zk-SNARKs adalah permata mahkota zk-Proofs: ini adalah cara ringkas untuk membuktikan bahwa suatu pernyataan benar tanpa mengungkapkan informasi apa pun tentang data yang sedang dibuktikan. Misalnya, seseorang mendeklarasikan "Saya tahu ada m sehingga C(m) = 0", dengan m adalah gigabyte informasi dan C adalah fungsi. Zk-SNARK akan menjadi bukti singkat (<1GB) yang dengan cepat memverifikasi keberadaan m tanpa memaparkan informasi apa pun tentang m (selain informasi publik).

Apa sebenarnya "C(m)" ini? Apa gunanya? Fungsi ini sebenarnya adalah rangkaian aritmatika, atau representasi grafik asiklik berarah (DAG) dari fungsi tertentu yang ingin kita jalankan, seperti yang ditunjukkan pada gambar. Pada dasarnya, "m" adalah data entri rangkaian, dan "node" spesifik dalam rangkaian adalah gerbang logika atau operasi individual. Misalnya, "2" dan "3" dapat diinput ke node "+", dan kemudian "5" di-output ke operator berikutnya. Hal ini memungkinkan operasi aritmatika atau logika apa pun untuk dikodekan dalam "rangkaian aritmatika".

Setelah kode zk-SNARK yang ingin kita jalankan diwakili oleh rangkaian aritmatika, kita dapat mulai membangun zk-SNARK ini. Pada dasarnya, kelayakan zk-SNARK ditentukan oleh "Teorema Dasar Aljabar". Menurut Teorema Dasar Aljabar, polinomial dengan derajat "d" memiliki paling banyak akar "d". Teknik matematika ini dibagi menjadi dua langkah: (1) mengubah fungsi "f(m)" yang perlu dibuktikan menjadi polinomial dan terus menggunakan polinomial tersebut, dan (2) menggunakan "Teorema Dasar Aljabar" untuk menangani dengan polinomial dan memberikan bukti keringkasan. Dalam istilah teknis, bagian pertama disebut “Polynomial Commitment Scheme” (PCS) dan bagian kedua disebut “Polynomial Interaction Proof of Oracle” (PIOP).

Komposisi SNARK sirkuit universal yang efisien. Sumber: https://cs251.stanford.edu/lectures/lecture15.pdf

Implementasi spesifik PCS dan PIOP berada di luar cakupan artikel ini, namun ini memberi kita gambaran kasar tentang langkah-langkah inti zk-SNARK:

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

  2. Encode fungsi ini ke dalam rangkaian aritmatika C(m)

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

  4. Jalankan PIOP dan dapatkan bukti singkat ukuran log(m).

Sekarang ada zk-SNARK yang disesuaikan, yang dapat membuktikan bahwa seseorang mengetahui informasi tertentu tanpa mengungkapkan konten spesifik dari informasi tersebut.

kode perakitan

Bagian kedua dari teka-teki zk-ASM adalah kode perakitan. Ini adalah bahasa mirip bahasa yang berisi instruksi bahasa tingkat sangat rendah yang mudah dibaca oleh mesin tetapi sulit diuraikan oleh manusia. Berbeda dengan bahasa tingkat tinggi seperti Python, Java atau bahkan C, bahasa assembly mengandung beberapa fungsi yang sangat primitif, serta MOVE (pindah), CMP (bandingkan), ADD (penambahan), dan JMP (lompat) pada prosesor. dan tingkat pendaftaran. Misalnya kode Python untuk mengetik angka 1 sampai 9 di layar adalah `123456789`:

Itu mudah dimengerti, bukan? Mari kita lihat versi perakitan x86-nya:

Ini jauh lebih merepotkan, dan ini hanyalah operasi yang sangat sederhana. Dalam hal ini, mengapa menggunakan bahasa assembly? Seperti disebutkan di atas, meskipun instruksi ini tidak mudah dibaca oleh manusia, instruksi ini dengan mudah "dirangkai" menjadi kode byte `110011001` untuk dibaca dan dijalankan oleh mesin (disebut assembler). Sebagai perbandingan, meskipun bahasa tingkat tinggi seperti Python dan Java lebih mudah dibaca, prosesor tidak dapat langsung mengeksekusi program yang ditulis dalam bahasa tersebut. Kita memerlukan "kompiler" untuk mengubah kode Python atau Java yang kita tulis menjadi kode rakitan di atas, dan menyerahkannya ke mesin untuk dirakit dan dieksekusi. Alasan mengapa bagian kode Python atau Java yang sama dapat berjalan dengan lancar pada prosesor dan sistem operasi yang berbeda adalah karena kompiler melakukan pekerjaan berat dan mengkompilasi kode sumber ke dalam bahasa rakitan untuk prosesor atau sistem operasi tertentu.

Karena semua bahasa dikompilasi ke kode assembly (yang selanjutnya dikompilasi menjadi biner yang dapat dieksekusi), assembly pada dasarnya seperti "ibu dari semua bahasa". Sekarang dengan asumsi bahwa kita dapat mengonversi semua operan dalam bahasa rakitan (seperti x86 atau RISC-V) menjadi representasi rangkaian aritmatika, kita dapat memberikan bukti zk-SNARK untuk semua operan dalam bahasa rakitan ini. Secara teori, ini berarti kami dapat menyediakan zk-SNARK untuk program apa pun yang ditulis dalam bahasa tingkat tinggi apa pun yang dikompilasi ke perakitan, seperti Python atau Java. Karena itu, zk-ASM layak untuk dipelajari dengan cermat.

Aplikasi praktis

Rollup zk-EVM: Poligon zk-ASM

Salah satu aplikasi terpenting zk-ASM adalah pembuatan zk-Rollup yang kompatibel dengan Mesin Virtual Ethereum, atau zk-EVM. zk-EVM sangat penting untuk skalabilitas blockchain karena memungkinkan pemrogram untuk menerapkan rantai L2 berbasis zk-Rollup tanpa membuat terlalu banyak (atau apa pun) modifikasi pada kode. Dalam hal ini, zk-EVM Polygon adalah contoh umum bagaimana zk-ASM dapat digunakan untuk mencapai tujuan ini.

Pengembang di rantai publik Ethereum L1 biasanya menggunakan bahasa Solidity, yang merupakan bahasa pemrograman tingkat tinggi yang mirip dengan bahasa C. Sebelum kode Solidity dijalankan di blockchain L1, terlebih dahulu akan dikompilasi menjadi serangkaian kode operasi EVM, seperti ADD, SLOAD, EQ, dll. Secara default, proses ini jelas tidak membuat zk-Proof apa pun. Kecerdasan Polygon adalah menciptakan cara untuk menerjemahkan setiap opcode EVM ke dalam zk-ASM yang ditulis khusus, yang sangat ramah zk-SNARK. L2 zk-EVM mereka kemudian mengeksekusi zk-ASM sambil membuat sirkuit zk-SNARK ASM untuk membuat bukti zk-SNARK. Misalnya, kode operasi ADD di EVM akan diterjemahkan ke zk-ASM Polygon sebagai berikut:

Karena keajaiban Polygon zk-EVM terjadi pada tingkat perakitan, ia berada dua tingkat "lebih rendah" daripada lapisan kode yang disentuh Ethereum biasa, lapisan "Soliditas". Oleh karena itu, sebagian besar pengembang dapat mem-porting kode EVM yang mereka buat untuk mainnet Ethereum langsung ke Polygon zk-EVM. Pada saat yang sama, Polygon zk-EVM "mempertahankan" tumpukan teknologi Ethereum hingga ke tingkat kode operasi, dan semua infrastruktur debugging yang bergantung pada analisis kode operasi yang dikompilasi masih dapat digunakan secara utuh. Ini berbeda dengan desain zk-EVM lain yang tidak menyediakan zk-Proof di level opcode, seperti zk-Sync. Oleh karena itu, meskipun Polygon menemukan dan memverifikasi bahasa rakitannya sendiri, seperti yang dikatakan Buterin, "Ia masih dapat memverifikasi kode EVM, ia hanya menggunakan logika internal yang berbeda."

Melampaui Rollup: zk-WASM

zk-EVM bukanlah satu-satunya kasus penggunaan untuk zk-ASM. Seperti disebutkan di atas, bahasa rakitan pada dasarnya adalah "ibu dari semua bahasa", dan membuat zk-ASM akan membuka zk-Proofs untuk program tujuan umum yang ditulis dalam bahasa apa pun yang dikompilasi ke bahasa rakitan. Majelis Web (WASM) adalah salah satu bahasa rakitan terpenting yang muncul. Ini pertama kali dirilis pada tahun 2018 dan bertujuan untuk meningkatkan kecepatan eksekusi aplikasi web dan menyediakan suplemen eksekusi untuk Javascript (bahasa pemrograman utama di balik Web).

Pada dasarnya, seiring dengan berkembangnya Web selama bertahun-tahun, aplikasi Web pun semakin berkembang dalam ukuran dan kompleksitas, yang berarti bahwa browser harus mengkompilasi segala sesuatu yang ditulis dalam Javascript, sering kali dengan kecepatan yang sangat lambat, dan harus mengulangi proses "kompilasi-Optimalkan-Muat Ulang" yang rumit. proses. WebAssembly menghilangkan ketergantungan pada mesin eksekusi browser yang kompleks dengan menyediakan bahasa assembly yang portabel, modular, dan mudah dijalankan. Selain itu, WASM sebagai bahasa assembly memungkinkan pemrogram untuk menulis cuplikan kode menggunakan bahasa seperti C, C++, Rust, Java, atau Ruby yang dapat dijalankan langsung di browser. Oleh karena itu WASM telah menjadi teknologi pilihan untuk "menyediakan fungsi terdistribusi tanpa server".

Peran apa yang dapat dimainkan oleh zk-SNARK dalam hal ini? WASM unik karena merupakan teknologi sisi klien yang berinteraksi langsung dengan data yang dimasukkan pengguna. Hal ini sering kali mencakup data sensitif seperti kata sandi dan informasi pribadi, sehingga kita memerlukan teknologi yang (1) memastikan bahwa program dijalankan secara akurat, dan (2) memastikan bahwa informasi sensitif tidak bocor. zk-SNARK adalah solusi sempurna untuk kedua masalah ini, dan oleh karena itu merupakan bagian teka-teki penting bagi WASM.

Pekerjaan pengembangan zk-WASM masih dalam tahap awal, tetapi beberapa proyek baru-baru ini merilis prototipe sirkuit zk-SNARK untuk WebAssembly. Misalnya, simulator zk-SNARK “ZAWA” Delphinus Lab menghadirkan cara untuk menyandikan operan dan semantik mesin virtual WASM ke dalam sirkuit komputasi, sehingga memungkinkannya menghasilkan bukti zk-SNARK. Rangkaian zk-WASM tentunya akan terus dioptimalkan agar program yang ditulis dalam bahasa tujuan umum seperti C, C++, Rust, dan Ruby dapat mengadopsi paradigma zk-Proofs.

sebagai kesimpulan

Artikel ini mengeksplorasi dasar teori zk-ASM dan mengkaji dua kasus penggunaan paradigma zk-ASM: Polygon menggunakan zk-ASM untuk membuat zk-EVM pada tingkat kode operasional; dan menerapkan zk-SNARKs ke WebAssembly untuk membuat zk-WASM. Pada akhirnya, zk-ASM berjanji untuk menggabungkan interoperabilitas dan skala Web 2 dengan kepercayaan dan keamanan Web 3.

Di satu sisi, blockchain semakin berupaya untuk menerobos hambatan throughput saat ini, dan di sisi lain, pendekatan Web 2 semakin dikritik karena gagal melindungi data dan privasi pengguna secara memadai. Karena pemrogram dapat menggunakan paradigma desain Web 3 dalam kode Web 2, dan membawa bahasa dan kode Web 2 ke dalam blockchain, zk-ASM universal diharapkan menjadi titik pertemuan antara dunia Web 2 dan Web 3. Mengingat hal ini, zk-ASM memungkinkan kita membayangkan kembali Internet yang lebih aman dan tidak dapat dipercaya.