Rand Protocol
Dokumentasi
Panduan

Cara zkVM berfungsi

Cara Rand membuktikan sesebuah atur cara telah dijalankan dengan betul tanpa mendedahkan inputnya - mesin RISC-V, jejak pelaksanaan yang dipecahkan kepada sembilan jadual, bas yang menghubungkannya, peraturan sebagai identiti polinomial, komitmen, FRI, Fiat-Shamir, punca pengetahuan sifar, perkara yang disemak oleh validator, dan sebab setiap parameter FRI dan cincang mempunyai nilai yang ditetapkan.

Baca halaman ini untuk memahami mesin di sebalik setiap bukti pada Rand: apa yang dibuktikannya, bagaimana satu larian program menjadi sesuatu yang boleh disemak oleh validator dalam beberapa milisaat, dan dari mana datangnya privasi. Untuk kos sesuatu bukti dan cara dompet menghasilkannya, lihat Bukti. Untuk parameter dan binaan cincangan, lihat Kriptografi. Untuk set arahan yang menjadi sasaran penulisan program, lihat ISA RISC-V.

Satu pernyataan yang dibuat oleh setiap bukti

zkVM membuktikan satu jenis pernyataan, bagi setiap program yang dijalankan oleh rantaian:

Sebuah program yang digestnya hc, bermula pada base_pc, dijalankan pada input persendirian yang diikat oleh H_IN dan segmen input awam yang diikat oleh H_PUB, berhenti dalam 2ᵗ − 1 kitaran, menggunakan paling banyak GAS_LIMIT gas dan menulis lapan perkataan output ini.

Pemindahan terlindung (shielded) ialah pernyataan itu tentang satu program tetap, iaitu guest himpunan aset tersembunyi, yang hc-nya dipaku dalam fail genesis sebagai hc_bundle. Sejak rantaian 17, pernyataan itu dibuat dua kali bagi setiap pemindahan: bukti kedua yang kecil tentang guest pengesahan (hc_auth dalam fail genesis) menunjukkan bahawa penghantar memegang kunci perbelanjaan (Bukti). Panggilan sulit ialah pernyataan yang sama tentang program yang telah dikerahkan. Hanya ada satu mesin, satu pengesah dan satu set kekangan untuk kesemuanya. Mengerahkan program oleh itu ialah operasi data (menyimpan perkataannya dan hc), bukan operasi kriptografi: tiada litar bagi setiap program dan tiada persediaan dipercayai.

Sistem bukti ini ialah STARK yang dibina dengan Plonky3. Ia tidak memerlukan apa-apa selain fungsi cincangan: tiada upacara persediaan dan tiada lengkung eliptik, jadi tiada apa yang boleh dipecahkan oleh algoritma Shor.

Saluran paip

 secret input ──► run the program ──► execution trace ──► polynomials ──► commit ──► FRI ──► proof
 (keys,           (RV32IM emulator)   (nine tables,      (one per       (8× code,   (80 queries,
  notes, paths)                        one row per step)  column)        Merkle)     20-bit grinding)

 every validator:  recompute the challenges from the Merkle roots, open 80 random positions,
                   check the rules there  →  ≈ 16 ms

Baris atas dijalankan sekali, pada mesin penghantar, dalam kira-kira 100 saat untuk satu himpunan dan kira-kira 7 saat untuk bukti kebenaran di sebelahnya. Baris bawah dijalankan pada setiap validator, daripada medan awam dan bukti sahaja.

1. Jalankan program dan catat segala-galanya

Mesin ini ialah pemproses RISC-V 32-bit: RV32IM tolak FENCE, arahan CSR dan EBREAK (ISA RISC-V). Pembukti mula-mula menjalankan program pada emulator dan merekodkan satu baris bagi setiap detik jam. Rekod itu ialah jejak pelaksanaan. Sesiapa yang memegangnya boleh memainkan semula larian itu langkah demi langkah; seluruh skema ini wujud supaya pengesah dapat diyakinkan bahawa jejak itu betul tanpa memegangnya.

Sesebuah program berhubung dengan dunia luar melalui lapan syscall dan tiada yang lain:

syscallno.fungsinya
HALT0berhenti; lapan perkataan output menjadi muktamad
WRITE_OUTPUT1tetapkan satu daripada lapan perkataan output awam
READ_INPUT2baca satu perkataan input persendirian
POSEIDON23cincang penimbal dalam memori di tempat
KECCAK4satu pilih atur Keccak-f[1600]
SHA2565satu pemampatan SHA-256
READ_PUBLIC6baca satu perkataan segmen input awam
POSEIDON2_LEN7POSEIDON2 dengan panjang mesej diikat ke dalam cincangan (set kekangan 7)

Komitmen nota, nullifier dan laluan Merkle tidak terbina dalam mesin. Ia ialah kod guest biasa yang menyediakan mesej bertag domain dalam memori dan memanggil POSEIDON2. Syscall itu tidak melakukan pelapik, maka [a] dan [a, 0] menghasilkan cincangan yang sama. Guest yang dihantar hanya memanggilnya pada mesej dengan panjang tetap. Program baharu yang mencincang data yang panjangnya boleh berubah menggunakan POSEIDON2_LEN (ISA RISC-V).

Tiada pengguguran

Pemproses tidak mempunyai arahan yang menolak untuk selesai, jadi program tidak boleh berhenti apabila sesuatu semakan gagal. Guest himpunan merekodkan kegagalan itu sebaliknya: setiap semakan yang gagal melakukan OR dengan 1 ke dalam satu daftar bernama bad, dan bad ialah perkataan terakhir yang dicincang ke dalam digest output:

