Rand Protocol
Dokumentasi
Program RISC-V

Penterjemah Ethereum

evm2rv menterjemahkan bytecode masa jalan EVM kepada ISA RISC-V Rand - apa itu evm2rv, model kepercayaan dan pengawal kodnya, opcode dan precompile yang dilindungi serta tempat ia memerangkap, angka yang diukur, dan panduan lengkap ERC-20 daripada Solidity melalui solc --bin-runtime sehingga output yang sepadan dengan penterjemah EVM perkataan demi perkataan.

evm2rv mengambil bytecode runtime EVM, iaitu output solc --bin-runtime, dan menukarkannya menjadi program Rand. Ia menulis C, dan rand-guest build menyusun C itu menjadi imej RV32IM. Imej ini menerima vektor input yang sama seperti guest penafsir EVM Rand, evm.bin, dan menerbitkan lapan perkataan output yang sama. Ia menjalankan kontrak secara natif dan tidak menafsirkannya opkod demi opkod. Halaman ini menunjukkan keseluruhan laluan pada sebuah ERC-20.

Apa itu

inputbytecode runtime EVM, sebagai teks heks (.hex) atau bait mentah
outputcrate shim C; rand-guest build menjadikannya bekas imej
tempat ia dijalankandi luar rantaian, pada mesin pembangun; rantaian hanya melihat imej
apa yang mesti dipadankanstatus, lapan perkataan output dan gas_used milik evm.bin
repositorievm2rv/ dalam repositori circuits
toolchain yang dipinkanRust 1.98.1, clang 23.1.1, crate cc 1.4.6

Penterjemah ini menerima kod runtime, bukan kod penciptaan. Satu bukti meliputi satu panggilan kepada kontrak yang telah dikerahkan, jadi pembina (constructor) tidak pernah dijalankan. Keadaan yang akan ditulis oleh pembina menjadi sebahagian daripada pra-keadaan, sebagai saksi storan.

Terdapat dua peringkat terjemahan. Kedua-duanya memberikan hasil dan gas yang sama; setiap satu ialah program tersendiri dengan hc tersendiri.

peringkatbenderaapa yang dilakukan
satu--stage 1setiap opkod melalui tindanan memori
dua--stage 2, lalaiperkataan tindanan setiap blok dalam pemboleh ubah setempat C, pemalar dilipat semasa terjemahan

Vektor input ialah vektor penafsir: kod, calldata, pemanggil dan perkataan persekitaran lain, had gas, punca pra-keadaan, dan satu saksi storan bagi setiap slot yang disentuh oleh panggilan. Outputnya ialah out[0], iaitu status (1 berjaya, 0 diterbalikkan, 2 pemberhentian luar biasa), dan out[1..8], iaitu digest EVM_OUT ke atas cincangan kod, kedua-dua punca keadaan, data pulangan dan log.

Model kepercayaan

Pengesah menyemak kontrak yang diterjemahkan dalam dua langkah.

  1. hc == translate(bytecode). Jalankan semula evm2rv pada bytecode yang diterbitkan dengan --stage dan --chain-id yang sama, bina semula dengan toolchain yang dipinkan, dan bandingkan hc. Crate yang dijana meminkan cc secara tepat dan membawa Cargo.lock sendiri.
  2. Pengawal kod mengikat hc kepada bytecode. Logik yang diterjemahkan disusun ke dalam imej, tetapi CODECOPY dan CODESIZE membaca kod dalam vektor input. Tanpa semakan, satu hc boleh dijalankan dengan bait kod yang dipilih oleh pemanggil. Maka contract.c membawa digest Poseidon2 bagi bytecode sumber (panjang dan baitnya), dan shim mencincang kod dalam vektor input dengan cara yang sama sebelum sebarang kod yang diterjemahkan dijalankan. Kod lain ditolak: status 2, gas_used 0, pemberhentian OutOfBounds.

Digest EVM_OUT juga mengikat keccak256 bagi kod, seperti digest penafsir. Rantaian tidak merekodkan bytecode sumber atau cincangannya. Untuk membolehkan pihak lain menyemak hc, terbitkan bytecode itu, atau sumber Solidity dan binaan solc yang tepat.

Pengawal ini berkos 1,008 kitaran pada transfer. Kod yang berbeza satu bait daripada sumber ditolak dalam 30,418 kitaran pada peringkat dua (tier 16).

