Rollup adalah kategori solusi penskalaan Layer 2 blockchain. Dalam skema Rollup, operator proyek menjalankan platform Layer 2 yang relatif independen di bawah rantai utama yang diperluas (yaitu, Layer 1). Pengguna dapat menjalankan kontrak atau mentransfer token di platform Layer 2.
Keamanan platform Layer 2 dijamin oleh blockchain Layer 1 yang diandalkannya. Ketika blok baru dibuat di Layer 2, informasi transaksi dari blok Layer 2, serta root keadaan setelah transaksi dari Layer 2, dikemas sebagai transaksi Rollup dan dipublikasikan di rantai Layer 1. Eksekusi transaksi sebenarnya dan perubahan keadaan diproses di platform Layer 2 di bawah rantai utama, dan Layer 1 hanya perlu memverifikasi kebenaran transisi keadaan Layer 2. Karena biaya memverifikasi kebenaran transisi keadaan jauh lebih rendah daripada menjalankan transaksi ini di Layer 1, Layer 2 dapat mencapai ekspansi platform Layer 1. Platform Layer 2 dapat menawarkan throughput transaksi yang lebih tinggi dan biaya transaksi yang lebih rendah dibandingkan dengan Layer 1 sambil mempertahankan keamanan yang setara.
Dibandingkan dengan skema transaksi di luar rantai lainnya, Rollups memiliki dua karakteristik:
Berdasarkan metode verifikasi pembaruan status Layer 2 oleh rantai utama, saat ini ada dua jenis solusi teknologi Rollup utama. Salah satunya adalah Optimistic Rollup. Dalam jenis skema ini, kontrak rantai utama tidak langsung memverifikasi status baru yang diajukan oleh Layer 2. Sebaliknya, periode tantangan disiapkan untuk setiap status baru yang diajukan. Karena Rollup mengirimkan semua informasi transaksi ke rantai utama dan membuatnya menjadi publik, siapa pun dapat memverifikasi pembaruan status (terutama ketika pembaruan melibatkan dompet mereka sendiri). Jika status baru tidak benar, verifikator dapat menghasilkan bukti penipuan terhadap status yang salah dan mengirimkannya dalam periode tantangan, sehingga membatalkan pembaruan status yang tidak benar.
Jenis solusi Rollup lainnya adalah zk Rollup. Dalam skema ini, setelah mengeksekusi pembaruan status Layer 2, operator Layer 2 harus memberikan bukti pengetahuan nol tentang kebenaran pembaruan status dan mengirimkannya ke rantai utama bersama dengan pembaruan status. Kontrak di rantai utama akan memverifikasi bukti untuk menentukan kebenaran pembaruan status.
Dibandingkan dengan skema Optimistic Rollup, zk Rollup tidak memerlukan periode tantangan yang panjang untuk akhirnya mengonfirmasi transaksi Layer 2 dan bisa dikonfirmasi lebih cepat. Selain itu, zk Rollup tidak bergantung pada asumsi bahwa selalu akan ada verifiers jujur dalam jaringan yang akan segera mengirimkan bukti kecurangan saat kecurangan terjadi. Namun, pada saat yang sama, zk Rollup juga menghadapi masalah seperti biaya komputasi tinggi dari teknologi bukti zero-knowledge, kompleksitas, dan kesulitan dalam pengembangan, yang menghambat implementasi praktis teknologi zk Rollup dalam Rollups. Dengan perkembangan lebih lanjut dari teknologi bukti zero-knowledge dalam dua tahun terakhir, rintangan-rintangan ini secara bertahap mulai teratasi. Teknologi zk Rollup mulai menguasai bagian pasar Layer 2 yang semakin besar.
Seperti yang ditunjukkan pada gambar di bawah, dalam bidang penskalaan lapisan Rollup layer-2, zkRollup sudah menduduki lebih dari setengah wilayah dan sedang berkembang dengan pesat.
Data yang diambil pada: 18 Januari 2024
Selama perkembangannya, zkRollup sebagian besar telah melalui dua tahap. Jenis pertama adalah non-general zkRollup, sedangkan jenis kedua adalah zkRollup umum yang mampu menjalankan kontrak sembarang yang lengkap secara Turing.
Perbedaan antara kedua jenis teknologi zkRollup ini terutama terletak pada apakah platform Layer 2 mengeksekusi logika khusus terbatas yang ditulis oleh penyedia platform atau logika kontrak cerdas sewenang-wenang yang ditulis oleh pengguna dalam transaksi.
Pada proyek zkRollup non-umum (seperti zkSync Lite, yang menempati peringkat ke-8 dalam gambar di atas), pengguna hanya dapat melakukan beberapa jenis operasi transaksi, seperti transfer FT (token yang dapat dipertukarkan), pembayaran, pertukaran, dan transfer NFT (token yang tidak dapat dipertukarkan). Logika transaksi untuk operasi-operasi ini hanya dapat ditentukan dan diimplementasikan oleh pemilik proyek.
Melalui proyek zkRollup seperti itu, kita dapat mentransfer dengan biaya yang jauh lebih rendah dibandingkan dengan Ethereum mainnet dan mendapatkan throughput transaksi yang lebih tinggi. Namun, jika kita ingin mencoba kontrak menarik di rantai, kita tidak akan dapat melakukannya.
Mengapa zkRollups khusus tidak memungkinkan pengguna untuk menyusun dan menggunakan kontrak pintar mereka sendiri? Hal ini membawa kita kembali ke arsitektur bukti dari zkRollup itu sendiri.
Untuk memastikan bahwa transisi keadaan L2 benar dan dapat dipercaya, dalam zkRollup, semua logika transisi keadaan L2 perlu ditulis sebagai sirkuit bukti pengetahuan nol dan diverifikasi oleh kontrak L1. Hanya keadaan yang lolos verifikasi bisa diterima oleh L1 dan akhirnya menyelesaikan Rollup. Proses ini memerlukan bahwa semua logika eksekusi transaksi platform zkRollup diverifikasi dalam sirkuit bukti pengetahuan nol. Namun, mendukung eksekusi logika kontrak sembarang dalam sirkuit bukti pengetahuan nol adalah sebuah tantangan (alasan dari kesulitan ini akan dijelaskan nanti dalam teks). Akibatnya, proyek zkRollup awal seringkali hanya mendukung sejumlah terbatas transaksi yang relatif sederhana.
Kemampuan untuk menjalankan hanya sejumlah tetap transaksi sederhana jelas tidak memenuhi harapan kami untuk zkRollup. Untungnya, teknologi zkVM (Mesin Virtual Zero-Knowledge) telah menyelesaikan kesulitan dalam membuktikan eksekusi kode Turing-lengkap sembarang dalam sirkuit bukti zero-knowledge, menjadikan platform zkRollup umum sebagai kemungkinan. Selanjutnya, artikel ini akan memperkenalkan prinsip-prinsip implementasi zkVM, memungkinkan pembaca memahami bagaimana bagian inti teknologi zkRollup umum ini beroperasi.
Sebelum memperkenalkan prinsip-prinsip zkVM, kami akan memberikan pengantar singkat mengenai teknologi bukti pengetahuan nol. Di sini, kita tidak perlu memahami secara detail prinsip matematika yang mendasari dari bukti pengetahuan nol; cukuplah untuk memahami apa yang dapat dilakukan oleh bukti pengetahuan nol, bagaimana cara penggunaannya, dan pembatasan yang diberlakukan oleh sirkuit bukti khusus mereka.
Bukti pengetahuan nol dalam zkRollup berfungsi untuk membuktikan bahwa transaksi Layer 2 telah dieksekusi dengan benar dan bahwa status Layer 2 telah diperbarui dengan benar.
Untuk mencapai tujuan ini, sirkuit zkVM perlu membuktikan bahwa setiap kontrak pintar yang diterapkan pada Lapisan 2 telah dieksekusi dengan benar. Sebelum memperkenalkan prinsip-prinsip zkVM, kita perlu membahas peran bukti pengetahuan nol dan bagaimana cara kerjanya.
Mengapa Bukti Pengetahuan Nol Diperlukan
Bukti pengetahuan nol adalah primitif kriptografi yang memungkinkan seorang pembuktikan meyakinkan seorang pemeriksa tentang kebenaran suatu pernyataan tanpa mengungkapkan informasi tambahan kepada pemeriksa.
Bukti pengetahuan nol memiliki tiga properti inti:
Dengan kelengkapan bukti pengetahuan nol, ketika pemberi bukti menyelesaikan perhitungan kompleks, mereka dapat menghasilkan bukti yang meyakinkan verifier bahwa data output yang diperoleh dari data input adalah hasil yang diberikan oleh pelaksana. Kegunaan bukti pengetahuan nol memastikan bahwa ketika pelaksana memberikan hasil yang salah, mereka tidak dapat menghasilkan bukti yang valid.
Oleh karena itu, dengan kelengkapan dan kebenaran bukti zero pengetahuan, kita dapat dengan percaya diri mengalihkan perhitungan kompleks ini kepada pihak lain dan memverifikasi melalui proses verifikasi yang relatif sederhana apakah perhitungannya benar, tanpa perlu percaya kepada pihak yang melakukan pengalihan.
Selain tiga properti inti dari bukti pengetahuan nol, skema zk-SNARK yang banyak digunakan juga memiliki karakteristik kekompakan. Ini berarti bahwa untuk logika kompleks apa pun yang terbukti menggunakan bukti pengetahuan nol, ukuran bukti yang dihasilkan dan waktu yang dibutuhkan untuk memverifikasi bukti keduanya tetap dan relatif kecil. Hal ini memungkinkan zk-Rollup untuk memindahkan perhitungan pembaruan status ke luar rantai dan hanya memverifikasi kebenaran operasi di rantai, sehingga solusi penskalaan menjadi layak.
Proses Bukti Pengetahuan Nol
Selanjutnya, artikel ini akan menggunakan perhitungan sederhana di bawah ini sebagai contoh untuk menjelaskan proses bukti pengetahuan nol.
c=a²+b+5
Untuk menjelaskan aspek pengetahuan nol dalam bukti pengetahuan nol, kita akan menetapkan variabel a dan c sebagai nilai publik dari bukti pengetahuan nol ini, dengan b sebagai masukan rahasia yang hanya diketahui oleh pihak pembuktikan. Karena perhitungan kita sangat sederhana, pemeriksa dapat dengan mudah menyimpulkan nilai masukan rahasia dari nilai publik. Hal ini tidak memengaruhi sifat pengetahuan nol dari metode bukti pengetahuan nol itu sendiri, karena hanya menjamin bahwa pemeriksa tidak dapat memperoleh informasi tentang masukan rahasia dari proses bukti.
Saat membuktikan, pembuktian pertama-tama memilih nilai untuk a dan b masing-masing sebagai input dan menghitung nilai c. Di sini, kita atur a = 3, b = 2, maka c = 16. Setelah menyelesaikan semua perhitungan, pembuktian dapat menghasilkan bukti pengetahuan nol untuk nilai dan operasi ini.
Setelah menyelesaikan bukti, si pembuktikan akan memberikan si pemeriksa masukan publik dari bukti (yaitu, nilai-nilai a dan c) serta bukti pengetahuan nol.
Setelah menerima bukti, pemeriksa dapat, dengan memvalidasi bukti pengetahuan nol, yakin bahwa si pembuktikan telah menggunakan input rahasia b, yang membuat rumus di atas benar ketika a = 3 dan c = 16 (yaitu, nilai input publik), dan tidak dapat memperoleh informasi apa pun di luar input publik (a = 3, c = 16).
Bagian selanjutnya dari artikel ini akan memperkenalkan proses bukti yang spesifik. Ketika kami perlu membuktikan sebuah komputasi menggunakan metode bukti tanpa pengetahuan, kami pertama-tama perlu mewakili komputasi tersebut dalam bentuk sirkuit aritmatika yang dapat diterima oleh algoritma bukti tanpa pengetahuan. Sirkuit aritmatika adalah representasi Turing lengkap dari komputasi. Sesuai namanya, sirkuit aritmatika adalah sirkuit komputasi yang terdiri dari gerbang-gerbang yang melakukan operasi aritmatika. Dalam contoh kami, hasil konversi ditampilkan dalam gambar. Anda mungkin perhatikan bahwa selain input publik a dan c dan input rahasia b yang kami sebutkan, ada dua nilai tambahan, d dan e. Ini adalah variabel-variabel perantara yang digunakan dalam proses komputasi.
Kita dapat menganggap setiap kabel dalam rangkaian aritmatika sebagai nilai, yang bisa menjadi input publik, input rahasia, atau variabel perantara. Setelah memperluas perhitungan ke dalam rangkaian aritmatika, setiap variabel perantara akan memiliki tempatnya dan digunakan dalam proses bukti. Satu-satunya perbedaan antara mereka dan input adalah bahwa nilai mereka tidak dimasukkan langsung oleh pemberi bukti tetapi ditentukan oleh nilai input lainnya dalam rangkaian aritmatika.
Kita dapat melihat rangkaian aritmatika sebagai dua bagian: satu bagian adalah semua nilai numerik yang muncul dalam rangkaian, dan bagian lainnya adalah hubungan (kendala) antara nilai-nilai tersebut. Kami biasanya merujuk kepada input publik dalam rangkaian sebagai pernyataan (dalam contoh kami, a dan c), dan semua nilai lainnya, termasuk input rahasia (b) dan variabel perantara (d dan e), sebagai saksi.
Menurut logika rangkaian, ketika kita memiliki input publik sebagai pernyataan dan input rahasia sebagai saksi, kita dapat menghitung semua nilai saksi dalam rangkaian.
Oleh karena itu, rangkaian gerbang dari rangkaian aritmatika juga dapat direpresentasikan dalam bentuk berikut:
pernyataan:
a,c
saksi:
b,d,e
konstrain:
d = a * a
e = b + 5
c = d + e
Setelah sirkuit yang akan dibuktikan diaritmetika, algoritma bukti pengetahuan nol perlu memproses kendala sirkuit dan mengonversinya ke dalam bentuk yang diperlukan oleh algoritma untuk pembuatan dan validasi bukti. Setelah diproses, sirkuit menghasilkan VK (Kunci Verifikasi) berukuran tetap yang tidak terkait dengan ukuran sirkuit. Verifikasi dapat memverifikasi bukti pengetahuan nol dari sirkuit yang sesuai melalui kunci verifikasi. Kunci verifikasi ini agak mirip dengan komitmen terhadap sirkuit. Jika terjadi perubahan pada kendala, kunci verifikasi yang sesuai juga akan berubah.
Dalam aplikasi sebenarnya, pengguna bukti pengetahuan nol perlu menulis logika yang mereka perlukan ke dalam kode sumber sirkuit zk dan menghasilkan VK yang sesuai melalui audit. VK ini diserahkan ke verifikator. Masukan publik yang dibuktikan oleh pengklaim, bersama dengan bukti yang dihasilkan, diserahkan, dan verifikator dapat memverifikasi apakah masukan publik ini memenuhi kendala. Dalam contoh ini, pengklaim dapat menghasilkan bukti dengan nilai a, b, dan c. Verifikator dapat memverifikasi apakah a2 + b sama dengan C tanpa melakukan operasi ini.
Keterbatasan Sirkuit Bukti Pengetahuan Nol
Meskipun sirkuit zk adalah Turing lengkap dan dapat mewakili setiap komputasi, karena perlu mengonversi komputasi ke dalam bentuk representasi khusus dari sirkuit aritmatika, ada beberapa batasan tambahan dalam menulis sirkuit aritmatika.
Dalam program komputer yang lebih akrab bagi kita, kita dapat mengontrol cabang-cabang dari eksekusi program dengan pernyataan if-else. Hanya cabang yang dipilih dalam program yang dieksekusi. Namun, dalam proses bukti pengetahuan nol-knowledge, komputasi diubah menjadi sirkuit, dan tidak ada konsep jalur eksekusi atau aliran kontrol. Oleh karena itu, kita tidak dapat memilih cabang tertentu untuk dieksekusi dalam sirkuit aritmatika.
Tentu saja, ini tidak berarti bahwa kita tidak bisa menggunakan cabang dan pilihan dalam rangkaian. Ini hanya berarti bahwa dalam rangkaian, semua cabang, baik yang dipilih maupun tidak, akan dieksekusi dan berkontribusi pada produksi bukti. Pemilihan cabang hanya memengaruhi hasil cabang mana yang akan dioutputkan ke variabel berikutnya.
Ambil operasi berikut sebagai contoh:
jika (bendera) {
c = x + x
} else {
c = x * x
}
Ketika operasi ini dikonversi menjadi rangkaian aritmatika, itu akan diubah menjadi batasan yang ditunjukkan di bawah ini. Jelas, dua saksi baru, temp1 dan temp2, akan ditambahkan ke rangkaian. Selain itu, nilai x+x dan nilai x*x akan keduanya dihitung.
Yaitu, dalam sirkuit zk, semua cabang dan logika akan dihitung, apakah mereka dijalankan atau tidak.
temp1 = x + x
temp2 = x * x
c = bendera temp1 + (1-flag)temp2
Karena keterbatasan ini, mendukung pemilihan bersyarat dalam sirkuit bukti pengetahuan nol cukup sulit. Bagaimana cara membuktikan jalur eksekusi logika kontrak pintar dengan banyak variasi dalam bukti pengetahuan nol adalah salah satu tantangan utama dari mesin virtual zk.
Kami menjelaskan VM melalui model mesin keadaan universal. Sebuah VM adalah mesin keadaan yang bertransisi keadaan saat instruksi diproses. Mari kita ilustrasikan bagaimana mesin virtual dibuktikan oleh sirkuit pengetahuan nol dengan contoh mesin keadaan yang sangat sederhana.
Kami mengasumsikan mesin keadaan universal ini memiliki register umum (A dan B), dan tambahan, sebuah register Program Counter yang menyimpan nomor instruksi saat ini.
Keadaan dari registernya sebelum menjalankan instruksi
Gambar di bawah ini menunjukkan alur kerja dasar dari rangkaian pembuktian mesin virtual ZK:
Negara 0 dapat dianggap sebagai negara awal mesin virtual ini sebelum dijalankan. Negara awal, setelah total m instruksi, mencapai negara final m. Selain negara awal, mesin virtual ini memiliki dua tabel masukan reguler:
Dalam gambar, proses eksekusi instruksi ke-n diabstraksikan dan ditampilkan di sebelah kiri. Status mesin, State n, bertransisi ke State n+1 setelah eksekusi instruksi ke-n. Sirkuit yang sama, setelah m iterasi, mencapai eksekusi m instruksi di vm.
Ada dua isu di sini.
Satu adalah bagaimana menjalankan instruksi yang berbeda dalam suatu rangkaian tetap? Saat menjalankan bytecode kontrak, tidak mungkin untuk menentukan instruksi ke-n yang dieksekusi, sehingga logika rangkaian aktual di sini tidak dapat ditentukan.
Yang kedua adalah bagaimana membuktikan apakah jumlah instruksi yang akan dieksekusi bukan m?
Untuk pertanyaan pertama, solusinya adalah menerapkan logika untuk semua instruksi yang mungkin dalam rangkaian. Kemudian gunakan Selektron, berdasarkan instruksi, untuk memilih salah satunya sebagai keadaan berikutnya, mirip dengan if-else dalam rangkaian khusus yang disebutkan sebelumnya.
Untuk pertanyaan kedua, kita tidak dapat langsung mengubah jumlah instruksi dalam sirkuit. Hal ini karena setiap instruksi dalam sirkuit memerlukan segmen sirkuit independen untuk diimplementasikan. Jika jumlah instruksi bertambah atau berkurang, sirkuit akan berubah, dan kunci verifikasi yang sesuai juga akan berubah. Hal ini membuat tidak mungkin untuk memenuhi persyaratan verifikasi logika apa pun dalam sirkuit tetap.
Untuk menyelesaikan masalah ini, instruksi noop yang tidak akan mengubah keadaan dapat ditambahkan ke set instruksi. Oleh karena itu, ada batas atas untuk jumlah instruksi yang dapat dieksekusi oleh setiap rangkaian tetap. Rangkaian zkVM dapat dilihat sebagai wadah dengan jumlah slot instruksi yang tetap. Jika diperlukan lebih banyak instruksi, diperlukan rangkaian yang lebih besar. Dalam bukti nyata, rangkaian ukuran yang sesuai dapat dipilih sesuai kebutuhan.
Membuktikan Instruksi Dasar
Berikut adalah beberapa instruksi komputasi dasar sebagai contoh bagaimana instruksi dasar dalam sirkuit terbukti:
Gambar tersebut menunjukkan bagan alur rangkaian pembuktian instruksi. Rumus-rumus di bawah ini adalah batasan rangkaian untuk bukti.
Kedua kendala ini dapat membuktikan beberapa instruksi dasar untuk register umum A dan B yang terdaftar di sudut kanan atas. Bukti-bukti ini dapat memuat nilai dari tabel input atau nilai segera dari instruksi ke dalam register atau menambahkan nilai di register A dan B dan menulisnya kembali ke register.
Dari gambar ini, kita dapat melihat bahwa untuk membangun batasan untuk perubahan keadaan, rangkaian memperkenalkan beberapa keadaan kontrol tambahan:
Logika komputasi antara register bantu ini dan register tujuan umum diimplementasikan oleh rumus di bawah ini. Pembaca yang tertarik dapat menggantikan nilai-nilai yang sesuai ke dalam rumus kendala untuk memverifikasi. Dapat dilihat bahwa dengan kedua kendala ini, instruksi penambahan aritmatika dasar dapat diimplementasikan. Jika operasi lebih lanjut diperlukan, lebih banyak kendala instruksi harus ditambahkan.
Kembali ke diagram proses dasar, kita dapat menganggap rangkaian komputasi dalam bagian ini sebagai instruksi dalam proses keseluruhan. Selector akan memilih apakah hasil yang dihasilkannya adalah keadaan selanjutnya yang akan diadopsi oleh mesin keadaan. Keadaan tambahan yang diperlukan oleh rangkaian dalam bagian ini dihasilkan oleh instruksi yang ditunjuk oleh register PC.
Pemulihan instruksi diimplementasikan oleh sirkuit pencarian khusus, yang dapat membuktikan pemulihan segmen data dari tabel tetap melalui indeks. Oleh karena itu, sirkuit zkVM dapat membuktikan transisi status yang dieksekusi oleh mesin virtual yang ditentukan oleh PC.
Membuktikan Penilaian Bersyarat dan Loncatan Aliran Kontrol
Kemampuan mesin negara untuk menjalankan logika kompleks bergantung pada instruksi kondisional dan lompatan. Dalam kontrak sebenarnya, kita sering perlu menangani logika yang mengubah jalur eksekusi berdasarkan kondisi, jadi sirkuit-sirkuit tersebut diperlukan.
Perlu dicatat di sini bahwa sirkuit zkVM bukanlah modul yang benar-benar menjalankan logika kontrak dan menghitung hasilnya. Yang sebenarnya dilakukan sirkuit zkVM adalah membuktikan proses perhitungan dari logika kontrak. Oleh karena itu, saat membuktikan, diperlukan untuk mengisi proses urutan instruksi yang dieksekusi sebenarnya dalam sirkuit, memverifikasi melalui sirkuit apakah kondisi untuk loncatan ini terpenuhi, dan kemudian membuktikan bahwa aliran instruksi yang dieksekusi telah melakukan loncatan yang benar.
Pertama, kami memperkenalkan bukti penilaian kondisi:
Mengambil contoh penilaian apakah operan dalam instruksi ke-i sama dengan nol. Kami menambahkan status bantu isZero untuk hasil penilaian. Jika nilai yang dinilai adalah 0, maka nilai status bantu isZero adalah 1; jika nilai yang dinilai adalah nilai lain selain 0, maka isZero adalah 0.
Proses ini dibatasi oleh dua rumus dalam diagram.
Validitas kendala ini terkait dengan sifat matematika dari kurva eliptik yang digunakan dalam bukti pengetahuan nol. Setiap nilai dalam sirkuit bukti pengetahuan nol adalah elemen dalam bidang terbatas pada kurva eliptik. Jika nilainya bukan 0, harus ada elemen invers yang, ketika dikalikan dengan dirinya sendiri, menghasilkan 1. Dengan menggunakan sifat ini, dengan dua kendala dalam diagram, mungkin untuk memverifikasi apakah suatu nilai adalah nol dan mengubahnya menjadi keadaan bantu.
Setelah kita memiliki keadaan bantu isZero ini, kita dapat melanjutkan ke bukti instruksi loncat bersyarat:
Kembali ke diagram proses dasar, jika instruksi saat ini adalah instruksi lompatan bersyarat. Pertama-tama dilakukan pemeriksaan isZero, menentukan apakah kondisi lompatan terpenuhi, dan kemudian memodifikasi nilai PC. Setelah memperbarui nilai PC, eksekusi instruksi berikutnya pertama-tama melibatkan pencarian berdasarkan PC untuk menemukan instruksi setelah lompatan.
Operasi I/O dan Kompleks
Ketika menggunakan sirkuit bukti mesin keadaan umum, untuk menangani transisi keadaan dengan benar, perlu menambahkan keadaan kendali dan batasan yang sesuai untuk setiap instruksi yang didukung selama satu transisi keadaan tunggal. Jumlah nilai keadaan dan batasan ini juga harus dikalikan dengan jumlah instruksi yang didukung oleh zkVM. Bahkan jika tidak ada operasi yang dilakukan dalam program aktual yang dieksekusi oleh zkVM (semua NOP), nilai keadaan ini dan pemeriksaan batasan tidak dapat diabaikan.
Oleh karena itu, menggunakan rangkaian mesin keadaan umum dalam separuh pertama artikel ini untuk mengeksekusi perhitungan kompleks sangat tidak efisien. Jika metode-metode ini digunakan untuk menerapkan perhitungan kompleks, kinerjanya sulit diterima. Selain itu, sulit bagi rangkaian mesin keadaan umum untuk mengeksekusi instruksi kompleks atau berinteraksi langsung dengan dunia luar.
Untuk menyelesaikan masalah ini, implementasi sebenarnya dari zkVM umumnya menggunakan kombinasi sirkuit mesin keadaan umum dan sirkuit bukti khusus untuk membuktikan bagian program secara terpisah dan kemudian menggabungkan bukti-bukti tersebut menjadi satu solusi.
Diagram di sebelah kiri adalah arsitektur rangkaian proyek Scroll, dan diagram di pojok kanan bawah adalah arsitektur rangkaian Polygon. Mereka keduanya menggunakan pendekatan yang mirip seperti yang ditunjukkan dalam diagram di pojok atas.
Mesin negara umum bertanggung jawab atas pembuktian kontrol logika eksekusi program. Pada sebagian besar kontrak, waktu eksekusi aktual bagi bagian logika ini sangat singkat, sehingga membuktikannya dengan mesin negara umum yang tidak efisien masih dapat diterima dari segi efisiensi.
Lebih banyak perhitungan kompleks tetap, seperti hash, operasi pohon MPT, data masukan eksternal, dll., dibuktikan oleh sirkuit khusus.
Mesin keadaan umum dan sirkuit bukti khusus berinteraksi menggunakan tabel pencarian. Setiap kali sirkuit mesin keadaan memanggil operasi-operasi ini, modul-modul yang menghasilkan saksi untuk bukti akan menulis parameter panggilan dan hasil perhitungan dalam tabel pencarian. Dengan demikian, panggilan-panggilan ke operasi-operasi ini dalam sirkuit mesin keadaan disederhanakan menjadi operasi pencarian.
Ketepatan setiap panggilan dan nilai pengembalian di tabel pencarian dibatasi dan dibuktikan oleh rangkaian khusus.
Akhirnya, kendala penyalinan dalam rangkaian menghubungkan rangkaian mesin keadaan, rangkaian khusus, dan tabel pencarian, memeriksa apakah setiap item dalam tabel pencarian dibuktikan oleh rangkaian khusus yang sesuai, dan akhirnya menghasilkan bukti untuk blok lengkap.
Kontrak L1 hanya perlu memverifikasi bukti agregat ini untuk mengonfirmasi kebenaran proses eksekusi mesin virtual secara keseluruhan.
Teknologi bukti nol pengetahuan telah membuatnya memungkinkan untuk membuktikan perhitungan dengan mudah dan cepat, membuka pintu untuk outsourcing proses komputasi dalam lingkungan tanpa kepercayaan. Teknologi ini, saat digunakan dalam blockchain, membebaskan eksekusi dari rantai, memungkinkan blockchain utama untuk fokus pada isu-isu terdesentralisasi dan keamanan. Namun, karakteristik sirkuit bukti nol pengetahuan khusus untuk menjalankan logika tetap hanya membatasi potensi bukti nol pengetahuan pada blockchain, membatasi kemampuan awal zkRollup pada beberapa jenis transaksi.
Namun, dengan perkembangan dan kedewasaan mesin virtual zk, mendukung eksekusi Turing lengkap dari kontrak cerdas sembarang telah menjadi mungkin. Potensi zkRollup akan benar-benar terwujud, mewujudkan visinya untuk memecahkan trilema blockchain.
Rollup adalah kategori solusi penskalaan Layer 2 blockchain. Dalam skema Rollup, operator proyek menjalankan platform Layer 2 yang relatif independen di bawah rantai utama yang diperluas (yaitu, Layer 1). Pengguna dapat menjalankan kontrak atau mentransfer token di platform Layer 2.
Keamanan platform Layer 2 dijamin oleh blockchain Layer 1 yang diandalkannya. Ketika blok baru dibuat di Layer 2, informasi transaksi dari blok Layer 2, serta root keadaan setelah transaksi dari Layer 2, dikemas sebagai transaksi Rollup dan dipublikasikan di rantai Layer 1. Eksekusi transaksi sebenarnya dan perubahan keadaan diproses di platform Layer 2 di bawah rantai utama, dan Layer 1 hanya perlu memverifikasi kebenaran transisi keadaan Layer 2. Karena biaya memverifikasi kebenaran transisi keadaan jauh lebih rendah daripada menjalankan transaksi ini di Layer 1, Layer 2 dapat mencapai ekspansi platform Layer 1. Platform Layer 2 dapat menawarkan throughput transaksi yang lebih tinggi dan biaya transaksi yang lebih rendah dibandingkan dengan Layer 1 sambil mempertahankan keamanan yang setara.
Dibandingkan dengan skema transaksi di luar rantai lainnya, Rollups memiliki dua karakteristik:
Berdasarkan metode verifikasi pembaruan status Layer 2 oleh rantai utama, saat ini ada dua jenis solusi teknologi Rollup utama. Salah satunya adalah Optimistic Rollup. Dalam jenis skema ini, kontrak rantai utama tidak langsung memverifikasi status baru yang diajukan oleh Layer 2. Sebaliknya, periode tantangan disiapkan untuk setiap status baru yang diajukan. Karena Rollup mengirimkan semua informasi transaksi ke rantai utama dan membuatnya menjadi publik, siapa pun dapat memverifikasi pembaruan status (terutama ketika pembaruan melibatkan dompet mereka sendiri). Jika status baru tidak benar, verifikator dapat menghasilkan bukti penipuan terhadap status yang salah dan mengirimkannya dalam periode tantangan, sehingga membatalkan pembaruan status yang tidak benar.
Jenis solusi Rollup lainnya adalah zk Rollup. Dalam skema ini, setelah mengeksekusi pembaruan status Layer 2, operator Layer 2 harus memberikan bukti pengetahuan nol tentang kebenaran pembaruan status dan mengirimkannya ke rantai utama bersama dengan pembaruan status. Kontrak di rantai utama akan memverifikasi bukti untuk menentukan kebenaran pembaruan status.
Dibandingkan dengan skema Optimistic Rollup, zk Rollup tidak memerlukan periode tantangan yang panjang untuk akhirnya mengonfirmasi transaksi Layer 2 dan bisa dikonfirmasi lebih cepat. Selain itu, zk Rollup tidak bergantung pada asumsi bahwa selalu akan ada verifiers jujur dalam jaringan yang akan segera mengirimkan bukti kecurangan saat kecurangan terjadi. Namun, pada saat yang sama, zk Rollup juga menghadapi masalah seperti biaya komputasi tinggi dari teknologi bukti zero-knowledge, kompleksitas, dan kesulitan dalam pengembangan, yang menghambat implementasi praktis teknologi zk Rollup dalam Rollups. Dengan perkembangan lebih lanjut dari teknologi bukti zero-knowledge dalam dua tahun terakhir, rintangan-rintangan ini secara bertahap mulai teratasi. Teknologi zk Rollup mulai menguasai bagian pasar Layer 2 yang semakin besar.
Seperti yang ditunjukkan pada gambar di bawah, dalam bidang penskalaan lapisan Rollup layer-2, zkRollup sudah menduduki lebih dari setengah wilayah dan sedang berkembang dengan pesat.
Data yang diambil pada: 18 Januari 2024
Selama perkembangannya, zkRollup sebagian besar telah melalui dua tahap. Jenis pertama adalah non-general zkRollup, sedangkan jenis kedua adalah zkRollup umum yang mampu menjalankan kontrak sembarang yang lengkap secara Turing.
Perbedaan antara kedua jenis teknologi zkRollup ini terutama terletak pada apakah platform Layer 2 mengeksekusi logika khusus terbatas yang ditulis oleh penyedia platform atau logika kontrak cerdas sewenang-wenang yang ditulis oleh pengguna dalam transaksi.
Pada proyek zkRollup non-umum (seperti zkSync Lite, yang menempati peringkat ke-8 dalam gambar di atas), pengguna hanya dapat melakukan beberapa jenis operasi transaksi, seperti transfer FT (token yang dapat dipertukarkan), pembayaran, pertukaran, dan transfer NFT (token yang tidak dapat dipertukarkan). Logika transaksi untuk operasi-operasi ini hanya dapat ditentukan dan diimplementasikan oleh pemilik proyek.
Melalui proyek zkRollup seperti itu, kita dapat mentransfer dengan biaya yang jauh lebih rendah dibandingkan dengan Ethereum mainnet dan mendapatkan throughput transaksi yang lebih tinggi. Namun, jika kita ingin mencoba kontrak menarik di rantai, kita tidak akan dapat melakukannya.
Mengapa zkRollups khusus tidak memungkinkan pengguna untuk menyusun dan menggunakan kontrak pintar mereka sendiri? Hal ini membawa kita kembali ke arsitektur bukti dari zkRollup itu sendiri.
Untuk memastikan bahwa transisi keadaan L2 benar dan dapat dipercaya, dalam zkRollup, semua logika transisi keadaan L2 perlu ditulis sebagai sirkuit bukti pengetahuan nol dan diverifikasi oleh kontrak L1. Hanya keadaan yang lolos verifikasi bisa diterima oleh L1 dan akhirnya menyelesaikan Rollup. Proses ini memerlukan bahwa semua logika eksekusi transaksi platform zkRollup diverifikasi dalam sirkuit bukti pengetahuan nol. Namun, mendukung eksekusi logika kontrak sembarang dalam sirkuit bukti pengetahuan nol adalah sebuah tantangan (alasan dari kesulitan ini akan dijelaskan nanti dalam teks). Akibatnya, proyek zkRollup awal seringkali hanya mendukung sejumlah terbatas transaksi yang relatif sederhana.
Kemampuan untuk menjalankan hanya sejumlah tetap transaksi sederhana jelas tidak memenuhi harapan kami untuk zkRollup. Untungnya, teknologi zkVM (Mesin Virtual Zero-Knowledge) telah menyelesaikan kesulitan dalam membuktikan eksekusi kode Turing-lengkap sembarang dalam sirkuit bukti zero-knowledge, menjadikan platform zkRollup umum sebagai kemungkinan. Selanjutnya, artikel ini akan memperkenalkan prinsip-prinsip implementasi zkVM, memungkinkan pembaca memahami bagaimana bagian inti teknologi zkRollup umum ini beroperasi.
Sebelum memperkenalkan prinsip-prinsip zkVM, kami akan memberikan pengantar singkat mengenai teknologi bukti pengetahuan nol. Di sini, kita tidak perlu memahami secara detail prinsip matematika yang mendasari dari bukti pengetahuan nol; cukuplah untuk memahami apa yang dapat dilakukan oleh bukti pengetahuan nol, bagaimana cara penggunaannya, dan pembatasan yang diberlakukan oleh sirkuit bukti khusus mereka.
Bukti pengetahuan nol dalam zkRollup berfungsi untuk membuktikan bahwa transaksi Layer 2 telah dieksekusi dengan benar dan bahwa status Layer 2 telah diperbarui dengan benar.
Untuk mencapai tujuan ini, sirkuit zkVM perlu membuktikan bahwa setiap kontrak pintar yang diterapkan pada Lapisan 2 telah dieksekusi dengan benar. Sebelum memperkenalkan prinsip-prinsip zkVM, kita perlu membahas peran bukti pengetahuan nol dan bagaimana cara kerjanya.
Mengapa Bukti Pengetahuan Nol Diperlukan
Bukti pengetahuan nol adalah primitif kriptografi yang memungkinkan seorang pembuktikan meyakinkan seorang pemeriksa tentang kebenaran suatu pernyataan tanpa mengungkapkan informasi tambahan kepada pemeriksa.
Bukti pengetahuan nol memiliki tiga properti inti:
Dengan kelengkapan bukti pengetahuan nol, ketika pemberi bukti menyelesaikan perhitungan kompleks, mereka dapat menghasilkan bukti yang meyakinkan verifier bahwa data output yang diperoleh dari data input adalah hasil yang diberikan oleh pelaksana. Kegunaan bukti pengetahuan nol memastikan bahwa ketika pelaksana memberikan hasil yang salah, mereka tidak dapat menghasilkan bukti yang valid.
Oleh karena itu, dengan kelengkapan dan kebenaran bukti zero pengetahuan, kita dapat dengan percaya diri mengalihkan perhitungan kompleks ini kepada pihak lain dan memverifikasi melalui proses verifikasi yang relatif sederhana apakah perhitungannya benar, tanpa perlu percaya kepada pihak yang melakukan pengalihan.
Selain tiga properti inti dari bukti pengetahuan nol, skema zk-SNARK yang banyak digunakan juga memiliki karakteristik kekompakan. Ini berarti bahwa untuk logika kompleks apa pun yang terbukti menggunakan bukti pengetahuan nol, ukuran bukti yang dihasilkan dan waktu yang dibutuhkan untuk memverifikasi bukti keduanya tetap dan relatif kecil. Hal ini memungkinkan zk-Rollup untuk memindahkan perhitungan pembaruan status ke luar rantai dan hanya memverifikasi kebenaran operasi di rantai, sehingga solusi penskalaan menjadi layak.
Proses Bukti Pengetahuan Nol
Selanjutnya, artikel ini akan menggunakan perhitungan sederhana di bawah ini sebagai contoh untuk menjelaskan proses bukti pengetahuan nol.
c=a²+b+5
Untuk menjelaskan aspek pengetahuan nol dalam bukti pengetahuan nol, kita akan menetapkan variabel a dan c sebagai nilai publik dari bukti pengetahuan nol ini, dengan b sebagai masukan rahasia yang hanya diketahui oleh pihak pembuktikan. Karena perhitungan kita sangat sederhana, pemeriksa dapat dengan mudah menyimpulkan nilai masukan rahasia dari nilai publik. Hal ini tidak memengaruhi sifat pengetahuan nol dari metode bukti pengetahuan nol itu sendiri, karena hanya menjamin bahwa pemeriksa tidak dapat memperoleh informasi tentang masukan rahasia dari proses bukti.
Saat membuktikan, pembuktian pertama-tama memilih nilai untuk a dan b masing-masing sebagai input dan menghitung nilai c. Di sini, kita atur a = 3, b = 2, maka c = 16. Setelah menyelesaikan semua perhitungan, pembuktian dapat menghasilkan bukti pengetahuan nol untuk nilai dan operasi ini.
Setelah menyelesaikan bukti, si pembuktikan akan memberikan si pemeriksa masukan publik dari bukti (yaitu, nilai-nilai a dan c) serta bukti pengetahuan nol.
Setelah menerima bukti, pemeriksa dapat, dengan memvalidasi bukti pengetahuan nol, yakin bahwa si pembuktikan telah menggunakan input rahasia b, yang membuat rumus di atas benar ketika a = 3 dan c = 16 (yaitu, nilai input publik), dan tidak dapat memperoleh informasi apa pun di luar input publik (a = 3, c = 16).
Bagian selanjutnya dari artikel ini akan memperkenalkan proses bukti yang spesifik. Ketika kami perlu membuktikan sebuah komputasi menggunakan metode bukti tanpa pengetahuan, kami pertama-tama perlu mewakili komputasi tersebut dalam bentuk sirkuit aritmatika yang dapat diterima oleh algoritma bukti tanpa pengetahuan. Sirkuit aritmatika adalah representasi Turing lengkap dari komputasi. Sesuai namanya, sirkuit aritmatika adalah sirkuit komputasi yang terdiri dari gerbang-gerbang yang melakukan operasi aritmatika. Dalam contoh kami, hasil konversi ditampilkan dalam gambar. Anda mungkin perhatikan bahwa selain input publik a dan c dan input rahasia b yang kami sebutkan, ada dua nilai tambahan, d dan e. Ini adalah variabel-variabel perantara yang digunakan dalam proses komputasi.
Kita dapat menganggap setiap kabel dalam rangkaian aritmatika sebagai nilai, yang bisa menjadi input publik, input rahasia, atau variabel perantara. Setelah memperluas perhitungan ke dalam rangkaian aritmatika, setiap variabel perantara akan memiliki tempatnya dan digunakan dalam proses bukti. Satu-satunya perbedaan antara mereka dan input adalah bahwa nilai mereka tidak dimasukkan langsung oleh pemberi bukti tetapi ditentukan oleh nilai input lainnya dalam rangkaian aritmatika.
Kita dapat melihat rangkaian aritmatika sebagai dua bagian: satu bagian adalah semua nilai numerik yang muncul dalam rangkaian, dan bagian lainnya adalah hubungan (kendala) antara nilai-nilai tersebut. Kami biasanya merujuk kepada input publik dalam rangkaian sebagai pernyataan (dalam contoh kami, a dan c), dan semua nilai lainnya, termasuk input rahasia (b) dan variabel perantara (d dan e), sebagai saksi.
Menurut logika rangkaian, ketika kita memiliki input publik sebagai pernyataan dan input rahasia sebagai saksi, kita dapat menghitung semua nilai saksi dalam rangkaian.
Oleh karena itu, rangkaian gerbang dari rangkaian aritmatika juga dapat direpresentasikan dalam bentuk berikut:
pernyataan:
a,c
saksi:
b,d,e
konstrain:
d = a * a
e = b + 5
c = d + e
Setelah sirkuit yang akan dibuktikan diaritmetika, algoritma bukti pengetahuan nol perlu memproses kendala sirkuit dan mengonversinya ke dalam bentuk yang diperlukan oleh algoritma untuk pembuatan dan validasi bukti. Setelah diproses, sirkuit menghasilkan VK (Kunci Verifikasi) berukuran tetap yang tidak terkait dengan ukuran sirkuit. Verifikasi dapat memverifikasi bukti pengetahuan nol dari sirkuit yang sesuai melalui kunci verifikasi. Kunci verifikasi ini agak mirip dengan komitmen terhadap sirkuit. Jika terjadi perubahan pada kendala, kunci verifikasi yang sesuai juga akan berubah.
Dalam aplikasi sebenarnya, pengguna bukti pengetahuan nol perlu menulis logika yang mereka perlukan ke dalam kode sumber sirkuit zk dan menghasilkan VK yang sesuai melalui audit. VK ini diserahkan ke verifikator. Masukan publik yang dibuktikan oleh pengklaim, bersama dengan bukti yang dihasilkan, diserahkan, dan verifikator dapat memverifikasi apakah masukan publik ini memenuhi kendala. Dalam contoh ini, pengklaim dapat menghasilkan bukti dengan nilai a, b, dan c. Verifikator dapat memverifikasi apakah a2 + b sama dengan C tanpa melakukan operasi ini.
Keterbatasan Sirkuit Bukti Pengetahuan Nol
Meskipun sirkuit zk adalah Turing lengkap dan dapat mewakili setiap komputasi, karena perlu mengonversi komputasi ke dalam bentuk representasi khusus dari sirkuit aritmatika, ada beberapa batasan tambahan dalam menulis sirkuit aritmatika.
Dalam program komputer yang lebih akrab bagi kita, kita dapat mengontrol cabang-cabang dari eksekusi program dengan pernyataan if-else. Hanya cabang yang dipilih dalam program yang dieksekusi. Namun, dalam proses bukti pengetahuan nol-knowledge, komputasi diubah menjadi sirkuit, dan tidak ada konsep jalur eksekusi atau aliran kontrol. Oleh karena itu, kita tidak dapat memilih cabang tertentu untuk dieksekusi dalam sirkuit aritmatika.
Tentu saja, ini tidak berarti bahwa kita tidak bisa menggunakan cabang dan pilihan dalam rangkaian. Ini hanya berarti bahwa dalam rangkaian, semua cabang, baik yang dipilih maupun tidak, akan dieksekusi dan berkontribusi pada produksi bukti. Pemilihan cabang hanya memengaruhi hasil cabang mana yang akan dioutputkan ke variabel berikutnya.
Ambil operasi berikut sebagai contoh:
jika (bendera) {
c = x + x
} else {
c = x * x
}
Ketika operasi ini dikonversi menjadi rangkaian aritmatika, itu akan diubah menjadi batasan yang ditunjukkan di bawah ini. Jelas, dua saksi baru, temp1 dan temp2, akan ditambahkan ke rangkaian. Selain itu, nilai x+x dan nilai x*x akan keduanya dihitung.
Yaitu, dalam sirkuit zk, semua cabang dan logika akan dihitung, apakah mereka dijalankan atau tidak.
temp1 = x + x
temp2 = x * x
c = bendera temp1 + (1-flag)temp2
Karena keterbatasan ini, mendukung pemilihan bersyarat dalam sirkuit bukti pengetahuan nol cukup sulit. Bagaimana cara membuktikan jalur eksekusi logika kontrak pintar dengan banyak variasi dalam bukti pengetahuan nol adalah salah satu tantangan utama dari mesin virtual zk.
Kami menjelaskan VM melalui model mesin keadaan universal. Sebuah VM adalah mesin keadaan yang bertransisi keadaan saat instruksi diproses. Mari kita ilustrasikan bagaimana mesin virtual dibuktikan oleh sirkuit pengetahuan nol dengan contoh mesin keadaan yang sangat sederhana.
Kami mengasumsikan mesin keadaan universal ini memiliki register umum (A dan B), dan tambahan, sebuah register Program Counter yang menyimpan nomor instruksi saat ini.
Keadaan dari registernya sebelum menjalankan instruksi
Gambar di bawah ini menunjukkan alur kerja dasar dari rangkaian pembuktian mesin virtual ZK:
Negara 0 dapat dianggap sebagai negara awal mesin virtual ini sebelum dijalankan. Negara awal, setelah total m instruksi, mencapai negara final m. Selain negara awal, mesin virtual ini memiliki dua tabel masukan reguler:
Dalam gambar, proses eksekusi instruksi ke-n diabstraksikan dan ditampilkan di sebelah kiri. Status mesin, State n, bertransisi ke State n+1 setelah eksekusi instruksi ke-n. Sirkuit yang sama, setelah m iterasi, mencapai eksekusi m instruksi di vm.
Ada dua isu di sini.
Satu adalah bagaimana menjalankan instruksi yang berbeda dalam suatu rangkaian tetap? Saat menjalankan bytecode kontrak, tidak mungkin untuk menentukan instruksi ke-n yang dieksekusi, sehingga logika rangkaian aktual di sini tidak dapat ditentukan.
Yang kedua adalah bagaimana membuktikan apakah jumlah instruksi yang akan dieksekusi bukan m?
Untuk pertanyaan pertama, solusinya adalah menerapkan logika untuk semua instruksi yang mungkin dalam rangkaian. Kemudian gunakan Selektron, berdasarkan instruksi, untuk memilih salah satunya sebagai keadaan berikutnya, mirip dengan if-else dalam rangkaian khusus yang disebutkan sebelumnya.
Untuk pertanyaan kedua, kita tidak dapat langsung mengubah jumlah instruksi dalam sirkuit. Hal ini karena setiap instruksi dalam sirkuit memerlukan segmen sirkuit independen untuk diimplementasikan. Jika jumlah instruksi bertambah atau berkurang, sirkuit akan berubah, dan kunci verifikasi yang sesuai juga akan berubah. Hal ini membuat tidak mungkin untuk memenuhi persyaratan verifikasi logika apa pun dalam sirkuit tetap.
Untuk menyelesaikan masalah ini, instruksi noop yang tidak akan mengubah keadaan dapat ditambahkan ke set instruksi. Oleh karena itu, ada batas atas untuk jumlah instruksi yang dapat dieksekusi oleh setiap rangkaian tetap. Rangkaian zkVM dapat dilihat sebagai wadah dengan jumlah slot instruksi yang tetap. Jika diperlukan lebih banyak instruksi, diperlukan rangkaian yang lebih besar. Dalam bukti nyata, rangkaian ukuran yang sesuai dapat dipilih sesuai kebutuhan.
Membuktikan Instruksi Dasar
Berikut adalah beberapa instruksi komputasi dasar sebagai contoh bagaimana instruksi dasar dalam sirkuit terbukti:
Gambar tersebut menunjukkan bagan alur rangkaian pembuktian instruksi. Rumus-rumus di bawah ini adalah batasan rangkaian untuk bukti.
Kedua kendala ini dapat membuktikan beberapa instruksi dasar untuk register umum A dan B yang terdaftar di sudut kanan atas. Bukti-bukti ini dapat memuat nilai dari tabel input atau nilai segera dari instruksi ke dalam register atau menambahkan nilai di register A dan B dan menulisnya kembali ke register.
Dari gambar ini, kita dapat melihat bahwa untuk membangun batasan untuk perubahan keadaan, rangkaian memperkenalkan beberapa keadaan kontrol tambahan:
Logika komputasi antara register bantu ini dan register tujuan umum diimplementasikan oleh rumus di bawah ini. Pembaca yang tertarik dapat menggantikan nilai-nilai yang sesuai ke dalam rumus kendala untuk memverifikasi. Dapat dilihat bahwa dengan kedua kendala ini, instruksi penambahan aritmatika dasar dapat diimplementasikan. Jika operasi lebih lanjut diperlukan, lebih banyak kendala instruksi harus ditambahkan.
Kembali ke diagram proses dasar, kita dapat menganggap rangkaian komputasi dalam bagian ini sebagai instruksi dalam proses keseluruhan. Selector akan memilih apakah hasil yang dihasilkannya adalah keadaan selanjutnya yang akan diadopsi oleh mesin keadaan. Keadaan tambahan yang diperlukan oleh rangkaian dalam bagian ini dihasilkan oleh instruksi yang ditunjuk oleh register PC.
Pemulihan instruksi diimplementasikan oleh sirkuit pencarian khusus, yang dapat membuktikan pemulihan segmen data dari tabel tetap melalui indeks. Oleh karena itu, sirkuit zkVM dapat membuktikan transisi status yang dieksekusi oleh mesin virtual yang ditentukan oleh PC.
Membuktikan Penilaian Bersyarat dan Loncatan Aliran Kontrol
Kemampuan mesin negara untuk menjalankan logika kompleks bergantung pada instruksi kondisional dan lompatan. Dalam kontrak sebenarnya, kita sering perlu menangani logika yang mengubah jalur eksekusi berdasarkan kondisi, jadi sirkuit-sirkuit tersebut diperlukan.
Perlu dicatat di sini bahwa sirkuit zkVM bukanlah modul yang benar-benar menjalankan logika kontrak dan menghitung hasilnya. Yang sebenarnya dilakukan sirkuit zkVM adalah membuktikan proses perhitungan dari logika kontrak. Oleh karena itu, saat membuktikan, diperlukan untuk mengisi proses urutan instruksi yang dieksekusi sebenarnya dalam sirkuit, memverifikasi melalui sirkuit apakah kondisi untuk loncatan ini terpenuhi, dan kemudian membuktikan bahwa aliran instruksi yang dieksekusi telah melakukan loncatan yang benar.
Pertama, kami memperkenalkan bukti penilaian kondisi:
Mengambil contoh penilaian apakah operan dalam instruksi ke-i sama dengan nol. Kami menambahkan status bantu isZero untuk hasil penilaian. Jika nilai yang dinilai adalah 0, maka nilai status bantu isZero adalah 1; jika nilai yang dinilai adalah nilai lain selain 0, maka isZero adalah 0.
Proses ini dibatasi oleh dua rumus dalam diagram.
Validitas kendala ini terkait dengan sifat matematika dari kurva eliptik yang digunakan dalam bukti pengetahuan nol. Setiap nilai dalam sirkuit bukti pengetahuan nol adalah elemen dalam bidang terbatas pada kurva eliptik. Jika nilainya bukan 0, harus ada elemen invers yang, ketika dikalikan dengan dirinya sendiri, menghasilkan 1. Dengan menggunakan sifat ini, dengan dua kendala dalam diagram, mungkin untuk memverifikasi apakah suatu nilai adalah nol dan mengubahnya menjadi keadaan bantu.
Setelah kita memiliki keadaan bantu isZero ini, kita dapat melanjutkan ke bukti instruksi loncat bersyarat:
Kembali ke diagram proses dasar, jika instruksi saat ini adalah instruksi lompatan bersyarat. Pertama-tama dilakukan pemeriksaan isZero, menentukan apakah kondisi lompatan terpenuhi, dan kemudian memodifikasi nilai PC. Setelah memperbarui nilai PC, eksekusi instruksi berikutnya pertama-tama melibatkan pencarian berdasarkan PC untuk menemukan instruksi setelah lompatan.
Operasi I/O dan Kompleks
Ketika menggunakan sirkuit bukti mesin keadaan umum, untuk menangani transisi keadaan dengan benar, perlu menambahkan keadaan kendali dan batasan yang sesuai untuk setiap instruksi yang didukung selama satu transisi keadaan tunggal. Jumlah nilai keadaan dan batasan ini juga harus dikalikan dengan jumlah instruksi yang didukung oleh zkVM. Bahkan jika tidak ada operasi yang dilakukan dalam program aktual yang dieksekusi oleh zkVM (semua NOP), nilai keadaan ini dan pemeriksaan batasan tidak dapat diabaikan.
Oleh karena itu, menggunakan rangkaian mesin keadaan umum dalam separuh pertama artikel ini untuk mengeksekusi perhitungan kompleks sangat tidak efisien. Jika metode-metode ini digunakan untuk menerapkan perhitungan kompleks, kinerjanya sulit diterima. Selain itu, sulit bagi rangkaian mesin keadaan umum untuk mengeksekusi instruksi kompleks atau berinteraksi langsung dengan dunia luar.
Untuk menyelesaikan masalah ini, implementasi sebenarnya dari zkVM umumnya menggunakan kombinasi sirkuit mesin keadaan umum dan sirkuit bukti khusus untuk membuktikan bagian program secara terpisah dan kemudian menggabungkan bukti-bukti tersebut menjadi satu solusi.
Diagram di sebelah kiri adalah arsitektur rangkaian proyek Scroll, dan diagram di pojok kanan bawah adalah arsitektur rangkaian Polygon. Mereka keduanya menggunakan pendekatan yang mirip seperti yang ditunjukkan dalam diagram di pojok atas.
Mesin negara umum bertanggung jawab atas pembuktian kontrol logika eksekusi program. Pada sebagian besar kontrak, waktu eksekusi aktual bagi bagian logika ini sangat singkat, sehingga membuktikannya dengan mesin negara umum yang tidak efisien masih dapat diterima dari segi efisiensi.
Lebih banyak perhitungan kompleks tetap, seperti hash, operasi pohon MPT, data masukan eksternal, dll., dibuktikan oleh sirkuit khusus.
Mesin keadaan umum dan sirkuit bukti khusus berinteraksi menggunakan tabel pencarian. Setiap kali sirkuit mesin keadaan memanggil operasi-operasi ini, modul-modul yang menghasilkan saksi untuk bukti akan menulis parameter panggilan dan hasil perhitungan dalam tabel pencarian. Dengan demikian, panggilan-panggilan ke operasi-operasi ini dalam sirkuit mesin keadaan disederhanakan menjadi operasi pencarian.
Ketepatan setiap panggilan dan nilai pengembalian di tabel pencarian dibatasi dan dibuktikan oleh rangkaian khusus.
Akhirnya, kendala penyalinan dalam rangkaian menghubungkan rangkaian mesin keadaan, rangkaian khusus, dan tabel pencarian, memeriksa apakah setiap item dalam tabel pencarian dibuktikan oleh rangkaian khusus yang sesuai, dan akhirnya menghasilkan bukti untuk blok lengkap.
Kontrak L1 hanya perlu memverifikasi bukti agregat ini untuk mengonfirmasi kebenaran proses eksekusi mesin virtual secara keseluruhan.
Teknologi bukti nol pengetahuan telah membuatnya memungkinkan untuk membuktikan perhitungan dengan mudah dan cepat, membuka pintu untuk outsourcing proses komputasi dalam lingkungan tanpa kepercayaan. Teknologi ini, saat digunakan dalam blockchain, membebaskan eksekusi dari rantai, memungkinkan blockchain utama untuk fokus pada isu-isu terdesentralisasi dan keamanan. Namun, karakteristik sirkuit bukti nol pengetahuan khusus untuk menjalankan logika tetap hanya membatasi potensi bukti nol pengetahuan pada blockchain, membatasi kemampuan awal zkRollup pada beberapa jenis transaksi.
Namun, dengan perkembangan dan kedewasaan mesin virtual zk, mendukung eksekusi Turing lengkap dari kontrak cerdas sembarang telah menjadi mungkin. Potensi zkRollup akan benar-benar terwujud, mewujudkan visinya untuk memecahkan trilema blockchain.