D = H(64; anchor, nf₀..₃, cm₀..₃, fee, burn_a, burn_r, burn_asset, time, c, bad)

c ialah komitmen kebenaran yang turut diterbitkan oleh bukti pengesahan (sejak rantaian 17; digest bagi rantaian 14 hingga 16 tidak mempunyai c).

Rantaian tidak pernah mengambil prapetua D daripada penghantar. Ia membina semula prapetua itu daripada medan awam transaksi, menetapkan bad = 0 sendiri, mencincang, dan membandingkan. Penipu boleh membuat bukti yang sah sepenuhnya bagi larian yang satu semakannya gagal, tetapi larian itu mencetak H(…, 1), sedangkan rantaian mencari H(…, 0). Memadankan keduanya memerlukan perlanggaran cincangan.

2. Pecahkan jejak kepada sembilan jadual

Satu jadual yang menerangkan seluruh pemproses akan terlalu lebar dan membazir, maka jejak dipecahkan kepada jadual-jadual khusus yang dibuktikan bersama sebagai satu kelompok:

jadualbaris pada tier tapa yang direkodkan
programdiisytiharkan, ≥ 2⁷perkataan arahan program, dinyahkod dalam litar; menetapkan apa yang boleh diambil oleh CPU
cpu2ᵗsatu baris bagi setiap kitaran, didahului baris yang mencincang program, input persendirian dan segmen awam; memegang 35 nilai awam
memorydiisytiharkan, ≥ 2ᵗ⁺²daftar dan RAM, diisih mengikut (ruang, alamat, masa)
alu2ᵗ⁺¹setiap operasi aritmetik, logik, anjakan, perbandingan, darab dan bahagi, pada anggota bait
range, nibble256 setiap satujadual carian tetap: bait, kuasa dua, AND/OR/XOR 4-bit
poseidon22ᵗ⁺²pilih atur cincangan, satu baris bagi setiap pusingan
inputdiisytiharkan, ≥ 2⁷perkataan input persendirian yang diikat
publicdiisytiharkan, ≥ 2⁷perkataan segmen awam (bagi satu himpunan, pengikatan transaksi)

Dua jadual lagi, keccak dan sha256, hanya hadir dalam bukti yang programnya memanggilnya, masing-masing sekurang-kurangnya 2⁷ baris apabila hadir; guest himpunan tidak menggunakan kedua-duanya. Had bawah 2⁷ baris pada setiap jadual yang diisytiharkan datang bersama set kekangan 7 (bahagian 9).

Tier t ialah salah satu daripada 10, 12, 14, 16, 18 atau 20 dan menentukan saiz jadual. Setiap himpunan dibuktikan pada tier 14: jadual CPU 16,384 baris, yang mana guest menggunakan kira-kira 12,400. Guest pengesahan menjalankan 250 kitaran pada tier 10. Selebihnya ialah pelapik, jadi bukti mendedahkan tier yang diperlukan oleh sesebuah program, tetapi tidak sekali-kali bilangan langkah yang diambil di dalamnya (Tier).

Jadual memori inilah yang menjadikan RAM boleh disemak. Oleh sebab ia diisih mengikut alamat kemudian masa, “bacaan memulangkan nilai terakhir yang ditulis ke alamat itu” menjadi peraturan antara dua baris bersebelahan.

3. Hubungkan jadual dengan bas

Bagaimanakah pengesah tahu bahawa hasil tambah yang digunakan oleh CPU ialah hasil tambah yang dikira oleh ALU? Melalui bas. Apabila CPU memerlukan satu penambahan, ia menghantar mesej (op, a, b, c); ALU menerima satu mesej bagi setiap baris yang dikiranya. Mesin ini mempunyai tujuh belas bas:

basantara
PROGRAM, PROGRAM_WORDcpu ← program: pengambilan arahan, dan perkataan yang diserap oleh digest program
MEMORYcpu ↔ memory: setiap bacaan dan tulisan
ALUcpu → alu
RANGE8, POW2, AND4, OR4, XOR4semakan julat bait, anjakan dan operasi bitwise terhadap jadual tetap
POSEIDON2cpu → poseidon2: satu mesej bagi setiap pilih atur
INPUT_DIGEST, INPUT_READcpu ← input: perkataan yang diserap oleh digest input, dan bacaan program
PUBLIC_DIGEST, PUBLIC_READcpu ← public: pasangan yang sama bagi segmen awam
KECCAK, SHA256cpu → jadual cincangan pilihan
BLINDsetiap jadual → jadual berikutnya dalam kitaran tetap: satu nilai rawak setiap satu, pada baris pertama (set kekangan 7)

Bas disemak dengan hujah terbitan logaritma (LogUp). Selepas jadual diikat, satu nilai rawak α dipilih, dan setiap jadual menyimpan hasil tambah berjalan ±1/(α − m) ke atas mesej yang dihantar atau diterimanya. Hasil tambah itu saling membatalkan dengan tepat jika dan hanya jika setiap mesej yang dihantar telah diterima, iaitu multiset yang sama pada kedua-dua belah. Satu mesej palsu meninggalkan baki yang didedahkan oleh α rawak dengan kebarangkalian yang amat tinggi. Bas memori menggunakan sepupu rapatnya, semakan pilih atur multiset.