Liputan, dan apa yang menyebabkan trap

Opkod. Set Shanghai. Susun dengan --evm-version shanghai: sasaran yang lebih baharu menghasilkan MCOPY dan opkod Cancun yang lain, yang menyebabkan trap.

Opkod persekitaran:

opkodterjemahan
ADDRESS, CALLER, CALLVALUE, CALLDATASIZE, CODESIZEdaripada vektor input, seperti yang dibaca oleh penafsir
CHAINIDnilai --chain-id, ditanam semasa terjemahan, jadi hc mengikatnya; diperlukan apabila kod mengandungi CHAINID
ORIGINsama dengan CALLER (satu panggilan, tiada relayer)
GASPRICE, COINBASE, TIMESTAMP, NUMBER, PREVRANDAO, GASLIMIT, SELFBALANCE, BASEFEE, BLOCKHASHtrap (status 2), seperti dalam penafsir

Sembilan opkod konteks blok ini menyebabkan trap sehingga ada reka bentuk untuk mengikatnya kepada sesuatu blok. Input persendirian tidak boleh membawa fakta blok, kerana pengesah tidak dapat membuka H_IN. Sehingga keputusan itu dibuat, kontrak yang membaca masa atau nombor blok (contohnya tarikh akhir permit) akan menyebabkan trap.

Panggilan. CALL, CALLCODE, DELEGATECALL dan STATICCALL menjalankan precompile apabila sasarannya ialah alamat 1 hingga 9. Sebarang sasaran lain menyebabkan trap. Nilai bukan sifar pada CALL atau CALLCODE menyebabkan trap: tiada model baki.

Precompile. Kesemua sembilan dijalankan dalam perisian. Sebahagiannya terlalu perlahan untuk dibuktikan pada masa ini, kerana satu bukti memuatkan paling banyak 2²⁰ baris:

precompilevektorkitaranmuat dalam 2²⁰
1 ecrecoverValidKey14,510,525tidak
2 sha256”abc” / 200 bait2,791 / 5,289ya
3 ripemd160”abc”12,195ya
4 identity100 bait4,498ya
5 modexpnagydani-1-square / -1-pow0x10001122,332 / 874,548ya
5 modexpeip_example1 (256-bit)11,170,118tidak
5 modexpnagydani-5-pow0x10001 (1,024 bait)55,076,950tidak
6 bn256 addchfast1978,262ya, tipis
7 bn256 mulchfast13,060,669tidak
8 bn256 pairing1 pasangan / 2 pasangan1,853,656,212 / 2,019,000,469tidak
9 blake2f12 pusingan14,493ya, sehingga kira-kira 1,800 pusingan

Asas dan modulus modexp dihadkan kepada 1,024 bait setiap satu.

Percanggahan yang diterima. Status, lapan perkataan dan gas_used mesti sepadan. Tiga perbezaan diterima: jenis pemberhentian mungkin berbeza (gas statik dikenakan pada kepala setiap blok, jadi OutOfGas dan pemberhentian lain boleh bertukar ganti; kedua-duanya berstatus 2 dengan semua gas digunakan); terjemahan ini melaksanakan CHAINID, ORIGIN dan panggilan precompile, yang menyebabkan trap dalam penafsir; dan pengawal kod menolak kod selain sumbernya.

Angka-angka

Panggilan ERC-20, dengan pengawal kod disertakan. Kitaran daripada rand-guest run; tier dalam kurungan.

panggilanpenafsir (evm.bin)peringkat satuperingkat dua (lalai)
transfer(BOB, 250)121,638 (18)80,211 (18)66,235 (18)
approve(BOB, 5)85,645 (18)56,261 (16)48,119 (16)
transferFrom(ALICE, BOB, 100)161,434 (18)110,074 (18)88,824 (18)
programperkataanhc
evm.bin, penafsir18,0097e1aea2b…854c08
ERC-20, peringkat satu15,8049cdb79e7…2fd048c8
ERC-20, peringkat dua11,686a0feae92a7311c9562495717100eb7aea71270a38ed435d06dc31387e0ea8ff6

Peringkat dua menjalankan ketiga-tiga panggilan dalam 54.5%, 56.2% dan 55.0% daripada kitaran penafsir. Transfer kekal pada tier 18: 66,235 kitarannya ditambah 3,155 baris digest ialah 69,390 baris, iaitu 3,855 melebihi 65,535 milik tier 16.

