Rand Protocol
Dokumentasi
Panduan

Program

Model program sulit - tetamu RISC-V yang dibuktikan dalam zkVM, dikerahkan sekali dan dipanggil dengan input persendirian - beserta arahan build, deploy, call, invoke dan receipt, keadaan program RPL-2 pada chain 20, dan senarai jujur tentang perkara yang belum dapat dilakukan.

Gunakan halaman ini untuk meletakkan program di rantaian dan memanggilnya: apa itu program, cara membinanya, apa yang diterbitkan dan disembunyikan oleh sesuatu panggilan, cara membaca semula resit, dan had yang akan anda temui. Setiap program ialah kod awam; setiap panggilan ialah bukti. Program contoh mengandungi aplikasi lengkap, dan randprotocol/example-programs mengandungi sumber program yang dikerahkan pada chain 20, termasuk program RPL-2 (di bawah).

Apa itu program

Program ialah kod mesin RV32IM untuk zkVM Rand: { base_pc: u32, words: Vec<u32> }, paling banyak sebanyak had program rantaian (65,535 perkataan pada chain 20, seperti pada setiap rantaian sejak chain 13; 4,096 pada genesis tanpa max_program_words, seperti chain 12), dengan base_pc gandaan 4, dan setiap perkataan dinyahkod sebagai arahan (perkataan yang tidak dapat dinyahkod ditolak semasa pengerahan, bukan semasa pelaksanaan). Chain 20, seperti chain 19, turut enggan mengerahkan program yang tidak dapat dimuatkan oleh mana-mana panggilan: lebih daripada 8,180 perkataan tanpa segmen awam, atau kurang daripada itu dengan segmen awam (di bawah). Program beralamat kandungan dan tidak boleh diubah:

program_id = blake3("rand-program" || base_pc || words)       // the id, with no public input
program_id = blake3("rand-program-2", base_pc || u32_le(len(words)) || words || u32_le(len(public)) || public)   // deployed with --public
code_hash  = hc = Poseidon2 digest of (base_pc, len, words)    // what calls are verified against

Panggilan ialah bukti STARK bahawa program dengan digest hc telah dijalankan pada beberapa input persendirian, tidak menggunakan gas melebihi had yang diisytiharkan, dan menerbitkan lapan perkataan output. Nod mengesahkan bukti, merekodkan resit, dan tiada apa-apa lagi berlaku: output ialah data, bukan kesan. Panggilan tidak boleh memindahkan RAND; pemanggil memindahkan nilai dalam bundle yang membayar bagi panggilan itu, dan output program membawa apa-apa maksud yang dipersetujui oleh program dan pemanggilnya. Pada chain 20, Invoke ialah pengecualian: buktinya menjamin peralihan keadaan yang diisytiharkan, yang kemudian dikenakan oleh lejar (Keadaan program (RPL-2)).

Apa yang boleh dilakukan oleh guest:

kumpulanarahan
atas / lompatanLUI AUIPC JAL JALR
cabangBEQ BNE BLT BGE BLTU BGEU
muat / simpanLW SW LB LH LBU LHU SB SH
ALUADDI SLTI SLTIU XORI ORI ANDI SLLI SRLI SRAI ADD SUB SLL SLT SLTU XOR SRL SRA OR AND
RV32MMUL MULH MULHU MULHSU DIV DIVU REM REMU
sistemECALL; tidak pernah FENCE, CSR, EBREAK, ekstensi A atau C

Syscall, mengikut nombor dalam a7:

#syscallkesan
0HALTmenamatkan pelaksanaan
1WRITE_OUTPUT slot wordmengunci output awam slot < 8; setiap slot paling banyak sekali, slot yang tidak ditulis bernilai sifar
2READ_INPUT idxmengembalikan perkataan input persendirian idx, terikat kepada komitmen bergaram H_IN
3POSEIDON2 ptr nmenghash n ≤ 4096 perkataan di tempat dengan span Poseidon2
4KECCAK ptrsatu permutasi Keccak-f[1600] di tempat; menyebabkan bukti membawa jadual keccak
5SHA256 ptrsatu pemampatan SHA-256 di tempat; menyebabkan bukti membawa jadual sha256
6READ_PUBLIC idxmengembalikan perkataan segmen awam idx; pada chain 20 segmen awam ditetapkan semasa pengerahan (rand program deploy --public); pada genesis tanpa max_program_public_words ia kosong dan syscall ini tidak membaca apa-apa
7POSEIDON2_LEN ptr nPOSEIDON2 dengan panjang mesej diikat ke dalam span, supaya [a] dan [a, 0] dihash secara berbeza (set kekangan 7, chain 16 dan ke atas). rand-guest check pada circuits aeacf31 masih menolaknya (bahagian seterusnya)

Memori: 32 daftar dengan x0 sifar; RAM yang bermula pada sifar; setiap alamat di bawah 2³⁰; tindanan 64 KiB untuk guest yang dikompil. Program yang dibina dengan rand-guest membawa data baca-sahaja dan data yang dimulakan dalam bekas imej, dan prolog pemuat yang menjadi sebahagian daripada program menulis data itu sebelum kod program itu sendiri dijalankan (ISA RISC-V). Komitmen nota, nullifier dan semakan Merkle bukan syscall tetapi rutin pustaka di atas POSEIDON2.

Sejak chain 18 (set kekangan 8), setiap pelaksanaan diukur dalam gas. Arahan biasa serta syscall 0, 1, 2 dan 6 masing-masing berharga 1 gas, POSEIDON2 ke atas n perkataan berharga 3 + 3 × ⌈n / 4⌉, satu permutasi KECCAK berharga 192 dan satu pemampatan SHA256 berharga 64. Program contoh mengandungi jadual itu dan apa yang diisytiharkan oleh sesuatu panggilan.

Membinanya

Tiga cara, semuanya menghasilkan perkataan RV32IM:

Pengasembel terbina dalam. Dompet disertakan dengan lima guest yang dihimpun secara manual dan mengasembelkannya kepada fail JSON { "base_pc", "words" }:

rand program build --guest private_payment --arg 1000 --out pp.json   # prints the program id
rand program build --guest balance_check --arg 1000 --out bc.json
# guests: fib, memcpy, bubble_sort, balance_check, private_payment, public_echo, rpl2_counter (v0.6.8); --arg is repeatable