Setiap jadual menerbitkan nilai akhir hasil tambah berjalannya, iaitu terminalnya, dan pengesah menyemak bahawa terminal itu berjumlah sifar. Hingga set kekangan 6, terminal ialah fungsi yang boleh disemak bagi kandungan jadualnya. Sejak set kekangan 7, setiap jadual membawa lima lajur tambahan dan, pada baris pertamanya, menghantar satu nilai rawak serta menerima nilai jirannya pada bas BLIND. Setiap terminal beralih dengan satu unsur seragam bagi medan cabaran, dan hasil tambahnya kekal sifar.

Pasangan bas digest dan bacaan sengaja diasingkan. LogUp mengimbangi bagi setiap mesej, bukan bagi setiap pengguna, maka satu bas yang dikongsi akan membenarkan pembukti menggugurkan satu perkataan daripada digest sementara bacaan perkataan itu masih berjaya.

4. Tambatkan jejak kepada dunia luar

Tiga puluh lima nilai awam keluar daripada jejak, semuanya dalam jadual CPU:

nilaimaksudnya
1kemasukan pc
1tier
8perkataan output (bagi satu bundle, digest D)
8hc, digest program, dikira di dalam jejak daripada perkataan jadual program
8H_IN, digest input persendirian, ke atas input dengan salt 128-bit baharu di hadapan
8H_PUB, digest segmen awam, tanpa salt
1GAS_LIMIT, siling gas yang diisytiharkan oleh pembukti (set kekangan 8)

Oleh sebab hc dikira di dalam litar, bukti tentang program yang berlainan tidak boleh diterima sebagai bukti tentang guest bundle. Pengesah tidak pernah melihat sebarang perkataan arahan; ia membandingkan hc dengan digest yang dijangkakannya. Oleh sebab H_IN bersalt, ia mengikat input persendirian tanpa mendedahkannya, malah kepada orang yang boleh meneka input tersebut. Oleh sebab H_PUB tidak bersalt, pengesah boleh mengiranya semula daripada perkataan yang sudah dimilikinya. Bagi satu bundle, perkataan tersebut ialah pengikatan transaksi, blake3("rand-tx-bind-1" ‖ chain_id ‖ tx) ke atas transaksi dengan bait buktinya dikosongkan, maka bukti yang disalin ke atas transaksi dengan destinasi, memo, sampul atau chain id yang berbeza tidak akan disahkan. Pada chain 20 (genesis binding_domain: 1) ia ialah blake3("rand-tx-bind-2" ‖ genesis_hash ‖ chain_id ‖ tx), maka bukti tidak disahkan pada rantaian lain walaupun di bawah chain id yang sama; perkataan tersebut ialah input awam, jadi perkara ini tidak mengubah apa-apa dalam litar. Bukti pengesahan dibuat ke atas lapan perkataan yang sama. Bukti panggilan pada chain 20 diikat dengan cara yang sama: segmennya ialah perkataan awam program semasa pelaksanaan diikuti lapan perkataan pengikatan panggilan (rand-call-bind-2, rand-call-bind-1 sebelum chain 20), maka bukti panggilan yang disalin di bawah bundle yuran lain tidak akan disahkan.

Gas ialah ukuran mesin bagi beratnya sesuatu larian, dalam litar sejak set kekangan 8. Jadual CPU membawa lajur GAS yang bermula pada 1 dan menokok 1 bagi setiap baris, 3 bagi baris absorb Poseidon2, 64 bagi baris SHA256 dan 192 bagi baris KECCAK. Pada baris HALT, litar membuktikan GAS ≤ GAS_LIMIT melalui empat limb perbezaan yang disemak julat dan tidak pernah dibuka: had itu awam manakala gas yang dibelanjakan oleh larian tidak. Pengesah menolak, sebelum ia membina kunci, had yang melebihi apa yang mungkin diperlukan oleh pengepala bukti itu sendiri:

gas_max(t, k, s) = (2ᵗ − 1) + 2ᵗ⁻² + 191·(2ᵏ / 32) + 63·(2ˢ / 64)

dengan k dan s ialah log ketinggian yang diisytiharkan bagi jadual keccak dan sha256, setiap sebutan bernilai sifar bagi jadual yang tiada. Siling pengepala tier-10 tanpa hash ialah 1,279 dan siling tier-14 ialah 20,479. Rantaian menetapkan harga panggilan mengikut had yang diisytiharkannya (Yuran).

5. Tukarkan peraturan kepada identiti polinomial

Setiap lajur ialah senarai nombor dalam medan Goldilocks, integer modulo p = 2⁶⁴ − 2³² + 1. Senarai n nombor sama dengan polinomial berdarjah di bawah n: polinomial yang melalui nombor-nombor itu apabila ia disusun pada subkumpulan {1, ω, ω², …} bagi medan tersebut. Goldilocks mempunyai subkumpulan sedemikian bagi setiap saiz kuasa dua sehingga 2³², maka penukaran itu ialah transformasi Fourier pantas.

Peraturan mesin kemudiannya menjadi persamaan antara polinomial lajur. “Pembilang atur cara maju sebanyak empat melainkan arahan itu melompat” menjadi, secara skema:

is_jump(x)·(pc(ωx) − target(x)) + (1 − is_jump(x))·(pc(ωx) − pc(x) − 4) = 0

bagi setiap x dalam subkumpulan, dengan pc(ωx) bermaksud “baris seterusnya”. Set penuh peraturan sedemikian bagi sesuatu jadual ialah AIR-nya (algebraic intermediate representation). Peraturan CPU dan ALU mencapai darjah 8; yang lain kekal pada 2 hingga 4.