Kira-kira 60% daripada sebuah transfer peringkat dua (kira-kira 39,928 kitaran) ialah harness yang dikongsi oleh kedua-dua imej: mendekod input, mengesahkan saksi storan, panggilan keccak256 ABI dan digest output. Tiada kerja terjemahan yang boleh turun di bawah paras dasar ini.

Panduan langkah demi langkah: sebuah ERC-20, daripada Solidity kepada output yang sepadan

Setiap arahan dijalankan dari akar checkout circuits pada 7ef3220, dengan toolchain daripada Kerahkan program Rust dan clang 23.1.1 daripada Kerahkan program RISC-V. Output yang panjang dipotong di tempat yang ditandakan ….

0. Bina alat

(cd evm2rv && cargo +1.98.1 build --release)
(cd rand-guest && cargo +1.98.1 build --release)

1. Susun Solidity kepada bytecode runtime

Kontrak ini ialah guests-compiled/evm/contracts/ERC20.sol yang telah dikomit: sebuah ERC-20 yang lengkap dengan sendirinya dengan susun atur storan OpenZeppelin v4, pragma solidity 0.8.37. Gunakan solc 0.8.37 dengan tepat; versi lain mengoptimumkan secara berbeza dan menghasilkan bytecode yang berbeza.

keluaranv0.8.37 daripada github.com/ethereum/solidity/releases
aset macOSsolc-macos, sha256 a27396e7732aa52e80ff89ad7bd8a2e46fec2a6dcc4ef20cd16e5e0c502d6821
aset Linuxsolc-static-linux, daripada keluaran yang sama
$ curl -sSL -o solc https://github.com/ethereum/solidity/releases/download/v0.8.37/solc-macos
$ shasum -a 256 solc
a27396e7732aa52e80ff89ad7bd8a2e46fec2a6dcc4ef20cd16e5e0c502d6821  solc
$ chmod +x solc && ./solc --version
solc, the solidity compiler commandline interface
Version: 0.8.37+commit.f401782d.Darwin.appleclang

$ (cd guests-compiled/evm && ../../solc --optimize --optimize-runs 200 --evm-version shanghai \
      --bin-runtime contracts/ERC20.sol) | tee solc.out
======= contracts/ERC20.sol:ERC20 =======
Binary of the runtime part:
608060405234801561000f575f5ffd5b5060043610610060575f3560e01c8063095ea7b31461006457806318160ddd1461008c57806323b872dd1461…
$ tail -1 solc.out > evm2rv/target/mytoken.hex

Baris terakhir ialah bytecode runtime, 1,296 bait. Ia serupa bait demi bait dengan guests-compiled/evm/contracts/erc20.runtime.hex yang telah dikomit; SOLC=$PWD/solc bash guests-compiled/evm/contracts/build.sh menyemak perkara itu dan mencetak contracts: erc20.runtime.hex reproduces.

Bendera-bendera ini penting:

  • --bin-runtime: kod yang dikerahkan, bukan kod penciptaan.
  • --evm-version shanghai: sasaran lalai untuk 0.8.37 menghasilkan MCOPY, yang menyebabkan trap.
  • --optimize --optimize-runs 200: profil kontrak yang dikerahkan.

2. Terjemah

$ evm2rv/target/release/evm2rv evm2rv/target/mytoken.hex --out evm2rv/target/mytoken --chain-id 12
1296 code bytes: 74 blocks, 798 opcodes, 51 jumpdests (stage 2)
CHAINID is the constant 12
no trapping opcodes present
wrote evm2rv/target/mytoken (crate mytoken): contract.c, Cargo.toml, Cargo.lock, build.rs, src/main.rs, shim.ld
  • --out mesti berada di dalam checkout circuits. Tanpanya, evm2rv hanya menganalisis kod.
  • Sebarang opkod yang menyebabkan trap akan disenaraikan di sini sebagai amaran, bersama pc-nya.
  • Sesi ini dirakam dengan --chain-id 12. ERC-20 ini tidak mempunyai CHAINID, jadi --chain-id tidak mengubah hc-nya. Kontrak yang membaca CHAINID memerlukan bendera ini; tetapkan kepada rantaian tempat anda akan mengerahkan (--chain-id 19 untuk rantaian langsung).

contract.c berakhir dengan digest pengawal kod:

