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
| input | bytecode runtime EVM, sebagai teks heks (.hex) atau bait mentah |
| output | crate shim C; rand-guest build menjadikannya bekas imej |
| tempat ia dijalankan | di luar rantaian, pada mesin pembangun; rantaian hanya melihat imej |
| apa yang mesti dipadankan | status, lapan perkataan output dan gas_used milik evm.bin |
| repositori | evm2rv/ dalam repositori circuits |
| toolchain yang dipinkan | Rust 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.
| peringkat | bendera | apa yang dilakukan |
|---|---|---|
| satu | --stage 1 | setiap opkod melalui tindanan memori |
| dua | --stage 2, lalai | perkataan 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.
hc == translate(bytecode). Jalankan semulaevm2rvpada bytecode yang diterbitkan dengan--stagedan--chain-idyang sama, bina semula dengan toolchain yang dipinkan, dan bandingkanhc. Crate yang dijana meminkanccsecara tepat dan membawaCargo.locksendiri.- Pengawal kod mengikat
hckepada bytecode. Logik yang diterjemahkan disusun ke dalam imej, tetapiCODECOPYdanCODESIZEmembaca kod dalam vektor input. Tanpa semakan, satuhcboleh dijalankan dengan bait kod yang dipilih oleh pemanggil. Makacontract.cmembawa 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_used0, pemberhentianOutOfBounds.
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:
| opkod | terjemahan |
|---|---|
ADDRESS, CALLER, CALLVALUE, CALLDATASIZE, CODESIZE | daripada vektor input, seperti yang dibaca oleh penafsir |
CHAINID | nilai --chain-id, ditanam semasa terjemahan, jadi hc mengikatnya; diperlukan apabila kod mengandungi CHAINID |
ORIGIN | sama dengan CALLER (satu panggilan, tiada relayer) |
GASPRICE, COINBASE, TIMESTAMP, NUMBER, PREVRANDAO, GASLIMIT, SELFBALANCE, BASEFEE, BLOCKHASH | trap (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:
| precompile | vektor | kitaran | muat dalam 2²⁰ |
|---|---|---|---|
| 1 ecrecover | ValidKey | 14,510,525 | tidak |
| 2 sha256 | ”abc” / 200 bait | 2,791 / 5,289 | ya |
| 3 ripemd160 | ”abc” | 12,195 | ya |
| 4 identity | 100 bait | 4,498 | ya |
| 5 modexp | nagydani-1-square / -1-pow0x10001 | 122,332 / 874,548 | ya |
| 5 modexp | eip_example1 (256-bit) | 11,170,118 | tidak |
| 5 modexp | nagydani-5-pow0x10001 (1,024 bait) | 55,076,950 | tidak |
| 6 bn256 add | chfast1 | 978,262 | ya, tipis |
| 7 bn256 mul | chfast1 | 3,060,669 | tidak |
| 8 bn256 pairing | 1 pasangan / 2 pasangan | 1,853,656,212 / 2,019,000,469 | tidak |
| 9 blake2f | 12 pusingan | 14,493 | ya, 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.
| panggilan | penafsir (evm.bin) | peringkat satu | peringkat 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) |
| program | perkataan | hc |
|---|---|---|
evm.bin, penafsir | 18,009 | 7e1aea2b…854c08 |
| ERC-20, peringkat satu | 15,804 | 9cdb79e7…2fd048c8 |
| ERC-20, peringkat dua | 11,686 | a0feae92a7311c9562495717100eb7aea71270a38ed435d06dc31387e0ea8ff6 |
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.
| keluaran | v0.8.37 daripada github.com/ethereum/solidity/releases |
| aset macOS | solc-macos, sha256 a27396e7732aa52e80ff89ad7bd8a2e46fec2a6dcc4ef20cd16e5e0c502d6821 |
| aset Linux | solc-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 menghasilkanMCOPY, 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
--outmesti berada di dalam checkout circuits. Tanpanya,evm2rvhanya 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 mempunyaiCHAINID, jadi--chain-idtidak mengubahhc-nya. Kontrak yang membacaCHAINIDmemerlukan bendera ini; tetapkan kepada rantaian tempat anda akan mengerahkan (--chain-id 19untuk 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 output | sama | sama |
| kitaran, transfer | 66,235 | 121,638 |
| tier | 18 | 18 |
| perkataan program | 11,686 | 18,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 program | f074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d |
| imej | 11,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 panggilan | tier 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 termeterai | 2,700 bait |
| tx panggilan (Chain 13) | 279e1f62abf3f177ca71b08c633e051c37bc4720118c79ddb00936f036c4bfa7 |
| dianchor pada / dikomit pada | ketinggian 802 / ketinggian 919 |
| yuran | 0.00357 RAND |
resit h_pub | null |
| output resit | sama dengan lapan perkataan interpreter bagi vektor yang sama |
| masa jam dinding, RSS puncak | 622.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.
CALLdengan 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_v6chain 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);approvedibuktikan pada tier 16, manakalatransferdantransferFrompada 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-coremeletakkan daun storan kontrak mengikut 32 bit teratas bagikeccak256(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.binialah 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.mdmilik fullnode merekodkan prasyarat ini di sebelah had panggilan (audit v6, ZKV-6; padamainsejak 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 danevm.bindipin 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
transferperingkat 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 pemindahanevm.binbagi 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.