Polinomial yang bernilai sifar pada setiap titik subkumpulan boleh dibahagi dengan Z(x) = xⁿ − 1. Pembukti menggabungkan semua peraturan, dengan pemberat rawak, menjadi satu polinomial C(x) dan membahagikannya dengan Z(x). Jika setiap peraturan dipenuhi pada setiap baris, hasil bahagi ialah polinomial berdarjah rendah yang tulen. Jika satu peraturan gagal pada satu baris, ia bukan polinomial sedemikian. “Adakah setiap langkah larian 16,000 kitaran betul?” telah menjadi “adakah fungsi ini hampir dengan polinomial berdarjah rendah?”, dan soalan itu boleh dijawab dengan melihat beberapa nilai yang dipilih secara rawak.

6. Komit sebelum soalan diketahui

Pembukti mesti menetapkan polinomialnya sebelum ia melihat soalan rawak pengesah, jika tidak ia boleh menyesuaikan jawapannya. Ia menilai setiap lajur pada domain yang lapan kali lebih besar daripada jadual (blow-up 8, kadar kod 1/8) dan menerbitkan akar Merkle ke atas nilai-nilai tersebut. Lewahan itu ialah kod Reed–Solomon: polinomial berdarjah rendah ditentukan oleh mana-mana satu perlapan daripada nilainya, maka penipu yang mengubah walau satu baris jejak perlu mengubah sebahagian besar codeword yang dilanjutkan agar kekal konsisten, dan semakan rawak secara tempat akan terkena kerosakan itu.

Pokok Merkle menggunakan Poseidon2 ke atas Goldilocks: lebar 8, S-box x⁷, 4 pusingan penuh, 22 pusingan separa dan 4 pusingan penuh, dengan digest empat unsur medan (kira-kira 256 bit). Setiap daun di-hash bersama empat unsur kerawakan baharu, maka akar tidak mendedahkan apa-apa tentang nilai di bawahnya. Pilihatur yang sama ialah komitmen nota dan hash nullifier di dalam mesin. 86 pemalar pusingannya ialah jadual literal dalam kod sumber nod (poseidon2_constants.rs), maka tiada peningkatan pustaka yang boleh mengubahnya.

7. Semakan rawak dengan FRI

Pengesah kini memegang akar Merkle. Ia mula-mula mengikat hasil bahagi kepada jejak: ia memilih titik rawak z di luar domain jadual, meminta nilai setiap lajur dan nilai hasil bahagi di situ, dan menyemak C(z) = Q(z)·Z(z) secara langsung. Yang tinggal ialah mengesahkan bahawa fungsi yang dikomit benar-benar polinomial berdarjah rendah, dan itulah yang diuji oleh FRI.

FRI berfungsi dengan pelipatan. Pecahkan polinomial kepada bahagian genap dan ganjil, f(x) = fₑ(x²) + x·fₒ(x²). Bagi β rawak daripada pengesah, f′(y) = fₑ(y) + β·fₒ(y) mempunyai separuh darjah pada domain separuh saiz. Pembukti berkomit kepada f′, mendapat β baharu, dan melipat semula (Rand melipat sehingga lapan setiap pusingan) sehingga tinggal pemalar, yang dihantarnya secara terbuka. Satu pertanyaan kemudian memilih satu kedudukan rawak pada lapisan pertama dan menyusurinya ke bawah, menyemak pada setiap lapisan bahawa nilai yang dibuka di atas terlipat menjadi nilai di bawah. Fungsi yang jauh daripada berdarjah rendah tidak dapat mengekalkan semua janji itu secara konsisten.

Rand menjalankan 80 pertanyaan. Di bawah teorem proximity-gaps yang telah terbukti, setiap pertanyaan memberi penipu peluang paling banyak 9/16, maka 80 pertanyaan memberikan (9/16)⁸⁰ ≈ 2⁻⁶⁶·⁴. Di bawah konjektur ethSTARK, yang menjadi sandaran STARK yang digunakan, setiap pertanyaan meninggalkan 1/8, iaitu jauh lebih kecil.

8. Menghapuskan perbualan

Segala-galanya di atas diperihalkan sebagai dialog, tetapi transaksi mestilah satu mesej yang boleh disemak oleh mana-mana validator secara bersendirian. Transformasi Fiat–Shamir menghapuskan pengesah: pembukti mengira setiap cabaran “rawak” sebagai hash bagi segala yang telah dikomit setakat ini, dengan span duplex Poseidon2. Mengubah mana-mana komitmen mengubah setiap cabaran selepasnya, maka pembukti tidak boleh memilih komitmen agar sesuai dengan cabaran.

Dua langkah tambahan menutup jurang yang masih tinggal:

  • Medan lanjutan. Medan 2⁶⁴ unsur terlalu kecil untuk mengambil cabaran daripadanya: penipu memerlukan cabaran jatuh pada salah satu daripada beberapa nilai buruk sesuatu polinomial, dan berjaya dengan kebarangkalian kira-kira N/2⁶⁴ tidak kira berapa banyak pertanyaan dijalankan. Maka jejak kekal dalam Goldilocks, tetapi setiap cabaran diambil daripada lanjutan kuadratiknya, kira-kira 2¹²⁸ unsur.
  • Grinding. Sebelum kedudukan pertanyaan diterbitkan, pembukti mesti mencari nonce yang hash-nya bersama transkrip bermula dengan 20 bit sifar, kira-kira sejuta hash. Pembukti yang jujur membayarnya sekali. Penipu yang menjana semula kedudukan pertanyaan sehingga ia terlepas daripada pemalsuannya membayarnya pada setiap percubaan. Ini satu-satunya proof of work di mana-mana dalam Rand, dan ia tiada kaitan dengan konsensus.