const uint32_t *evm_code_digest(void) {
    static const uint32_t d[8] = {0xf679280fu, 0x86c10e83u, 0x7e8f1f39u, 0xa2377de3u, 0x8a2e282fu, 0xc54cad42u, 0xddfaf009u, 0x7d28a8afu};
    return d;
}

3. Bina imej

Had lalai ialah 4,096 perkataan, jadi hantarkan --max-words 65535.

$ rand-guest/target/release/rand-guest build evm2rv/target/mytoken --max-words 65535
…
11686 words against a cap of 65535 (fits); 0 ecall(s) with a non-static a7
OK
wrote evm2rv/target/mytoken/image.bin and its .sha256 (11686 words, hc a0feae92a7311c9562495717100eb7aea71270a38ed435d06dc31387e0ea8ff6, program id f074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d)

$ rand-guest/target/release/rand-guest info evm2rv/target/mytoken/image.bin
form: image container
text 11147 words at 0x10000; data 408 words (205 non-zero) at 0x1ae2c; prologue 539 words; program 11686 words from base_pc 0xf794
hc a0feae92a7311c9562495717100eb7aea71270a38ed435d06dc31387e0ea8ff6
program id f074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d
11686 words against a cap of 4096: does not fit

Inilah hc peringkat dua yang diterbitkan. Nama crate tidak mempengaruhinya.

4. Bina vektor input dan jalankan transfer

Contoh erc20_vector mencetak vektor ujian pariti sebagai perkataan input: transfer (ALICE menghantar 250 kepada BOB daripada 1,000 miliknya), approve (ALICE membenarkan BOB membelanjakan 5) dan transferFrom (BOB memindahkan 100 daripada 1,000 milik ALICE berdasarkan elaun 300). Untuk kontrak anda sendiri, bina EvmCall dengan cara yang sama dalam Rust; contoh itu ialah templatnya.

$ (cd evm2rv && cargo +1.98.1 run -q --release --example erc20_vector -- transfer > target/transfer.words)
921 input words

$ rand-guest/target/release/rand-guest run evm2rv/target/mytoken/image.bin --input $(cat evm2rv/target/transfer.words)
out[0] = 1
out[1] = 513227413
out[2] = 3087537901
out[3] = 995619457
out[4] = 4004100029
out[5] = 234390638
out[6] = 3262201797
out[7] = 3842361427
cycles 66235
tier 18

5. Bandingkan dengan penafsir

Input yang sama pada guest penafsir:

$ rand-guest/target/release/rand-guest run guests-compiled/bin/evm.bin --input $(cat evm2rv/target/transfer.words)
out[0] = 1
out[1] = 513227413
out[2] = 3087537901
out[3] = 995619457
out[4] = 4004100029
out[5] = 234390638
out[6] = 3262201797
out[7] = 3842361427
cycles 121638
tier 18

Dan interpreter yang dijalankan secara natif pada hos, iaitu oracle bagi ujian:

$ (cd evm2rv && cargo +1.98.1 run -q --release --example erc20_vector -- transfer --expected)
out[0] = 1
out[1] = 513227413
…
out[7] = 3842361427
interpreter (native): status 1, Return, gas_used 29956

Semakan sebagai satu arahan:

$ diff <(rand-guest/target/release/rand-guest run evm2rv/target/mytoken/image.bin --input $(cat evm2rv/target/transfer.words) | grep '^out') \
       <(rand-guest/target/release/rand-guest run guests-compiled/bin/evm.bin --input $(cat evm2rv/target/transfer.words) | grep '^out') \
  && echo "the eight words are identical"
the eight words are identical

Ulangi langkah 4 dan 5 dengan approve dan transferFrom; kedua-duanya menghasilkan perkataan yang sama. cd evm2rv && cargo +1.98.1 test --release menjalankan ujian ini dan lima vektor lagi pada kedua-dua peringkat, dan turut menyemak gas_used (70 ujian, serta 2 bukti yang diabaikan).

diterjemah (peringkat kedua)interpreter (evm.bin)
lapan perkataan outputsamasama
kitaran, transfer66,235121,638
tier1818
perkataan program11,68618,009

6. Penempatan

rand program deploy evm2rv/target/mytoken/image.bin

