Gunakan halaman ini untuk memilih pustaka yang tepat saat Anda berinteroperasi dengan chain, untuk memeriksa suatu parameter terhadap apa yang diberlakukan node, dan untuk menghitung ulang sendiri sebuah id atau komitmen. Setiap nilai di sini adalah nilai yang dijalankan kode pada chain 20 (fullnode v0.6.8).
Primitif dan tempat penggunaannya
| primitif | parameter | digunakan untuk |
|---|---|---|
| Dilithium2 | kunci publik 1,312 byte, tanda tangan 2,420 byte; pasangan kunci diturunkan dari seed 32 byte | suara validator dan proposal blok; pencetakan faucet; Unbond, Withdraw, dan Registration seorang validator; suara pada AdmitValidator (chain 20); aksi aggregator; otoritas pencetakan Key milik token RPL (TokenMint, SetAuthority); tanda tangan bersama guardian pascakuantum milik bridge, kunci jedanya, dan, pada chain 20, bukti kepemilikan kunci-kunci baru dalam sebuah rotasi (di bawah) |
| ML-KEM-768 | kunci enkapsulasi 1,184 byte, ciphertext 1,088 byte | menyegel kunci per-transaksi dari sebuah amplop catatan ke alamat penerima; menyegel amplop input panggilan untuk seorang auditor; menyegel sebuah pekerjaan pembuktian untuk prover yang dipasangkan |
| ChaCha20-Poly1305 | kunci 32 byte, nonce acak 12 byte di depan, tag 16 byte | setiap bagian amplop: isi catatan, kunci transaksi yang dibungkus, transkrip input panggilan; pekerjaan dan balasan prover yang dipasangkan |
| BLAKE3 | keluaran 32 byte, selalu dengan string domain di depannya | alamat, id transaksi, pengikatan transaksi dan pengikatan panggilan, id program, id aset token, state root beserta pohon Merkle-nya, identitas p2p, pesan penandatanganan, id aset bridge, blinding sebuah setoran bridge, dan blinding catatan biaya bridge |
| Poseidon2 atas Goldilocks | lebar 8, rate 4, kapasitas 4, sponge timpa tanpa padding; elemen pesan berupa kata 32 bit; 86 konstanta putaran adalah tabel literal di kode sumber node (poseidon2_constants.rs) sejak pemotongan chain-15, dengan nilai yang sama seperti yang dihasilkan undian ber-seed sebelumnya | segala sesuatu di dalam sebuah bukti: kunci, komitmen catatan, nullifier, pohon komitmen, digest program hc, komitmen input H_IN dan H_PUB, digest bundle, komitmen otorisasi |
| secp256k1 ECDSA + keccak256 | tanda tangan low-s, alamat guardian 20 byte gaya Ethereum, mu = keccak256(keccak256(body)) | atestasi guardian bridge, sehingga kunci yang sama berfungsi pada kontrak EVM, program Solana, dan Rand; pada Rand setiap atestasi juga memerlukan kuorum Dilithium2 di bawah |
| bech32m (BIP-350) | bagian yang dapat dibaca manusia rpl, payload 32 byte, 52 karakter data + 6 karakter checksum = 62 | bentuk teks rpl1… dari id aset token RPL |
| Plonky3 batch STARK | Goldilocks p = 2⁶⁴ − 2³² + 1, FRI hiding, blowup 8, arity pelipatan 8, 80 query, 20 bit proof-of-work | setiap bukti bundle, bukti auth, dan bukti panggilan; sebuah bukti bundle dan bukti auth-nya membawa delapan kata pengikatan transaksinya sebagai segmen input publiknya |
Parameter target dalam whitepaper berbeda di beberapa tempat dari yang dijalankan implementasi (misalnya hash transkrip 384 bit dalam makalah dibandingkan transkrip Poseidon2 milik zkVM). Halaman-halaman ini menjelaskan kodenya.
Tanda tangan bersama pascakuantum pada bridge
Atestasi guardian bridge menggunakan secp256k1 ECDSA, yang dapat dipalsukan oleh adversari kuantum. Sejak chain 14, setiap BridgeAttest — baik setoran maupun rotasi set guardian — juga harus membawa kuorum tanda tangan Dilithium2 dari guardian yang sama atas digest yang sama:
M = "rand-bridge-pq-cosign-1" || rand_chain_id (u64 BE) || mu // 63 bytes, deterministic signing
dengan mu = keccak256(keccak256(body)) adalah yang ditandatangani kuorum ECDSA. Id chain Rand dalam M mencegah tanda tangan bersama testnet terverifikasi di chain Rand lain, sekalipun kunci guardian digunakan ulang. M hanya mengikat id chain, pada chain 20 juga: ini adalah satu-satunya pesan bertanda tangan yang tidak dipindahkan binding_domain ke belakang genesis hash, karena daemon guardian yang menandatanganinya berada di repositori lain. Salinan sebuah chain dengan id chain yang sama dan set guardian yang sama akan menerima tanda tangan bersama atas setorannya; indeks set guardian tidak ada dalam M, sehingga sebuah tanda tangan bersama tetap berlaku setelah rotasi set ECDSA. Field pq_signatures pada aksi adalah daftar PqSignature { index: u8, signature }, diperiksa dari yang murah ke yang mahal: quorum(n) ≤ len ≤ n (PqNoQuorum), indeks naik secara ketat (PqIndexOrder), setiap indeks di bawah n (PqIndexOutOfRange), setiap tanda tangan tepat 2,420 byte (PqBadSignatureLength), dan terakhir setiap tanda tangan diverifikasi di bawah pq_guardians[index] (PqBadSignature). Penanda tangan PQ tidak harus penanda tangan ECDSA; setiap kuorum dihitung sendiri-sendiri. Field ini berada di dalam pengikatan transaksi, sehingga tidak dapat dilepas atau ditukar pada sebuah salinan.
Set PQ adalah bridge.pq_guardians pada genesis — delapan kunci 1,312 byte pada chain 20, seperti pada chain 15 sampai 19, selaras indeksnya dengan set ECDSA genesis, set guardian 1 (chain 14 memiliki enam, selaras dengan set 0). Rotasi set guardian ECDSA tidak pernah memindahkannya. Pada chain 14 set itu tetap selama hidup chain; sejak chain 15 genesis membawa grup rules_v2 milik bridge, yang memungkinkan kuorum PQ mengganti seluruh set PQ (RotatePqGuardians) atau kunci jeda (RotatePauseKey), masing-masing di bawah rotation_nonce milik bridge. Genesis chain 20 menambahkan bridge.rotation: sebuah rotasi harus berupa aksi V2, yang membawa tanda tangan Dilithium2 milik setiap kunci baru atas pesan yang sama (bukti kepemilikan), dan berlaku satu hari setelah masuk kecuali dibatalkan oleh kunci jeda saat ini (Bridge). rand_getBridgeState menyajikan kunci-kunci tersebut, dan bridge_attest yang didekode mencantumkan pq_signers, yaitu indeks yang menandatangani. Kuorum PQ yang sama mengotorisasi pesan tata kelola bridge, masing-masing berupa tata letak big-endian tetap yang membawa id chain dan sebuah nonce. Pada chain 20 (genesis binding_domain: 1) digit versi setiap domain adalah 2 dan genesis hash 32 byte berada di antara domain dan id chain; chain 14 sampai 19 menggunakan bentuk -1:
| pesan | domain (chain 14–19 / chain 20) | ditandatangani oleh |
|---|---|---|
M_pause | rand-bridge-pause-1 / -2 | satu kunci jeda genesis (Dilithium2), yang dapat menjeda dan tidak pernah dapat membatalkan jeda |
M_unpause | rand-bridge-pq-unpause-1 / -2 | kuorum guardian PQ |
M_list | rand-bridge-pq-list-1 / -2 | kuorum guardian PQ (ListBacking) |
M_register | rand-bridge-pq-register-1 / -2 | kuorum guardian PQ (RegisterBridgedToken) |
M_rotate_pq | rand-bridge-pq-rotate-pq-1 / -2 | kuorum dari set PQ saat ini (RotatePqGuardians, chain rules_v2); pada chain 20 juga setiap kunci baru, sebagai bukti kepemilikannya |
M_rotate_pause | rand-bridge-pq-rotate-pause-1 / -2 | kuorum dari set PQ saat ini (RotatePauseKey, chain rules_v2); pada chain 20 juga kunci baru |
M_cancel | rand-bridge-cancel-rotation-1 / -2, dengan byte kind di akhir | kunci jeda saat ini (CancelRotation, chain dengan bridge.rotation: chain 20) |
STARK dalam produksi
zkVM berada pada constraint set 8: sembilan tabel wajib (program, cpu, memory, alu, range, nibble, poseidon2, input, public) ditambah tabel keccak dan tabel sha256 yang hanya dibawa sebuah bukti bila guest-nya memanggil syscall yang sesuai, dihubungkan oleh tujuh belas bus dan dibuktikan sebagai satu batch STARK. Sejak constraint set 7, setiap tabel yang dideklarasikan memiliki setidaknya 2⁷ baris dan terminal LogUp setiap tabel di-blind melalui bus ketujuh belas, BLIND. Antarmuka publik sebuah bukti terdiri dari 35 elemen field (pv::NUM): pc masuk, tier, delapan kata keluaran, digest program hc (8 kata), komitmen input privat ber-salt H_IN (8), digest segmen publik tanpa salt H_PUB (8), dan, sejak constraint set 8, batas gas yang dideklarasikan GAS_LIMIT.
| parameter | produksi | keterangan |
|---|---|---|
| query FRI | 80 | penyetelan ulang 27 query pada constraint set 3 dan 4 dibatalkan setelah audit 2026-09-12: penyetelan itu menyisakan ~42 bit terbukti |
| blowup | 8 (log_blowup = 3) | derajat constraint maksimum setiap tabel dipatok di bawah batas 8 |
| arity pelipatan | 8 | |
| bit proof-of-work | 20 | |
| soundness | 3·80 + 20 = 260 bit secara konjektural (ethSTARK); sekitar 86 bit terbukti di bawah proximity gaps | |
| zero knowledge | statistik: LDE dan polinomial batch FRI diacak, sehingga dua bukti dari satu eksekusi berbeda | sejak constraint set 7 setiap tabel yang dideklarasikan berukuran setidaknya 2⁷ baris, lebih banyak dari 82 titik yang dibuka sebuah bukti, dan terminal LogUp di-blind |
| tier | 10, 12, 14, 16, 18, 20 | sebuah bukti mengungkap tier, tidak pernah jumlah siklus; sejak fullnode v0.5.6 bukti panggilan di atas tier 14 ditolak (CallTierTooHigh), bukti bundle dipatok pada tier 14 dan bukti auth pada tier 10 |
| batas bukti | max_proof_bytes pada genesis: 4 MiB (4,194,304) pada chain 17 sampai 20; 8 MiB pada chain 13 sampai 16; 2 MiB (MAX_PROOF_BYTES) pada genesis tanpanya, seperti chain 12 | 2 MiB berada di atas setiap bukti tanpa tabel hash yang dapat dihasilkan guest yang telah di-deploy dan di bawah bukti yang membawa keccak; 4 MiB menampung keduanya |
| gas | 1 per baris cpu; 3 per baris absorb Poseidon2; 64 per baris SHA256; 192 per baris KECCAK | diakumulasikan dalam kolom GAS tabel cpu dan dibuktikan paling banyak GAS_LIMIT; verifier menolak batas di atas gas_max(t, k, s) = (2ᵗ − 1) + 2ᵗ⁻² + 191·(2ᵏ/32) + 63·(2ˢ/64), yaitu 1,279 untuk header tier-10 tanpa hash dan 20,479 untuk header tier-14 |
Ukuran terukur pada constraint set 6 (Apple Silicon, build rilis): proof produksi tanpa keccak berukuran 1.298.729 byte pada tier 10 dan 1.359.978 pada tier 12; proof tier 10 yang membawa keccak berukuran 3.198.430, di atas bawaan 2 MiB dan di bawah 8 MiB milik chain 13 hingga 15. Proof tier 14 dari guest bundle 2-in-2-out yang telah dipensiunkan berukuran 1.321.773 byte pada chain 8, dan 1.418.406 hingga 1.420.423 byte pada chain 13. Guest bundle aset tersembunyi 4-in-4-out milik chain 14 tetap berada pada tier 14 tanpa kedua tabel hash, dan proof-nya berukuran 1.422.116 dan 1.423.170 byte pada chain 14 (2026-09-20), sedangkan chain 15 mematok guest yang sama (hc_bundle tidak berubah); proof bundle di sana mendeklarasikan public_log_height 4, yaitu tinggi dari kedelapan kata pengikat, dan node menolak nilai lain mana pun sebelum membangun verifier key. Proof panggilan ERC-20 approve yang membawa keccak, dibuat pada chain 13 pada 2026-09-19 (tier 16), berukuran 3.412.405 byte; setiap chain sejak fullnode v0.5.6 menolak panggilan itu, pada tier 16.
Kolom blinding dan batas bawah tabel pada constraint set 7 menambah sekitar 5% pada proof tanpa hash: sebagaimana diukur oleh fullnode pada 2026-09-28, fib berukuran 1.367.688 byte pada tier 10 dan 1.424.299 pada tier 12, proof tier 10 yang membawa keccak 3.283.898, dan proof bundle aset tersembunyi tier 14 1.498.821 (guest v1) dan 1.497.156 (guest v2). Sejak itu proof bundle mendeklarasikan public_log_height 7. Constraint set 8 menambah kurang dari 1%. Diukur pada chain 18 pada 2026-09-30 (Apple Silicon): proof auth berukuran 1.364.940 hingga 1.375.371 byte (tier 10), proof bundle 1.494.151 hingga 1.504.260 byte (tier 14, guest v3), dan proof panggilan 1.498.589 byte pada tier 14 tanpa tabel hash, 1.911.152 pada tier 14 dengan tabel SHA-256, dan 3.346.865 pada tier 12 dengan tabel Keccak. Semuanya muat dalam batas 4 MiB milik chain 18 hingga 20.
Verifikasi memakan waktu sekitar 16 ms dengan verifier key yang sudah hangat dan sekitar 230 ms saat key (tier, heights) dibangun untuk pertama kalinya. Profil FRI test (16 query) ada untuk rangkaian pengujian dan tidak aman; genesis chain 20 mematok production. Fullnode v0.6.8 tidak mengubah constraint apa pun: chain 20 mematok hc_bundle dan hc_auth yang sama dengan chain 17 hingga 19.
Konstruksi hash yang dapat Anda reproduksi
BLAKE3 dengan domain: blake3(domain || data), string domain tanpa pemisah.
Domain pengikat. Genesis chain 20 menetapkan binding_domain: 1 (fullnode v0.6.8, audit v6 BIND-1). Pada chain semacam itu, setiap pengikatan proof dan setiap pesan aksi yang ditandatangani yang sebelumnya hanya mengikat chain id kini mengikat hash genesis juga: nomor versi domain naik satu dan hash genesis 32 byte ditempatkan paling depan dalam preimage, sebelum chain id. Proof atau tanda tangan yang dibuat untuk satu chain kemudian tidak terverifikasi pada chain lain mana pun, bahkan yang memakai ulang chain id dan key yang sama, sebagaimana terjadi pada re-cut. Kata-kata pengikat adalah input publik dari proof, sehingga tidak ada guest atau verifier key yang berubah. Tabel memuat kedua bentuk; chain 14 hingga 19 memakai bentuk pertama, byte demi byte. Sudah terikat pada genesis sebelumnya, dan tidak berubah: suara dan proposal (sejak consensus_domain: 1), Registration v2, dan suara AdmitValidator. Tidak dipindahkan: ko-tanda tangan mint dari bridge (di atas). Wallet memerlukan v0.6.8 untuk mengirim pada chain 20, dan menentukan bentuknya berdasarkan chain id, bukan berdasarkan apa yang diklaim sebuah node; rand_getLimits.binding_domain melaporkannya.
| nilai | konstruksi |
|---|---|
| alamat transparan | blake3("rand-address" || dilithium2_public_key), base58 |
| id transaksi | blake3("rand-txid-3" || bincode(view)), dengan view adalah transaksi yang byte proof milik bundle-nya diganti dengan blake3(proof) dan auth proof-nya dengan blake3(auth_proof); auth_commit masuk apa adanya. Domainnya adalah rand-txid-2, tanpa field auth, hingga chain 16 |
| pengikatan transaksi | blake3("rand-tx-bind-1" || bincode(chain_id, bundle', action')) pada chain 14 hingga 19; blake3("rand-tx-bind-2" || bincode(genesis_hash, chain_id, bundle', action')) pada chain 20. Delapan kata u32 little-endian, dengan ' mengganti bundle.proof, bundle.auth_proof, dan proof milik Aggregate dengan vektor kosong; bincode dengan bilangan bulat lebar tetap little-endian. Setiap proof bundle dan auth proof dibuat atas dan diverifikasi terhadap kata-kata ini |
| pengikatan panggilan | blake3("rand-call-bind-1" || …), atau rand-call-bind-2 dengan hash genesis di depan pada chain 20: konstruksi pengikatan transaksi dengan proof milik Call (atau Invoke) itu sendiri juga dikosongkan. Pada genesis hardening_v6, seperti chain 20, segmen publik proof panggilan adalah kata-kata publik program yang ditetapkan saat deploy, diikuti kedelapan kata ini, dan milik Invoke menambahkan transisinya sebagai kata konteks setelahnya |
| id program | blake3("rand-program" || base_pc as 4 LE bytes || words as 4 LE bytes each) |
| identitas p2p | key ed25519 dari blake3("rand-p2p-identity" || seed) |
| id aset bridge (per backing) | blake3("rand-bridge-asset" || token_chain as 2 BE bytes || token_address (32 bytes)) — rand_bridgeAssetId menghitungnya dan rand_getAssets mencetaknya per baris backing; id ini mengidentifikasi koin sumber pada wire, bukan token-nya |
| id aset token RPL, native | blake3("rand-rpl-asset" || bincode(name, symbol, decimals, authority, initial: Option<InitialMint>, salt)), salt berupa 32 byte pilihan pembuat; ditampilkan sebagai hex dan sebagai rpl1… |
| id aset token RPL, bridged | blake3("rand-rpl-asset" || bincode(name, symbol, BRIDGE_DECIMALS, salt)) — tidak dihitung atas pasangan (chain, token), karena satu token bridged mencakup beberapa backing |
| blinding deposit bridge | r = blake3("rand-deposit-r-1" || mu), satu-satunya r yang diterima admisi untuk sebuah BridgeAttest (selain itu WrongDepositBlinding) |
| blinding note biaya bridge (chain 20) | note biaya sebuah deposit: r = blake3("rand-bridge-fee-r-1" || mu); milik sebuah burn: r = blake3("rand-bridge-burn-fee-r-1" || txid); keduanya dibaca sebagai delapan kata little-endian. Note tersebut tidak memiliki envelope: setiap field bersifat publik, dengan pemiliknya adalah bridge.fees.recipient dari genesis |
| penerima bridge | blake3("rand-shielded-recipient" || pk_bytes || kem_ek) atas alamat shielded lengkap |
pesan Mint faucet | blake3("rand-mint-2" || bincode(chain_id, cm, pk, time, r, envelope, amount)); pada chain 20 blake3("rand-mint-3" || bincode(genesis_hash, chain_id, cm, pk, time, r, envelope, amount)) |
pesan TokenMint, SetAuthority | blake3("rand-rpl-mint-1" or "rand-rpl-authority-1", chain_id || asset_id || nonce || body); body sebuah mint memuat blake3(bincode(envelope)). Pada chain 20 rand-rpl-mint-2 dan rand-rpl-authority-2, dengan hash genesis di depan |
pesan Registration | blake3("rand-register-2" || bincode(genesis_hash, chain_id, validator, payout)) pada genesis dengan staking.registration_v2 atau binding_domain: 1, seperti chain 20 (registrasi v1 ditolak di sana); blake3("rand-register" || bincode(chain_id, payout)) di tempat lain |
suara AdmitValidator (chain 20) | blake3("rand-admit-validator-1" || genesis_hash || candidate_address), ditandatangani oleh setiap validator yang memberikan suara |
pesan Unbond | blake3("rand-unbond" || bincode(chain_id, validator, amount, nonce)); pada chain 20 blake3("rand-unbond-2" || bincode(genesis_hash, chain_id, validator, amount, nonce)) |
pesan Withdraw | blake3("rand-withdraw" || bincode(chain_id, validator, amount, nonce, time, r, envelope)); pada chain 20 rand-withdraw-2, dengan hash genesis di depan |
| node Merkle (pohon state) | blake3("rand-merkle-node" || left || right) |
| leaf registri token | blake3("rand-token-leaf-1" || bincode(TokenInfo)), dalam urutan indeks, di bawah tokens_root |
| state root | pada chain 20, blake3("rand-state-admitted-1" || inner || admitted_root) yang membungkus inner = blake3("rand-state-8" || tree_root || nullifier_root || validators_root || programs_root || bridge_root || tokens_root || faucet_epoch || faucet_minted_in_epoch || bond_queue_root || gas_price || byte_price || program_state_root), dengan program_state_root = blake3("rand-program-state-1" || cells_root || vaults_root) (RPL-2), kedua penghitung faucet dan kedua harga aktif masing-masing berupa 8 byte big-endian, dan pembungkusnya mengikat himpunan yang diadmisi (staking.admission_by_vote). Milik chain 19 adalah blake3("rand-state-7" || …) atas field yang sama hingga byte_price (seksi staking pada genesis menambahkan ketiganya setelah tokens_root di bawah rand-state-5, seperti pada chain 15 hingga 17; seksi gas.dynamic pada genesis menambahkan kedua harga dan memindahkan domain ke rand-state-7); rand-state-4 atas enam yang pertama pada chain 14; rand-state-2 atas empat yang pertama pada chain tanpa seksi bridge, tokens, atau aggregation (Konsensus) |
Poseidon2 dengan tag domain: H(domain, msg) = sponge_hash([domain, msg...]), dengan tag sebagai kata pertama yang diserap, setiap kata berupa elemen Goldilocks, digest 4 elemen dipecah menjadi delapan kata u32 (separuh rendah lalu separuh tinggi dari setiap elemen). Tag domain:
| tag | nilai | konstruksi |
|---|---|---|
NK | 1 | kunci pengamat nk = H(1, sk) |
PK | 2 | nilai publik catatan pk = H(2, nk) |
NF | 3 | nullifier H(3, nk || cm) |
CM | 4 | komitmen catatan H(4, pk(8) || from(8) || amount_lo || amount_hi || asset || time || r(8)) — 28 word |
OVK, KEM_SEED | 5, 6 | kunci pengamat keluar dan seed ML-KEM, melalui hash lebar mode penghitung [domain, nk, counter] |
NODE | 7 | simpul pohon H(7, left || right); daun kosong berisi nol semua |
HC | 8 | digest program; tag, base_pc, dan len berada di lajur kapasitas pada permutasi pertama, lalu word diserap empat per blok |
OUT | 9 | digest keluaran guest transfer |
IN | 10 | H_IN: header kapasitas [10, n_in, 0], lalu salt 4 word, lalu input |
BUNDLE | 11 | digest bundle 2-masuk-2-keluar yang sudah dipensiunkan atas 47 word publik; tidak ada chain yang masih menyematkan guest tersebut |
| bundle tersembunyi | 64 | digest bundle aset tersembunyi atas 81 word pada chain 14 sampai 16: anchor, empat nullifier, empat komitmen, fee, burn_a, burn_r (masing-masing dua word), burn_asset, time, dan word taint di urutan terakhir. Pada chain 17 sampai 20 (guest bundle v3) jumlahnya 89 word: delapan word komitmen otorisasi c berada tepat sebelum word taint. Aset privat A tidak termasuk di dalamnya. Tag ini bersifat lokal node dan berada jauh dari tag vendor 1 sampai 15 |
AUTH | 65 | komitmen otorisasi c = H(65, nk || salt), 16 word, dengan salt 256-bit baru untuk setiap bundle; dipublikasikan oleh bukti bundle di dalam digest-nya dan oleh bukti auth sebagai delapan word keluarannya, serta dibawa oleh bundle sebagai auth_commit (chain 17 sampai 20). Lokal node, seperti 64 |
PUB | 15 | H_PUB: header [15, n_pub, 0], tanpa salt; untuk program, pada chain 20 word-nya ditetapkan saat deploy (paling banyak 32.768), segmen setiap panggilan adalah word tersebut diikuti delapan word pengikatan panggilan, dan panggilan diperiksa terhadap digest segmen itu; untuk bukti bundle dan bukti auth, segmennya adalah delapan word pengikatan transaksi; genesis tanpa max_program_public_words hanya menerima segmen kosong |
hc, H_IN, dan H_PUB bukan sponge berawalan pesan biasa: header dimasukkan ke dalam kapasitas sehingga baris digest pada tabel cpu menyerap tepat empat word per permutasi. Reproduksi ketiganya dengan crate vendor (randprotocol_zkvm::hash::{input_digest, public_digest}, isa::Program::digest), bukan secara manual.
Sponge biasa tidak melakukan padding, sehingga di dalam blok pertama [a] dan [a, 0] menghasilkan hash yang sama. Setiap konstruksi di atas meng-hash pesan berpanjang tetap di bawah tag-nya sendiri. Untuk data yang panjangnya dapat bervariasi, constraint set 7 menambahkan sponge terikat panjang (hash::sponge_hash_len, syscall POSEIDON2_LEN): sponge ini dimulai dari state [0, 0, 0, 0, n, 0, 0, 0], dengan n jumlah word, dan melakukan permutasi setidaknya sekali. Hasilnya adalah hash yang berbeda dari word yang sama, dan tidak ada catatan, nullifier, root, atau digest pada chain yang menggunakannya.
Dua sifat yang perlu diingat: hc bersifat mengikat tetapi tidak menyembunyikan (tanpa salt, sehingga program yang ditebak dapat dikonfirmasi dan dua deployment dari satu program dapat dihubungkan), sedangkan H_IN bersifat menyembunyikan sekaligus mengikat (salt 128-bit baru per bukti), sehingga mempublikasikan H_IN tidak mengungkapkan apa pun tentang input sampai pemegang salt membukanya.
Derivasi kunci
| kunci | dari |
|---|---|
| pasangan kunci Dilithium2 (node) | deterministik dari seed 32 byte |
| libp2p ed25519 (node) | blake3("rand-p2p-identity" || seed) |
kunci pengamat, pk, ovk, pasangan kunci ML-KEM (wallet) | derivasi Poseidon2 dari spend key seperti pada tabel di atas; pasangan ML-KEM adalah MlKem768::from_seed(kem_seed) |
Makalah pada halaman makalah memuat argumen keamanannya: pilihan pascakuantum, perhitungan soundness FRI beserta alasan 80 query dipertahankan, dan batas panjang trace.