Jumlahnya: 66.4 bit daripada pertanyaan ditambah 20 daripada grinding memberikan 86 bit terbukti, dan kira-kira 100 bit di bawah konjektur, dengan sebutan medan lanjutan menjadi hadnya.

9. Dari mana datangnya pengetahuan sifar

STARK tidak mempunyai pengetahuan sifar dengan sendirinya: nilai yang dibuka pada kedudukan pertanyaan ialah nilai polinomial jejak, dan tanpa berhati-hati ia membocorkan maklumat. Konfigurasi Rand menambah empat lapisan:

  1. setiap polinomial yang dikomit dirawakkan (FRI penyembunyi Plonky3 mencampurkan empat codeword rawak), maka 80 nilai yang dibuka boleh dihasilkan semula, dalam taburan, oleh seseorang yang tidak pernah melihat jejak;
  2. setiap daun Merkle bersalt, maka akar dan laluan pengesahan tidak mendedahkan apa-apa;
  3. kerawakan pembukti diambil baharu daripada sistem pengendalian bagi setiap bukti, maka dua bukti bagi pembayaran yang sama kelihatan tidak berkaitan;
  4. setiap jadual yang diisytiharkan mempunyai sekurang-kurangnya 2⁷ baris dan setiap terminal LogUp dibutakan (set kekangan 7). Satu bukti membuka setiap jadual pada 80 titik pertanyaan dan dua titik luar domain, dan komitmen penyembunyi mencampurkan baris rawak sebanyak baris yang ada pada jadual, maka jadual hanya tersembunyi selagi ia mempunyai sekurang-kurangnya 82 baris. 128 ialah kuasa dua terkecil yang memenuhinya.

Lapisan 4 ialah pembetulan. Semakan 2026-09-27 memulihkan input persendirian bagi panggilan dengan 31 perkataan input atau kurang daripada bukti pengeluaran, membaca kiraan pengambilan (fetch) sesebuah program daripada jadual programnya yang pendek, dan membezakan slot input sebenar sesuatu bundle daripada slot input palsunya melalui terminal yang tidak dikaburkan (unblinded). Bukti tersebut ialah bukti yang dibuat pada chain 15 dan terdahulu. Chain 16 (set kekangan 7, dengan guest bundle tanpa cabang) menutup ketiga-tiganya, dan chain 18 hingga 20 mengekalkan pembetulan itu.

Jaminannya ialah pengetahuan sifar statistik dalam model oracle rawak. Perkara yang tidak disembunyikan oleh sesuatu bukti adalah tepat: tiernya, ketinggian jadual yang diisytiharkannya, dan nilai awamnya, termasuk had gas. Ketinggian keccak atau sha256 yang diisytiharkan sebagai 0 bermakna larian itu tidak pernah menggunakan cincangan tersebut, justeru pengepala bukti panggilan menunjukkan sama ada panggilan itu mencincang dan, melebihi paras minimum, berapa kerap dalam lingkungan faktor dua. Bagi sesebuah bundle, nilai awam dan medannya ialah anchor, empat nullifier, empat komitmen, yuran, pembakaran, aset yang dibakar, masa, komitmen pengesahan kuasa (authorisation) dan pengikatan transaksi. Aset yang dipindahkan oleh sesuatu pemindahan ialah input persendirian, jadi pembayaran zUSD dan pembayaran RAND kelihatan sama pada chain. hc bersifat deterministik, jadi sesiapa sahaja dapat mengetahui bahawa sesuatu bukti berkaitan guest bundle (setiap bukti yang memindahkan nilai begitu) atau, bagi sesuatu panggilan, program tersebar yang mana yang telah dijalankannya.

10. Apa yang disemak oleh validator

Machine::verify_public(hc, words, proof) menjalankan semakan berikut, bermula dengan yang termurah:

  1. tier dan ketinggian jadual yang diisytiharkan oleh bukti itu dihadkan (check_declared_heights) sebelum apa-apa saiz ditentukan daripadanya, supaya pengepala yang cacat hanya memerlukan beberapa perbandingan, bukan pembinaan kunci yang mengambil masa beberapa saat; sesebuah bundle mesti mengisytiharkan tier 14 tanpa kedua-dua jadual cincang, dan bukti auth mesti mengisytiharkan tier 10;
  2. terdapat 35 nilai awam, setiap satu unsur medan kanonik, dengan pv[HC] = hc, pv[TIER] sama dengan tier bukti itu, setiap perkataan output di bawah 2³², dan GAS_LIMIT paling banyak gas_max pada pengepala;
  3. STARK kelompok itu disahkan terhadap kunci pengesah yang disimpan dalam cache bagi setiap bentuk (tier, program, input, keccak, sha256, public heights), bukan bagi setiap program;
  4. H_PUB sama dengan digest bagi words, yang bagi sesebuah bundle ialah pengikatan transaksi yang dikira sendiri oleh nod.

Sebelum semua ini, nod menyaring setiap bukti yang dihantar atau disebarkan melalui gosip untuk pengekodan kanonik: jadual lipatan FRI-nya mestilah jadual yang dibuat oleh pembukti yang jujur bagi darjah yang diisytiharkan oleh pengepala. Sejak fullnode v0.6.8 (audit v6, ZKV-4), saringan itu terlebih dahulu menolak mana-mana darjah yang diisytiharkan melebihi 25 bit (MAX_HONEST_DEGREE_BITS, siling 2²⁴ jadual memori ditambah penggandaan pengetahuan sifar, iaitu jumlah terbanyak yang dibawa oleh bukti yang diterima). Sebelum had itu, pengepala yang mengisytiharkan darjah yang sangat besar menyebabkan nod menerbitkan semula jadual lipatan yang amat besar pada gelung peristiwanya, dan menahannya selama yang dikehendaki penghantar; pengesah tetap akan menolak bukti itu, jadi had ini hanya mengubah kos untuk berkata tidak. Panik di dalam saringan kini menolak satu transaksi itu sahaja dan tidak lagi menghentikan nod.