Dompet mencetak id program, bilangan perkataan dan hc, kemudian menyemak had rantaian sebelum membuktikan apa-apa. Imej ini berjumlah 11,686 perkataan, jadi ia memerlukan rantaian yang genesisnya menetapkan max_program_words pada sekurang-kurangnya 11,686. Chain 12 menggunakan nilai lalai 4,096, maka penempatan ditolak di situ. Chain 13, rantaian v0.4, menetapkan max_program_words kepada 65,535, dan setiap rantaian sejak itu mengekalkan nilai tersebut. Chain 20, rantaian yang sedang beroperasi (genesis 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135), turut mengekalkan had blok, sampul panggilan dan input awam Chain 13, serta mengurangkan separuh had bukti kepada 4 MiB (4,194,304 bait, sejak Chain 17; Chain 13 hingga 16 menetapkan 8 MiB). Had perkataan bukan lagi satu-satunya penghalang. Genesis Chain 20 menetapkan hardening_v6, dan di bawahnya penempatan program dengan perkataan lebih banyak daripada yang dapat dimuatkan oleh satu panggilan pada had panggilan tier-14 adalah tidak sah (ProgramUncallable): paling banyak 8,180 perkataan tanpa input awam. Imej ini berjumlah 11,686 perkataan, maka Chain 20 menolak penempatan itu, dan akan menolak panggilannya juga: setiap panggilan ERC-20 dibuktikan pada tier 16 atau 18, melebihi had panggilan tier-14 (langkah 7). Pengagregatan blok dimatikan pada Chain 20 (genesisnya tiada seksyen aggregation); nod bootstrap-nya disenaraikan dalam Menjalankan validator. Yuran penempatan ialah 0.001 + 0.0001 × 11,686 = 1.1696 RAND, yuran yang dibayar oleh penempatan Chain 13 di bawah.

Penempatan ini dijalankan pada Chain 13 pada 2026-09-19, ketika Chain 13 ialah rantaian yang sedang beroperasi (profil FRI pengeluaran, genesis 8123ccac1883a45750e4df6964fb7cd3f0b321798cde4c0ef406a0293939ece3), daripada dompet genesis shielded-1. Setiap rantaian sejak itu (14 hingga 19) dipotong sebagai rantaian baharu tanpa program Chain 13, dan imej ini belum ditempatkan semula pada mana-mana daripadanya, jadi transaksi dan ketinggian di bawah adalah milik Chain 13 dan tidak lagi dapat dicari pada penjelajah. Id program ialah cincangan base_pc dan perkataan sahaja, maka imej yang sama mendapat id yang sama pada mana-mana rantaian yang menerima penempatan itu. Output dompet, dengan baris kemajuannya diringkaskan (…):

$ rand program deploy <image.bin>
program id: f074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d (11686 words, hc 92aefea0951c31a717574962aeb70e10a37012a7d035d48e8713c36df68feae0)
…
proved in 92.2s: tier 14, 1419655 bytes
submitted deploy c7a66dc4d9cdb7f9bfc4bde01f618c356e5abad7097e6bf7dc04e2e49c53acd0
…
id programf074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d
imej11,686 perkataan; hc a0feae92… dalam ejaan rand-guest, 92aefea0… dalam ejaan dompet
bundle yuran (bundle 2-masuk-2-keluar Chain 13)tier 14, 1,419,655 bait, dibuktikan dalam 92.2 s
tx penempatan (Chain 13)c7a66dc4d9cdb7f9bfc4bde01f618c356e5abad7097e6bf7dc04e2e49c53acd0
dikomit pada ketinggian (Chain 13)381

Sejak Chain 14, bundle pembayaran ialah satu bundle aset tersembunyi 4-masuk-4-keluar yang dibawa oleh setiap transaksi, dibuktikan terhadap pengikatan transaksi. Ia masih tier 14: kira-kira 100 s dan kira-kira 1.42 MB pada profil pengeluaran pada Chain 14 dan 15. Sejak Chain 17, satu bundle turut membawa bukti auth tier-10 (pemberian kuasa terpisah), jadi pada Chain 18 dan 19 bundle yuran sesebuah transaksi ialah kira-kira 1.49 MB bukti bundle dan kira-kira 1.37 MB bukti auth.

7. Panggilan