Program yang dikompil, dengan rand-guest. rand-guest dalam repositori circuits membina crate Rust no_std (riscv32im-unknown-none-elf, Rust 1.98.1) atau direktori C (clang 23.1.1) menjadi bekas imej, menyemak setiap perkataan terhadap penyahkod mesin, dan mencetak hc serta id program. Binaan ini hermetik, jadi sumber yang sama menghasilkan hc yang sama pada mana-mana mesin. Bagi chain 18 hingga 20, bina rantai alat pada commit circuits aeacf31 (cabang feat/v067-circuits), iaitu commit yang dipin oleh fullnode v0.6.7 dan v0.6.8. Pada commit itu rand-guest check hanya menyenaraikan syscall 0 hingga 6, jadi guest yang memanggil guest_sdk::poseidon2_len (syscall 7) ditolak semasa binaan walaupun mesin menjalankannya (isu zkp-circuits #1). Langkah demi langkah: Mengerahkan program Rust dan Mengerahkan program RISC-V.

Program yang diterjemahkan. sbpf2rv menterjemahkan ELF sBPF Solana, dan evm2rv menterjemahkan bytecode runtime EVM, menjadi program yang outputnya sama dengan guest pentafsir Rand perkataan demi perkataan: Penterjemah Solana dan Penterjemah Ethereum.

Dompet itu sendiri tidak mempunyai pengkompil. rand program deploy menerima .json, .bin mentah berisi perkataan little-endian, atau bekas imej yang ditulis oleh rand-guest (fullnode v0.3 dan ke atas).

Mengerahkan

rand program deploy pp.json          # a bundle pays the floor; waits for the commit; prints the id
rand program show <id>               # id, base_pc, words_len, code_hash, deployed_at, public_words_len, public_digest

Testnet ialah chain 20, dan untuk mengerahkan, memanggil atau menyeru padanya anda memerlukan dompet rand daripada fullnode v0.6.8 atau lebih baharu. Dompet yang lebih lama langsung tidak dapat menghantar ke sana: genesis chain 20 menetapkan binding_domain: 1, jadi setiap pengikatan bukti dan setiap mesej yang ditandatangani menyertakan hash genesis, sedangkan pengikatan dompet v0.6.7 hanya membawa id rantaian. Titik akhir awam https://rpc.randprotocol.org melayani penyegerakan, pengerahan dan panggilan dompet (persediaan).

Dompet mula-mula mencetak id program, bilangan perkataan dan hc, lalu meminta nod bagi yuran dengan rand_estimateFee, yang menolak program yang melebihi had rantaian sebelum sebarang pembuktian. Kemudian ia membina bundle pemindahan kendiri bernilai sifar (satu-satunya bundle aset tersembunyi 4-masuk-4-keluar yang dibawa oleh setiap transaksi; yuran diambil daripada slot RAND-nya) yang membayar 0.001 RAND + 100,000 units × words daripada notanya sendiri (perkataan segmen awam dikira sebagai perkataan kod), melampirkan Action::Deploy { base_pc, words, public }, membuktikan bundle itu terhadap pengikatan transaksi dan menghantarnya. Sejak chain 17 itu ialah dua bukti, dan dompet mencetak satu baris bagi setiap satu: kebenaran perbelanjaan tier-10 (beberapa saat, kira-kira 1.37 MB) dan bundle tier-14 (kira-kira dua minit pada komputer riba, kira-kira 1.5 MB). Sebelum chain 17 ia hanyalah bukti bundle, kira-kira 100 s dan kira-kira 1.42 MB pada chain 15. Yuran pengerahan tidak mempunyai komponen gas atau bait: gas hanya meletakkan harga pada panggilan. Nod menyemak bahawa setiap perkataan dapat dinyahkod, mengira hc, menyimpan rekod, dan mula membina kunci pengesah di latar belakang. Kod itu awam; siapa yang membayarnya tidak — rand_getProgram tidak mempunyai medan deployer. Mengerahkan perkataan yang sama dua kali bersifat idempoten.

→ {"method":"rand_getProgram","params":["675adeea…0065"]}
← { "id": "675adeea…0065", "base_pc": 0, "words_len": 42, "code_hash": "…", "deployed_at": 10,
    "public_words_len": 0, "public_digest": null }
→ {"method":"rand_getProgramCode","params":["675adeea…0065"]}
← { "base_pc": 0, "words": [ … ] }

Memanggil

rand call <program id> --input 400 --input 250 --input 300 --input 75
rand receipt <tx hash>

Dompet mengambil kod dan segmen awam daripada nod dan menyemak bahawa kedua-duanya dihash kepada id tersebut. Ia menjalankan panggilan dalam emulator dan mencetak gas serta yuran sebelum membuktikan apa-apa:

gas: 5636 (declaring 6144, tier 12)
fee 0.006191437 RAND (incl. two price steps of headroom)

Kemudian ia mengunci transkrip input (di bawah), membuktikan panggilan secara setempat di bawah profil FRI rantaian dengan input sebagai vektor persendirian, membuktikan bundle yang membayar yuran, menghantar, menunggu, dan mencetak resit. Pada chain 20 bukti panggilan terikat kepada transaksinya sendiri (pengikatan yang menyertakan hash genesis) dan bundle itu terdiri daripada dua bukti, jadi satu panggilan menghasilkan tiga: panggilan, kebenaran perbelanjaan tier-10 dan bundle tier-14. Dua baris di atas diambil daripada panggilan undian tanpa nama pada chain 18 pada 2026-09-30 (Undian tanpa nama).

Yuran. Pada chain 20, paras minimum ialah BUNDLE_BASE + gas_price × declared gas limit + byte_price × ⌈bytes / 1024⌉, dengan BUNDLE_BASE bernilai 0.001 RAND, bait terdiri daripada bukti panggilan serta sampul input, dan harga bermula pada 100 dan 800 unit (satu unit ialah 10⁻⁹ RAND) serta bergerak mengikut tahap kepenuhan blok. Chain 20 mengehadkannya pada 10,000 dan 80,000 unit, dan hanya bait yang membayar harga bait (bukti dan sampul panggilan) dikira dalam bebannya (byte_load: "paying"); pada chain 18 dan 19, harga tidak mempunyai siling dan bait setiap transaksi menggerakkan harga bait. Jadual rata lejar 0.001 RAND + call_fee(tier), iaitu peraturan pada chain 15, tidak terpakai di sana. Dompet menetapkan yuran sebelum bukti wujud, maka ia menetapkan harga bukti pada had 4 MiB chain tersebut dan menambah ruang lebihan sebanyak dua langkah harga. Empat panggilan yang diukur pada chain 18 masing-masing berharga 0.0057 hingga 0.0075 RAND (pengiraannya). rand fee call <tier> --gas <limit> --bytes <B> meminta nod memberikan paras minimum itu sendiri. private_payment membaca empat baki persendirian dan, jika jumlahnya sekurang-kurangnya sama dengan ambangnya, menerbitkan lebihannya: output [1, 0, 25, 0, 0, 0, 0, 0]. Chain melihat bukti, tier dan lapan perkataan itu; ia tidak pernah melihat baki tersebut.

Bendera: --tier T memaksa satu tier; --gas-limit <N|max> mengisytiharkan had gas yang tepat atau siling tier itu sebagai ganti lalai, iaitu gas tepat yang dibundarkan ke atas kepada gandaan 2^(tier − 2); --fee <RAND> menetapkan yuran; --expect-public <FILE> menolak sebelum pembuktian melainkan segmen awam program ialah perkataan dalam fail itu; --auditor <rand1…> turut mengunci transkrip untuk juruaudit yang dinamakan; --print-call-key mencetak kunci setiap panggilan; --no-envelope tidak menerbitkan sebarang transkrip; --cuda memilih bahagian belakang GPU (belum diuji pada perkakasan, dan tidak serasi dengan pemeteraian sampul). Chain 20 menolak --cuda pada panggilan secara mutlak: bukti panggilan yang terikat kepada transaksinya dibuat pada bahagian belakang CPU.

Resit

Satu resit disimpan bagi setiap panggilan yang dikomit dan dikira semula apabila nod menyegerak atau mengesahkan chain-nya:

→ {"method":"rand_getReceipt","params":["b082…09b0"]}
← { "tx": "b082…09b0", "program": "675adeea…0065", "tier": 14,
    "outputs": [1, 0, 25, 0, 0, 0, 0, 0], "height": 105, "index": 0, "h_in": "9c0e…7f", "h_pub": null }

h_in ialah komitmen bergaram bukti terhadap input persendirian; dengan sendirinya ia tidak mendedahkan apa-apa. h_pub ialah digest segmen awam program yang ditetapkan semasa penempatan, iaitu public_digest program, atau null bagi program yang ditempatkan tanpa segmen sedemikian. Tiada medan effect, dan had gas yang diisytiharkan tidak terdapat dalam resit. Peneroka memaparkan objek yang sama sebagai receipt pada GET /transactions/:hash bagi sesuatu call, menyenaraikan panggilan sesebuah program pada GET /programs/:id, dan menapis GET /transactions?kind=call&program=<id>.

Sampul input: mendedahkan panggilan kemudian

Secara lalai rand call menerbitkan transkrip (salt, inputs) panggilan itu yang dimeteraikan dalam sampul input panggilan, supaya input boleh ditunjukkan kemudian tanpa bukti kedua:

bahagianbaitapakah ia
body12 + 16 + 4·n + 16salt ‖ inputs di bawah kunci baharu bagi setiap panggilan K_call
to_sender60K_call yang dibungkus kepada kunci tontonan keluar pemanggil
kem_ct1,088 atau 0enkapsulasi ML-KEM-768 kepada juruaudit, kosong jika tiada juruaudit
to_auditor60 atau 0K_call yang dibungkus di bawah rahsia enkapsulasi itu

Data bersekutu bagi body ialah H_IN, maka sampul yang dialihkan ke panggilan lain tidak dapat dibuka oleh sesiapa pun. Chain hanya menyemak saiz (paling banyak max_call_envelope_bytes: 65,536 bait pada chain 20, 18,432 pada genesis tanpa medan itu) dan menyajikannya seadanya melalui rand_getCallEnvelope(tx). Tiga kunci membukanya dan tidak lebih: kunci tontonan pemanggil (setiap panggilan yang dibuat dompet itu), kunci setiap panggilan (panggilan itu sahaja), kunci tontonan juruaudit (panggilan itu sahaja).

rand open-call <txhash>                    # as the caller
rand open-call <txhash> --as-auditor       # as the auditor
rand open-call <txhash> --call-key <hex>   # with the per-call key alone

open-call membuka transkrip, menyemak input_digest(salt, inputs) == H_IN, menjalankan semula program pada input yang dipulihkan melalui emulator, membandingkan output dengan output resit — dan keluar dengan kod bukan sifar jika salah satu semakan gagal, supaya skrip tidak tersilap menganggap amaran sebagai persetujuan. --no-envelope tidak boleh dipulihkan: setelah salt hilang, tiada sesiapa, termasuk pemanggil, dapat membuka panggilan itu.

Sejak v0.6.8, larian semula dibuat atas segmen awam yang menjadi asas pembuatan bukti: perkataan awam program yang ditetapkan semasa penempatan dan, di bawah hardening_v6, ikatan panggilan lapan perkataan selepasnya (isu fullnode #116). Dalam v0.6.7, open-call hanya berfungsi bagi program yang ditempatkan tanpa segmen awam; bagi program yang mempunyainya, ia mencetak input dan kemudian berhenti dengan re-running the program on these inputs failed: PublicIndex(0), keluar dengan kod bukan sifar tanpa menjalankan mana-mana semakan.

Keadaan program (RPL-2)

Chain 20 ialah chain pertama dengan RPL-2, yang diaktifkan oleh seksyen program_state dalam genesisnya. Sesebuah program memperoleh tiga perkara yang sebelum ini tidak dimilikinya (fullnode docs/program-state.md, crates/randprotocol-core/src/ledger/program_state.rs pada v0.6.8):

selpeta daripada kunci 8 perkataan kepada nilai 8 perkataan, bagi setiap program. Sel yang tiada dibaca sebagai lapan sifar; menulis lapan sifar akan memadamkannya. Dikomit dalam punca keadaan
peti simpananbaki awam bagi setiap aset (0 ialah RAND). Nilai masuk melalui bundle sesuatu invoke dan keluar sebagai nota yang dikira oleh chain
token tersendiritoken yang didaftarkan dengan rand token create --program <id> (autoriti pencetakan Program(id), tiada bekalan awal) dicetak dan dibakar hanya oleh invoke program itu

Sel dan baki peti simpanan bersifat awam, seperti bekalan sesuatu token. Tiada apa-apa di dalamnya ialah nota.

Invoke (Action 33) ialah panggilan yang turut mengisytiharkan satu peralihan, dan bukti panggilannya menunjukkan bahawa program menerima peralihan itu dengan tepat:

Invoke     { program, proof, input_envelope, transition }
Transition { reads:  [{ key, value }]     // cells read, with the values read; keys strictly ascending
             writes: [{ key, value }]     // cells written; keys strictly ascending
             inflow: none | deposit | burn
             pays:   [{ asset, amount, recipient, r, envelope }]   // notes out of the vault
             mints:  [{ asset, amount, recipient, r, envelope }] } // new units of the program's own token

Apa yang masuk ialah apa yang dibakar oleh bundle: burn_r ialah RAND yang didepositkan ke dalam peti simpanan; burn_a bagi burn_asset ialah token yang didepositkan (aliran masuk deposit) atau dimusnahkan (aliran masuk burn, hanya token milik program itu sendiri). Apa yang keluar ialah satu nota yang dikira chain bagi setiap bayaran, bayaran dahulu kemudian pencetakan, dengan jumlah dan pk penerima bersifat awam, seperti pada pencetakan. Lejar menggunakan peralihan itu hanya jika program wujud, bentuknya sah, setiap sel dalam reads masih memegang nilai yang diisytiharkan, peti simpanan (selepas deposit transaksi ini sendiri) menampung setiap bayaran, setiap pencetakan adalah bagi token milik program itu sendiri, dan bukti-bukti disahkan. Bacaan yang tidak lagi sepadan ditolak sebagai StaleRead; dompet membaca semula dan membuktikan semula.

Bagaimana invoke berbeza daripada call.

Call (RPL-1)Invoke (RPL-2)
segmen awam yang menjadi asas pembuatan buktipublic ‖ call_bindingpublic ‖ call_binding ‖ context, peralihan sebagai perkataan
apa yang chain lakukan apabila berjayamenyimpan resit; output ialah datamenyimpan resit dan menggunakan peralihan: menulis sel, menggerakkan peti simpanan, menambah nota bayaran
nilaihanya pemindahan bundle itu sendirideposit ke dalam peti simpanan melalui pembakaran bundle; bayaran dan pencetakan keluar daripadanya
bergantung pada keadaantidakbuktinya tidak (segmen dibina daripada transaksi), tetapi semakan bacaan bergantung, semasa kemasukan dan dalam pool
yuranparas minimum panggilanparas minimum panggilan ditambah cell_fee bagi setiap sel yang dicipta

Sesebuah program membaca perkataan konteks i dengan READ_PUBLIC(public_len + 8 + i). Perkataan 0 ialah versi (1), perkataan 1 hingga 4 ialah bilangan bacaan, penulisan, bayaran dan pencetakan, kemudian burn_r, jenis aliran masuk, burn_asset dan burn_a, kemudian setiap bacaan dan penulisan sebagai kunci dan nilai (8 perkataan setiap satu), kemudian setiap bayaran sebagai aset dan jumlah. Penerima tidak terdapat dalam konteks: program menentukan jumlah, ikatan menetapkan siapa yang dibayar. Sesebuah program mesti mengekang setiap perkataan konteks yang ditunjukkan kepadanya, dan tidak boleh mempunyai laluan panik, kerana pengendali panik guest-sdk menghentikan larian dan larian yang dihentikan ialah larian yang boleh dibuktikan.

Had chain 20 (rand_getLimits.program_state):

hadchain 20
cell_fee10,000,000 unit, 0.01 RAND, bagi setiap sel yang dicipta (sel yang ditulis bukan sifar di mana tiada apa-apa disimpan); menulis semula atau memadam sel adalah percuma
max_reads8 sel
max_writes8 sel
max_payouts4 nota, bayaran dan pencetakan bersama

Peraturan segmen lazimnya lebih ketat: seluruh segmen mesti muat dalam jadual awam yang menjadi asas pembuktian panggilan kepada program yang sama, iaitu 127 perkataan bagi program tanpa input awam. Itu meninggalkan 119 perkataan konteks, contohnya tiga bacaan, tiga penulisan dan empat bayaran.

Perintah dan RPC (dompet v0.6.8):

rand program build --guest rpl2_counter --out counter.json   # one cell, incremented by one per invoke
rand program invoke <id> --transition step.json [--input N | --inputs-file F.json]
rand program state <id> [--cell <64 hex>]                   # rand_getProgramCell / rand_getProgramCells
rand program vault <id>                                      # rand_getProgramVault

program invoke menyemak setiap entri reads terhadap sel semasa sebelum membuktikan, dan keluar dengan kod 3 apabila bacaan sudah lapuk, sama ada sebelum pembuktian atau semasa kemasukan, supaya skrip membaca semula dan mencuba lagi. rand_estimateFee dengan "kind": "invoke" memberikan sebut harga yuran. Format fail peralihan terdapat dalam docs/cli.md fullnode. Program RPL-2 yang lengkap dan ditempatkan pada chain 20 (amm, stableswap, orderbook, stablecoin, lending, perp, crowdfund, stoploss), serta program RPL-1 (sealed-auction, ballot, eligibility, private-join, credit-score), terdapat dalam randprotocol/example-programs.

Apa yang awam dan apa yang tersembunyi

awamtersembunyi
id program dan kodnya; tier; had gas yang diisytiharkan; lapan output; H_IN; yuran dan medan awam bagi bundle; saiz envelope; sama ada panggilan itu menggunakan Keccak atau SHA-256, dan kira-kira berapa kerap (pengepala bukti mengisytiharkan ketinggian setiap jadual cincang)input persendirian; daftar, memori, cabang; kiraan kitaran sebenar dan gas yang tepat; salt H_IN; siapa yang membuat panggilan itu dan dengan apa mereka membayar

Dua bukti bagi larian yang sama ialah bait yang berbeza. Itu tidak mencukupi pada chain 15 dan sebelumnya: panggilan dengan 31 perkataan persendirian atau kurang membuktikan jadual yang terlalu kecil untuk menyembunyikan, dan inputnya boleh dipulihkan daripada bukti itu. Prover telah menetapkan jadual tersebut pada minimum 128 baris sejak v0.6, dan set kekangan 7 (chain 16 dan seterusnya) membutakan jumlah per jadual yang masih bocor. hc bersifat mengikat tetapi tidak menyembunyikan: sesiapa yang dapat menyenaraikan program calon boleh mengesahkan yang mana satu telah di-deploy.

Apa yang belum boleh dilakukan

Seperti yang dinyatakan oleh fullnode:

  • Tiada panggilan merentas program, dan tiada keadaan di luar RPL-2. Satu Call ialah satu bukti bagi satu larian; tiada apa-apa yang dibawa dari satu panggilan ke panggilan lain kecuali apa yang disuap semula oleh pemanggil. Pada chain 20, satu Invoke membaca dan menulis sel serta vault milik program itu sendiri (di atas); tiada chain sebelum chain 20 yang mempunyai keadaan program, dan satu invoke tidak dapat menyentuh sel milik program lain.
  • Tiada pemindahan yang dipacu program di luar vault. Jenis kesan 1, pemindahan yang dibayar program kepada sesebuah akaun, telah dipadam bersama akaun, dan output sesuatu Call ialah pernyataan. Pada chain 20, satu Invoke membayar daripada vault milik program itu sendiri, selebih-lebihnya empat note, dengan jumlah dan penerima yang bersifat awam.
  • Tiada pengompil dalam wallet. Program ialah guest terhimpun terbina dalam, atau imej yang dibina dengan rand-guest dalam repositori circuits.
  • Input awam ditetapkan semasa deploy, bukan bagi setiap panggilan. Set kekangan 6 menambah READ_PUBLIC dan H_PUB. Pada chain 20, satu deploy boleh membawa sehingga 32,768 perkataan awam, id program mengikatnya, dan bukti setiap panggilan disemak terhadap digest perkataan tersebut. Tiada perkataan awam bagi setiap panggilan.
  • Syscall cincang menghasilkan bukti yang besar. Bukti yang membawa keccak berukuran kira-kira 3.2 MB, jauh melebihi had bukti lalai 2 MiB; bukti yang membawa sha256 menambah kira-kira 400 KB. Had chain 20 ialah 4,194,304 bait (4 MiB, seperti pada chain 17 hingga 19; ia 8 MiB pada chain 13 hingga 16), yang membenarkan kedua-duanya: pada chain 18, panggilan tier-12 dengan jadual Keccak diukur 3.35 MB dan panggilan tier-14 dengan jadual SHA-256 diukur 1.91 MB (Example programs). Sesuatu panggilan juga dihadkan kepada 128 permutasi Keccak-f dan 128 pemampatan SHA-256 (di bawah), dan setiap KiB bukti dikenakan caj pada harga bait.
  • Program EVM dan Solana tidak boleh di-deploy pada chain 20, dan panggilannya melebihi had tier panggilan. Guest interpreter (evm.bin, 18,009 perkataan; sbpf.bin, 8,317) dan imej yang diterjemahkan (ERC-20, 11,686 perkataan; SPL Token, 65,096) melebihi had lalai 4,096 perkataan dan berada di bawah 65,535 yang ditetapkan oleh chain 13 dan dikekalkan oleh setiap chain sejak itu. Kedua-dua imej yang diterjemahkan telah di-deploy pada chain 13 pada 2026-09-19, SPL Token dengan ELF-nya sebagai input awam. Chain 14 dan 15 dipotong baharu, dan tiada imej yang di-deploy semula pada kedua-duanya. Chain 20, seperti chain 19, enggan men-deploy mana-mana daripada keempat-empatnya: di bawah peraturan hardening_v6-nya, program yang tiada panggilan tier-14 dapat memuatkannya, iaitu lebih daripada 8,180 perkataan tanpa segmen awam dan kurang daripada itu dengan satu segmen, ditolak semasa deploy (ProgramUncallable), supaya yuran deploy tidak dibayar untuk program yang tiada siapa dapat memanggilnya. Panggilan ERC-20 dibuktikan pada tier 16 atau 18: approve tier-16 telah dipanggil pada chain 13 pada 2026-09-19 dengan bukti pengeluaran sebanyak 3,412,405 bait (Ethereum transpiler), dan chain 20 menolak sebarang panggilan melebihi tier 14 (item seterusnya), maka tiada panggilan ERC-20 yang boleh diterima di sana pada masa ini. Panggilan SPL Token ialah tier 20, yang memerlukan kira-kira 330 GB; tiada bukti panggilan SPL wujud (memori pembuktian). Opcode konteks blok EVM akan trap, dan tiada keadaan EVM dalam chain.
  • Panggilan dibuktikan pada tier 14 atau lebih rendah. Sejak fullnode v0.5.6 (2026-09-25), bukti panggilan melebihi tier 14 ditolak (CallTierTooHigh), begitu juga bukti dengan lebih daripada 128 permutasi Keccak-f atau 128 pemampatan SHA-256. approve ERC-20 tier-16 pada chain 13 akan ditolak pada chain 20, sebagaimana ia akan ditolak pada chain 15, 18 dan 19, begitu juga setiap panggilan ERC-20 tier-18 atau SPL Token tier-20; semuanya masih dibuktikan di luar chain (bajet).
  • Pembuktian GPU tidak pernah dijalankan pada perkakasan. --cuda memerlukan binaan --features cuda dan PTX yang di-commit; kedua-duanya tidak wujud pada fleet. Pada chain 20, bukti panggilan dibuat pada backend CPU walau apa pun binaannya.
  • hc tidak menyembunyikan, seperti di atas, dan permintaan witness masih memberitahu nod leaf mana yang dibelanjakan oleh sesebuah wallet.

Disahkan kali terakhir terhadap commit fullnode c0878c3f (rantai 21) pada 2026-10-12. Jika kod dan halaman ini tidak selari, kodlah yang betul; sila maklumkan kepada kami.