Lejar kemudian mengira semula digest bundle D dengan bad = 0 dan membandingkannya dengan lapan perkataan output bukti itu. Pada chain 20, lejar juga menghendaki GAS_LIMIT bagi bukti bundle tepat sama dengan bundle_gas_limit genesis, iaitu 20,479, dan bagi bukti auth ialah 1,279, supaya setiap pemindahan mengisytiharkan nilai yang sama. Dengan kunci yang sudah dipanaskan, keseluruhan semakan mengambil masa kira-kira 16 ms.

Parameter, dan mengapa ia dipilih

Setiap nombor di bawah ialah konsensus: pengesah menyemaknya, bukti yang dibuat dengan nilai lain tidak akan disahkan, dan mengubah satu nilai bermakna set kekangan baharu dan hard fork (Set kekangan). Profil FRI ditetapkan oleh fail genesis (fri_profile: production pada chain 20), tidak pernah oleh bukti.

parameternilaisebab nilai ini
medan asasGoldilocks, p = 2⁶⁴ − 2³² + 1Nombor perdana 64-bit yang aritmetiknya hanya memerlukan beberapa arahan mesin, dengan subkumpulan pendaraban bagi setiap saiz kuasa dua sehingga 2³², maka menukar satu lajur kepada polinomial ialah jelmaan Fourier pantas. Surih berada di sini kerana ini medan yang paling murah.
medan cabaranlanjutan kuadratik F_p² (≈ 2¹²⁸)Cabaran yang diambil daripada Goldilocks sendiri akan meninggalkan lantai kesahihan (soundness) sekitar N/2⁶⁴ yang tidak dapat dikurangkan oleh berapa banyak pun pertanyaan. Lanjutan ini menolak sebutan itu kepada paling tinggi 2⁻¹⁰⁰ bagi surih sehingga 2²⁵ baris. Hanya cabaran yang menanggung kos medan yang lebih besar; surih tidak. Lanjutan kubik (≈ 2¹⁹²) ialah margin yang telah dinamakan jika 128 bit diperlukan pada masa hadapan.
faktor pengembangan8 (kadar ρ = 1/8, log_blowup = 3)Dua sebab sekaligus. Jadual CPU dan ALU mempunyai peraturan berdarjah 8, dan dengan bendera pengetahuan sifar (zero-knowledge) hasil bahagi (quotient) berdarjah 9, iaitu yang paling tinggi yang boleh ditampung oleh faktor pengembangan 8; peraturan berdarjah lebih tinggi akan memaksa faktor pengembangan 16. Selain itu, keupayaan setiap pertanyaan menangkap penipu bergantung pada kadar: (1 + ρ)/2 = 9/16 bagi setiap pertanyaan yang terbukti, ρ = 1/8 yang dikonjekturkan. Faktor pengembangan yang lebih besar akan mengurangkan bilangan pertanyaan, dengan kos lanjutan darjah rendah yang lebih besar secara berkadar untuk dikira dan disimpan dalam memori oleh pembukti (prover).
pertanyaan FRI80Bilangan yang mengekalkan kesahihan terbukti pada sekitar 86 bit. Bilangan ini pernah dikurangkan kepada 27 (set kekangan 3 dan 4), yang memenuhi sasaran 100 bit yang dikonjekturkan (3·27 + 20 = 101) tetapi hanya meninggalkan kira-kira 42 bit terbukti; audit zk 2026-09-12 (dapatan ZM1) memulihkannya kepada 80. Pertanyaan merupakan sebahagian besar saiz sesuatu bukti, sebab itulah bukti himpunan (bundle) ≈ 1.50 MB. 100 bit yang terbukti memerlukan 97 pertanyaan.
grinding20 bit, dalam fasa pertanyaanSebelum kedudukan pertanyaan dipilih, pembukti mesti mencari nonce yang cincangannya bermula dengan 20 bit sifar: kira-kira sejuta cincangan, dibayar sekali oleh pembukti yang jujur dan pada setiap percubaan semula oleh penipu yang mengundi semula kedudukan. Ia menambah 20 bit dengan murah; grinding yang lebih banyak (34 bit juga akan memberikan 100 bit terbukti) menjadikan setiap bukti yang jujur lebih perlahan. Fasa komit tidak mempunyai grinding.
aritmetik lipatansehingga 8 setiap pusingan (max_log_arity = 3)Melipat lapan dan bukan dua menghasilkan satu pertiga bilangan lapisan FRI, maka setiap pertanyaan membuka lebih sedikit laluan Merkle dan bukti menjadi lebih kecil, dengan kerja yang sedikit lebih banyak bagi setiap lapisan.
polinomial akhirpemalar (log_final_poly_len = 0)FRI melipat sehingga habis dan menghantar satu nilai secara terbuka, semakan akhir yang paling ringkas bagi pengesah (verifier).
cincangan (dalam litar, Merkle, transkrip)Poseidon2, lebar 8, S-box x⁷, 4 + 22 + 4 pusingan, kadar 4, kapasiti 4Cincangan yang dibina agar murah sebagai aritmetik medan, maka mencincang di dalam bukti (komitmen, nullifier, laluan Merkle, digest program) memerlukan baris, bukan beribu-ribu operasi bit. Eksponen S-box tidak boleh berkongsi faktor dengan p − 1 = 2³²·3·5·17·257·65537, dan 7 ialah yang terkecil yang berfungsi. Lebar 8 pada kadar 4 memberikan digest empat unsur, kira-kira 256 bit. 86 pemalar pusingan ialah jadual literal dalam nod (poseidon2_constants.rs).
lebar digest4 unsur medan (≈ 256 bit)Mencukupi untuk peranan pra-imej (nullifier, komitmen: 128 bit terhadap Grover). Ia tidak mencukupi untuk rintangan perlanggaran kuantum 128 bit dalam transkrip (2²⁵⁶/³ ≈ 2⁸⁵); reka bentuk kertas putih meminta cincangan transkrip 384 bit, dan rantaian yang sedang berjalan belum menerimanya.
penyembunyian4 kata kod rawak dalam FRI; 4 unsur garam bagi setiap daun Merkle; kerawakan OS yang baharu bagi setiap buktiMinimum yang membolehkan 80 kedudukan yang dibuka dan laluan Merkle disimulasikan daripada nilai awam sahaja, supaya bukti itu berpengetahuan sifar secara statistik. Bukti bagi pembayaran yang sama yang dibuat dua kali kelihatan tidak berkaitan.
lantai jadual2⁷ baris bagi setiap jadual yang diisytiharkan (set kekangan 7)Satu bukti membuka 80 titik pertanyaan dan 2 titik luar domain bagi setiap jadual, 82 kesemuanya, dan jadual h baris dibutakan oleh h baris rawak. 64 baris terlalu sedikit dan 128 ialah kuasa dua yang seterusnya. Bilangan pertanyaan melebihi 126 akan memerlukan 2⁸.
butaan terminalsatu nilai F_p² bagi setiap jadual, pada bas BLIND (set kekangan 7)Terminal LogUp dikira daripada surih mentah, maka tanpa butaan ia ialah komitmen tanpa garam kepada jadualnya. Butaan itu ialah unsur medan lanjutan kerana satu koordinat medan asas akan mengurung anjakan itu dalam set yang nipis yang boleh diuji dengan saksi calon.
berat gas1 bagi satu baris; 3 bagi satu baris penyerapan Poseidon2; 64 bagi satu baris SHA256; 192 bagi satu baris KECCAK (set kekangan 8)Setiap berat mengira baris yang ditarik oleh baris itu ke dalam jadual lain: satu baris penyerapan menarik satu pilih atur 32 baris, satu baris SHA256 menarik 64 baris berlajur 466, satu baris KECCAK menarik 32 baris berlajur 2,612 dan 100 baris memori.
darjah kekangan maksimum8Ditetapkan oleh faktor pengembangan di atas; darjah setiap jadual ditentukan oleh satu ujian supaya peraturan baharu tidak dapat melebihinya secara senyap.
peringkat (tier)10, 12, 14, 16, 18, 20Jadual disaizkan dalam enam langkah tetap, setiap satu empat kali ganda yang sebelumnya, dan bukti hanya mendedahkan peringkatnya: baldi kasar yang dilapik bagi panjang larian, bukan bilangan kitarannya. Setiap himpunan (bundle) ialah peringkat 14 dan setiap bukti pengesahan (auth) peringkat 10; panggilan dihadkan pada peringkat 14 sejak fullnode v0.5.6.
surih maksimum2²⁴ baris (2²⁵ dengan bit pengetahuan sifar)Saiz yang menjadi asas pembuktian sebutan medan lanjutan; surih yang lebih panjang ditolak dan tidak dibuktikan di bawah tuntutan kesahihan yang tidak benar.
nilai awam35 unsur medanpc masuk, peringkat, lapan perkataan output, tiga digest lapan perkataan hc, H_IN, H_PUB, dan had gas yang diisytiharkan: kenyataan terkecil yang menamakan program, input persendirian, input awam dan had bagi kerja yang dilakukan. Ia 34 sehingga set kekangan 7.
had saiz buktilalai 2 MiB; 4 MiB pada chain 20 (max_proof_bytes)2 MiB melebihi setiap bukti yang dihasilkan oleh guest yang dikerahkan tanpa jadual cincangan dan di bawah bukti yang membawa keccak (≈ 3.3 MB); genesis chain 20 menetapkan 4,194,304 untuk menerima kedua-duanya, seperti chain 17 hingga 19. Chain 13 hingga 16 menetapkan 8 MiB. Had ini disemak sebelum bukti dinyahkod.