Panggilan transfer membawa vektor 921 perkataan sebagai input persendirian, di bawah had input pada mana-mana rantaian (4,295 perkataan secara lalai, 16,071 pada Chain 20), dan tiada perkataan awam. Ia tidak dapat dihantar ke Chain 20: program itu tidak dapat ditempatkan di sana (langkah 6), transfer dibuktikan pada tier 18, dan sejak fullnode v0.5.6 (2026-09-25) nod menolak sebarang bukti panggilan di atas tier 14 dengan CallTierTooHigh, sebelum ia membina kunci pengesah. Arahan di bawah membuktikan secara setempat dan rantaian menolak hasilnya; ukurannya ialah bukti luar rantai. rand call menerima setiap perkataan sebagai --input yang berulang:

rand call f074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d \
    $(for w in $(cat evm2rv/target/transfer.words); do printf -- '--input %s ' "$w"; done)

Kini telah diukur. Bukti tier 18 dihentikan pada komputer riba 48 GB pada 24.7 GB, tetapi pada droplet 128 GB (m-16vcpu-128gb) panggilan transfer yang diterjemah berjaya dibuktikan: RSS puncak 85.0 GB, 3,230.5 s (53.8 min), bukti 811,600 bait. Ia disahkan dalam 101.4 s pada droplet dan 50.2 s pada RSS 3.66 GB pada komputer riba Apple-silicon 48 GB (memori pembuktian). Di bawah jadual tier tetap lejar, peraturan pada rantaian tanpa seksyen gas (sehingga Chain 17), yuran panggilan pada tier 18 ialah 0.0024 RAND. Chain 18 dan 19 sebaliknya meletakkan harga panggilan mengikut had gas yang diisytiharkan dan baitnya, 100 unit setiap gas dan 800 setiap KiB pada harga genesis, dan tidak menerima sebarang panggilan di atas tier 14.

Panggilan pada Chain 13, 2026-09-19

Panggilan approve(BOB, 5) (649 perkataan persendirian, tier 16) dijalankan pada Chain 13 pada 2026-09-19, ketika ia ialah rantaian yang sedang beroperasi, profil FRI pengeluaran, daripada dompet yang sama. Tiada panggilan dibuat pada mana-mana rantaian kemudian, kerana program itu tidak ditempatkan di sana, dan Chain 20 menolak bukti panggilan tier-16 ini (CallTierTooHigh). Output dompet, dengan baris kemajuannya diringkaskan (…):

$ rand call f074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d --input <w0> --input <w1> …   # the 649 words of approve(BOB, 5)
…
proved in 388.7s: tier 16, 3412405 bytes, outputs [1, 942495465, 790002515, 1351749335, 1059083501, 2923046783, 2814575942, 696258848]
…
proved in 96.0s: tier 14, 1420423 bytes
submitted call 279e1f62abf3f177ca71b08c633e051c37bc4720118c79ddb00936f036c4bfa7
…
bukti panggilantier 16, 3,412,405 bait, dibuktikan dalam 388.7 s
bundle yuran (bundle 2-masuk-2-keluar Chain 13)tier 14, 1,420,423 bait, dibuktikan dalam 96.0 s
sampul termeterai2,700 bait
tx panggilan (Chain 13)279e1f62abf3f177ca71b08c633e051c37bc4720118c79ddb00936f036c4bfa7
dianchor pada / dikomit padaketinggian 802 / ketinggian 919
yuran0.00357 RAND
resit h_pubnull
output resitsama dengan lapan perkataan interpreter bagi vektor yang sama
masa jam dinding, RSS puncak622.8 s, 22.9 GB, pada komputer riba siri M 48 GB
  • Bukti pengeluaran berukuran 3,412,405 bait, melebihi had bukti 2 MiB Chain 12. Chain 12 tidak dapat menerima panggilan ini; had 8 MiB Chain 13 dapat. Chain 14 hingga 16 mengekalkan had yang sama, dan Chain 17 hingga 20 menetapkan 4 MiB (4,194,304 bait), yang masih memuatkan bukti sebesar ini. Sejak v0.5.6, nod menolak panggilan itu kerana tiernya sebelum ia memeriksa saiznya.
  • Yuran merangkumi komponen bait bagi jadual Chain 13: bukti 3.41 MB melebihi elaun percuma 2 MiB + 18,432 bait. Sejak Chain 18, setiap panggilan membayar setiap KiB dari bait 0.

Lapan perkataan resit itu ialah yang terdapat dalam langkah 4. Rantaian tidak menyimpan keadaan EVM: pemanggil membekalkan root pra-keadaan dan saksi storan, dan root pasca-keadaan berada di dalam digest EVM_OUT.

