Peringatan
Peti ini telah diarsipkan. Pengembangan telah dipindahkan ke repositori zksync-crypto. Silakan gunakan sebagai gantinya.
zkSync Era adalah rollup lapisan 2 yang menggunakan bukti tanpa pengetahuan untuk menskalakan Ethereum tanpa mengorbankan keamanan atau desentralisasi. Karena kompatibel dengan EVM (Solidity/Vyper), 99% proyek Ethereum dapat diterapkan ulang tanpa melakukan pemfaktoran ulang atau mengaudit ulang satu baris kode pun. zkSync Era juga menggunakan kompiler berbasis LLVM yang pada akhirnya memungkinkan pengembang menulis kontrak pintar dalam C++, Rust, dan bahasa populer lainnya.
Tujuan perpustakaan ini adalah untuk bekerja dengan aritmetisasi yang sangat spesifik dengan asumsi tambahan tentang ukuran bidang. Secara kasar, kita berharap memiliki bidang F
dengan |F| ~ 64 bit (ukuran kata mesin) (asumsi tentang ukuran bidang tidak penting untuk strategi aritmetisasi dan penempatan gerbang, namun ditegaskan dalam implementasi gadget untuk fungsi tertentu yang mengandalkan ukuran bidang tertentu).
Sistem ini memiliki hierarki fungsi logis (gadget) - gerbang (entitas yang dapat menuliskan dirinya ke dalam jejak) - dan evaluator (hubungan antar polinomial). Evaluator ditulis dalam bentuk suatu sifat yang memungkinkan kita nantinya secara otomatis menyusun fungsi untuk memeriksa kepuasan dan menghitung bukti, serta mensintesis verifikator biasa dan rekursif. Gerbang memiliki peralatan tambahan yang memungkinkan gerbang itu sendiri melacak logika di mana mereka harus ditempatkan dalam jejak. Perhatikan bahwa kami mengandalkan batasan penyalinan Plonk dan mengerjakan entitas logis "variabel" yang dapat disalin untuk menyusun pernyataan akhir yang dapat dibuktikan. Sistem ini tidak dimaksudkan untuk aritmetisasi AIR dan tidak memungkinkan untuk menyatakan batasan yang menjangkau beberapa baris jejak.
Secara umum, jejak tersebut membatasi beberapa jenis kolom. Pemisahan utamanya adalah antara:
Selain itu, pelacakan memungkinkan Anda menambahkan argumen pencarian, yang juga dapat menggunakan kolom khusus untuk menampung entri tabel pencarian, atau hanya menggunakan kolom tujuan umum. Tabel dikodekan sebagai hanya satu set polinomial untuk saat ini, sehingga total panjang jejak harus lebih besar dari jumlah total entri dalam tabel.
Perhatikan bahwa setiap "gerbang" (sebagai tipe Rust) adalah unik, sehingga gerbang hanya dapat ditempatkan pada kolom khusus atau tujuan umum, tetapi tidak pada keduanya. Jika seseorang membutuhkan fungsionalitas seperti itu maka dimungkinkan untuk membuat pembungkus tipe baru.
Fungsi logis tingkat yang lebih tinggi (seperti dekomposisi boolean, pemeriksaan rentang, pemeriksaan nol, dll) digunakan untuk membuat rangkaian secara internal menuliskan dirinya sendiri dengan cara yang berbeda tergantung apakah beberapa gerbang diperbolehkan atau tidak diperbolehkan dalam contoh CS tertentu. Instance CS dengan rangkaian gerbang yang berbeda dianggap sebagai tipe yang berbeda dari perspektif Rust, dan kami mengandalkan beberapa pekerjaan inlining/prop konstan/kompiler untuk mengurangi percabangan menjadi lompatan statis.
|F|
sehingga kita harus mengulang argumen), namun hal ini akan diubah sehingga kita berpindah ke bidang penyuluhan sebagai secepat mungkin setelah melakukan komitmen pada saksi untuk menghindari peluang yang cukup "besar" untuk mendapatkan angka nol pada penyebutnya. Pengaruh terhadap biaya komputasi dalam pembuktian dapat diabaikan Kami menggunakan argumen pencarian yang diterapkan melalui relasi sum_i selector(x_i) / (witness(x_i) + beta) == sum_i multiplicity(x_i) / (table(x_i) + beta)
di mana pencarian pada kolom khusus selector(x_i)
hanyalah sebuah identitas. Kami juga tidak mengkodekan tabel sebagai polinomial dengan derajat yang lebih kecil untuk menghilangkan pemeriksaan terikat derajat tambahan, dan sebagai gantinya mengisinya dengan nol. Perhatikan bahwa entri tabel tidak pernah berisi elemen (0,0,...,0)
karena kami menggunakan kolom ID terpisah untuk tipe tabel jika ada beberapa tabel (meskipun hanya satu tabel yang digunakan), dan ID seperti ini dimulai dengan 1.
Salah satu fitur bagus dari argumen pencarian seperti ini adalah, karena sifat aditifnya, jika kita melakukan pencarian terhadap beberapa polinomial witness
ke dalam tabel yang sama, alih-alih mengulangi argumen untuk setiap (tupel) polinomial (yang memerlukan kolom multiplisitas terpisah, serta beberapa polinomial perantara di kemudian hari), kita dapat "menjumlahkan" multiplisitas dan mengubah argumen menjadi seperti sum_i selector_0(x_i) / (witness_0(x_i) + beta) + sum_i selector_1(x_i) / (witness_1(x_i) + beta) == sum_i total_multiplicity(x_i) / (table(x_i) + beta)
, sehingga total biaya pencarian hanya 1 kolom multiplisitas, dan 2 (terkait saksi) + 1 (terkait tabel) polinomial perantara untuk dikodekan hubungan lhs dan rhs pada akar persatuan.
Kebenaran argumen ini jelas. Agar masuk akal, kami menggunakan argumen asli seperti pada makalah "Hasil bagi dalam cache untuk pencarian cepat", Lemma 2.4. Kita perlu menunjukkan bahwa berkomitmen pada total_multiplicity
saja sudah cukup, bukan multiplisitas witness_0
dan witness_1
secara terpisah.
Misalkan persamaan sum_i selector_0(x_i) / (witness_0(x_i) + X) + sum_i selector_1(x_i) / (witness_1(x_i) + X) == sum_i total_multiplicity(x_i) / (table(x_i) + X)
memegang. Kita perlu menunjukkan bahwa witness_0
dan witness_1
terdapat dalam tabel t
. Misalkan f = (witness_0 | witness_1)
, merupakan rangkaian nilai. Persamaan di atas menyiratkan sum_i selector_i / (f_i + X) == sum_i total_multiplicity_i / (t_i + X)
(perhatikan bahwa panjang interval i
di sisi kiri adalah dua kali lipat dari di atas). Berdasarkan Lemma 2.4 kita mendapatkan f subset t
: "subset" dalam arti bahwa setiap koordinat vektor f
adalah koordinat dari t
. Khususnya, witness_0, witness_1 subset f subset t
.
Perhatikan bahwa argumen tersebut juga berlaku untuk beberapa witness_i
. Argumen kesehatan lainnya, untuk beta
yang dipilih, mengikuti secara langsung seperti pada pekerjaan di atas.
2^-40
untuk mendapatkan penyebut 0
Ada tolok ukur untuk 8kB SHA256 menggunakan konfigurasi gerbang + tabel yang menurut kami agak optimal untuk rangkaian SHA256. Perhatikan bahwa meskipun pembuktiannya cukup cepat, kami tidak mengoptimalkan FFT dengan benar dan masih menggunakan Poseidon (bukan Poseidon2) untuk konfigurasi yang kami harapkan buktinya digunakan untuk rekursi. Dua skrip sha256_bench_recursive.sh
dan sha256_bench_non_recursive.sh
memungkinkan Anda menjalankan pengujian yang sesuai (apakah bukti diharapkan untuk digunakan dalam rekursi atau tidak), dan Anda harus mencari baris Proving is done, taken ...
untuk melihat waktu pembuktian , karena pemverifikasi yang dijalankan setelahnya cukup bertele-tele. Tolok ukur ini menggunakan faktor LDE sebesar 8, meskipun semua batasan kami berada pada derajat 4 atau kurang - namun, ini adalah parameter yang digunakan di beberapa tolok ukur publik lainnya. Kami juga tidak menggunakan PoW dalam pembuktian tersebut karena PoW untuk 20 bit dapat diabaikan (30 md), dan kami belum mendukung PoW melalui hash aljabar (namun hal tersebut hanya ~2x lebih lambat, sehingga juga dapat diabaikan). Tingkat keamanan kira-kira 100
bit, namun tingkat kesehatan FRI dapat ditingkatkan dengan meningkatkan jumlah kueri, dan peningkatan jumlah kueri tidak menambah waktu pembuktian (jangan bingung dengan mengubah tingkat FRI). Panjang jejak adalah 2^16
dan menggunakan 60 kolom tujuan umum dan 8 argumen pencarian dengan lebar 4.
Catatan: benchmark hanya mencoba mengkompilasi ke arch asli dan hanya arch AArch64 (baca Apple M1) yang biasanya diuji secara end-to-end untuk saat ini. implementasi aritmatika x86-64 diuji validitasnya, tetapi tidak dibuktikan secara menyeluruh. Perhatikan bahwa kinerja maksimal x86-64 memerlukan tanda fitur kompiler tambahan selain cpu = native
(set AVX512 tidak digunakan oleh kompiler Rust bahkan pada CPU asli)
Pepatah Boojum didistribusikan berdasarkan ketentuan keduanya
sesuai pilihan Anda.
zkSync Era telah melalui banyak pengujian dan audit. Meskipun aktif, ini masih dalam kondisi alfa dan akan melalui lebih banyak audit dan program bug bounty. Kami akan sangat senang mendengar pemikiran dan saran komunitas kami tentang hal ini! Penting untuk disebutkan bahwa melakukan forking sekarang berpotensi menyebabkan hilangnya pembaruan keamanan penting, fitur penting, dan peningkatan kinerja.
Perangkat lunak ini mencakup komponen dari pihak ketiga. Untuk daftar lengkap komponen-komponen ini dan lisensinya, lihat file PEMBERITAHUAN PIHAK KETIGA.