Apa yang dihasilkan oleh angka-angka ini: kesahihan terbukti 86 bit, sekitar 100 di bawah konjektur ethSTARK (di mana medan lanjutan, bukan pertanyaan, yang menjadi had), dan sekitar 85 bit terhadap lawan kuantum, yang ditetapkan oleh cincangan transkrip 256 bit. Kertas putih sengaja menyimpan kedua-dua angka kesahihan itu bersebelahan: setiap FRI-STARK yang dikerahkan bergantung pada konjektur itu bagi bit-bit terakhirnya, dan pembaca yang menentukan saiz sesuatu pengerahan patut tahu andaian mana yang menanggung bit yang mana.

Bukti tentang bukti

Pada kira-kira 1.50 MB, bukti himpunan (bundle) ialah berat, bukti pengesahan (auth) 1.37 MB berada di sebelahnya, dan setiap nod menyimpan kesemuanya. Penawar yang telah dibina ialah rekursi: bukti yang kenyataannya ialah “saya telah mengesahkan bukti-bukti ini”. Fullnode membawa mesin kedua yang lebih kecil untuknya, iaitu VM rekursi, yang perkataan asalnya ialah unsur Goldilocks dan yang arahannya ialah operasi pengesah itu sendiri (aritmetik medan, Poseidon2, langkah Merkle dan FRI). Program agregatnya memainkan semula pengesahan penuh N bukti himpunan dan menerbitkan digest ke atas nilai awam bukti-bukti itu, terikat kepada rantaian, pengagregat dan satu nonce. Mengesahkan satu bukti himpunan di dalamnya menelan 1,968,619 baris di bawah set kekangan 6 dan 2,044,506 di bawah set kekangan 7; ia belum diukur semula di bawah set 8. Ia telah dilaksanakan dan dimatikan oleh genesis pada setiap rantaian setakat ini, termasuk chain 20. Program agregat hanya mengesahkan bukti himpunan, maka pada rantaian dengan kebenaran terpisah bukti pengesahan akan kekal. Bukti pengeluarannya juga memerlukan lebih banyak memori daripada yang dirancang: diukur di bawah set kekangan 7, 133 GB dan lebih (Upcoming: block aggregation).