Had

  • Tiada konteks blok. Sembilan opcode konteks blok akan memerangkap (trap) sehingga reka bentuk pengikatan blok wujud.
  • Tiada pemindahan nilai. CALL dengan nilai bukan sifar akan memerangkap. Panggilan kepada kontrak selain precompile juga akan memerangkap.
  • ecrecover, bn256 mul, pairing dan modexp yang besar tidak dapat dibuktikan pada masa ini. Setiap satu melebihi had tier 2²⁰ baris; kesemuanya memerlukan jadual koprosesor.
  • Tiada keadaan EVM di dalam rantaian. Satu panggilan ialah satu bukti ke atas satu larian; pemanggil membawa keadaan tersebut.
  • Penempatan mahupun sebarang panggilan ERC-20 tidak boleh diterima pada chain 20. Di bawah hardening_v6 chain 20, penempatan yang melebihi bilangan perkataan yang boleh dimuatkan oleh panggilan tier 14 adalah tidak sah (ProgramUncallable; paling banyak 8,180 perkataan), sedangkan imejnya ialah 11,686. Sejak fullnode v0.5.6, bukti panggilan mestilah tier 14 atau ke bawah (CallTierTooHigh); approve dibuktikan pada tier 16, manakala transfer dan transferFrom pada tier 18. Semakan yang sama turut menghadkan jadual cincang yang boleh diisytiharkan oleh sesuatu panggilan: 2¹² baris Keccak (128 permutasi) dan 2¹³ baris SHA-256 (128 pemampatan). Panggilan tersebut masih boleh dibuktikan di luar rantaian, seperti yang dinyatakan di bawah.
  • Indeks storan sedalam 32 bit. evm-core meletakkan daun storan kontrak mengikut 32 bit teratas bagi keccak256(slot), maka slot yang berlanggar dengan slot terpilih memerlukan kira-kira 2³² cincangan Keccak untuk ditemui, dan selagi slot terpilih itu memegang nilai bukan sifar, slot tersebut dibekukan (tiada pemalsuan dan tiada nilai yang hilang). Ini tidak aktif: evm.bin ialah 18,009 perkataan, dan panggilan pada had tier 14 memuatkan paling banyak 8,184, maka tiada runtime EVM yang boleh dipanggil pada mana-mana chain. docs/confidential.md milik fullnode merekodkan prasyarat ini di sebelah had panggilan (audit v6, ZKV-6; pada main sejak 2026-09-30, selepas tag v0.6.7): sebelum sesuatu chain mengangkat had panggilan tier 14 atau menerima runtime EVM yang cukup kecil untuk dipanggil, indeks storan mesti diperdalam dan evm.bin dipin semula.
  • Terbukti. Bukti pemindahan peringkat pertama (tier 18) dimatikan dengan SIGKILL pada komputer riba 48 GB pada 24.7 GB selepas 1,016 s, tetapi panggilan transfer peringkat kedua berjaya dibuktikan pada droplet 128 GB (m-16vcpu-128gb): RSS puncak 85.0 GB, 3,230.5 s (53.8 min), bukti 811,600 bait, disahkan dalam 101.4 s (droplet) dan 50.2 s pada RSS 3.66 GB (komputer riba 48 GB). Bukti pemindahan evm.bin bagi interpreter menghampiri keputusan itu: 85.5 GB, 3,143.3 s (52.4 min), bukti 805,108 bait — dan kedua-dua bukti membawa perkataan output awam yang sama, mengesahkan kesetaraan pada prover sebenar. approve (tier 16, diterjemah) jauh lebih murah: 21.7 GB, 786.7 s (13.1 min), bukti 798,930 bait. Terjemahan hanya merendahkan kos pembuktian apabila ia menurunkan sesuatu panggilan ke tier yang lebih kecil.
  • Rantaian tidak merekodkan bytecode. Terbitkan bytecode itu supaya pihak lain dapat membina semula hc.

Disahkan kali terakhir terhadap commit fullnode c0878c3f (rantai 21) pada 2026-10-12, dan circuits `7ef3220` (`evm2rv/README.md`, `guests-compiled/evm/contracts/SOLC.md`, `docs/superpowers/specs/2026-09-18-evm-to-rv32-translator-design.md`); the walkthrough re-run on 2026-09-19 with solc 0.8.37. Jika kod dan halaman ini tidak selari, kodlah yang betul; sila maklumkan kepada kami.