Apa yang tidak dituntut oleh skema ini

  • Margin kuantum ialah kira-kira 85 bit, bukan 128. Carian perlanggaran kuantum pada cincangan n-bit berkos kira-kira 2ⁿ/³. Reka bentuk kertas putih menetapkan cincangan transkrip 384-bit; rantaian yang sedang berjalan menggunakan digest Poseidon2 256-bit. Melebarkannya memerlukan set kekangan baharu dan hard fork.
  • 100 bit ialah konjektur; 86 telah dibuktikan. Menaikkan angka yang dibuktikan kepada 100 akan memerlukan 97 pertanyaan, iaitu kira-kira seperlima lebih banyak data pertanyaan bagi setiap bukti.
  • Pemalar Poseidon2 ialah cabutan berbenih, bukan instansiasi yang diterbitkan. Tiada serangan terhadapnya diketahui; menggunakan set piawai akan mengubah setiap cincangan pada rantaian.
  • Sesetengah pernyataan disemak di samping bukti, bukan di dalamnya. Nilai awam TIER dibandingkan dengan bentuk bukti oleh verifier tetapi tidak dikekang oleh litar (audit ZL1), dan disiplin taint bagi guest bundle disokong oleh hujah struktur, harness guest yang dilemahkan dan fuzzing mutasi, bukan disahkan secara mesin.
  • Pengepala bukti tidak disembunyikan. Tier dan kedua-dua ketinggian jadual cincangan terdedah, maka bukti panggilan menunjukkan sama ada panggilan itu menggunakan KECCAK atau SHA256. Terdapat pilihan prover yang mengisi kedua-dua jadual, dan tiada dompet yang menetapkannya: ia menaikkan bukti tier-10 daripada kira-kira 1.3 MB kepada kira-kira 3.6 MB.
  • Syscall POSEIDON2 tidak bersifat injektif bagi input panjang berubah. Ia dikekalkan seperti sedia ada kerana setiap komitmen, nullifier, root dan digest program bergantung padanya. Tiada guest yang dihantar menggunakan POSEIDON2_LEN setakat ini.
  • Pembuktian adalah perlahan dan dilakukan oleh penghantar, atau oleh prover yang dipasangkan dengan penghantar: kira-kira 100 s dan 5.7 GB pada CPU komputer riba bagi satu bundle. Kernel GPU pertama kali dijalankan pada GPU (NVIDIA H100) pada 2026-09-28 dan sepadan dengan rujukan CPU; dompet masih membuktikan pada CPU.

Where to read more

  • Bahagian kertas putih “The Zero-Knowledge Scheme: How a Rand Proof Works” (randprotocol.tex) menerangkan tujuh bahan yang sama berserta teorem kesolidan.
  • Kertas pelaksanaan (randprotocol_implementation.tex) menentukan set arahan dan syscall, guest bundle, sponge dan digest, setiap jadual dan bus, konfigurasi mesin serta VM rekursi.
  • Kod: crates/randprotocol-zkvm/src/ dalam fullnode — emulator.rs, tables/, machine.rs, gas.rs, guests.rs, hash.rs, poseidon2_constants.rs.

Disahkan kali terakhir terhadap commit fullnode c0878c3f (rantai 21) pada 2026-10-12, dan fullnode `90e7716` (v0.6.7 on chain 18, `crates/randprotocol-zkvm`, constraint set 8), fullnode `c9c9bd3c` (v0.6.8 on chain 20: ZKV-4 in `crates/randprotocol-zkvm/src/executor.rs`, `binding_domain` in `crates/randprotocol-core/src/types/binding.rs`; no constraint change), fullnode `c0878c3f` (v0.8.0 on chain 21: `docs/zkvm.md` §8a, constraint set 9 — the `MODQ` syscall and the optional `modq` table; `docs/shielded.md` §2, the multisig auth guest's pinned shape), circuits `aeacf31`, `research/docs/02-tables-and-buses.md`, `research/docs/03-privacy.md` (the FRI profile, the degree ceiling, the table floor and the blinded terminals), whitepapers `8f4275b` (`randprotocol.tex` §“The Zero-Knowledge Scheme”, `randprotocol_implementation.tex` §§4.10–4.15). Jika kod dan halaman ini tidak selari, kodlah yang betul; sila maklumkan kepada kami.