Rand Protocol
ஆவணமாக்கல்
RISC-V நிரல்கள்

Ethereum மொழிமாற்றி (transpiler)

evm2rv என்பது EVM இயக்கநேர bytecode-ஐ Rand-இன் RISC-V ISA-க்கு மொழிமாற்றுகிறது. இப்பக்கம் அது என்ன, அதன் நம்பிக்கை மாதிரி, அதன் குறியீட்டுக் காவல், அது உள்ளடக்கும் opcode-கள் மற்றும் precompile-கள், அது எங்கே trap செய்கிறது, அளவிடப்பட்ட எண்ணிக்கைகள் ஆகியவற்றை விளக்குகிறது. Solidity-இலிருந்து solc --bin-runtime வழியாக, EVM interpreter-இன் வெளியீடுகளுடன் சொல்லுக்குச் சொல் பொருந்தும் வெளியீடுகள் வரை முழுமையான ERC-20 செயல்விளக்கமும் இதில் உள்ளது.

evm2rv என்பது EVM இயக்கநேர பைட்கோடை, அதாவது solc --bin-runtime தரும் வெளியீட்டை, எடுத்துக்கொண்டு அதை ஒரு Rand நிரலாக மாற்றுகிறது. இது C குறியீட்டை எழுதுகிறது; rand-guest build அந்த C குறியீட்டை ஒரு RV32IM படிமமாகத் தொகுக்கிறது. Rand-இன் EVM உரைபெயர்ப்பி விருந்தினரான evm.bin ஏற்கும் அதே உள்ளீட்டு வெக்டரை இந்தப் படிமமும் ஏற்கிறது; அதே எட்டு வெளியீட்டுச் சொற்களையும் வெளியிடுகிறது. ஒப்பந்தத்தைச் செயற்குறியீடு செயற்குறியீடாக உரைபெயர்க்காமல், நேரடியாக இயக்குகிறது. ஒரு ERC-20 மீது இந்த முழுப் பாதையையும் இந்தப் பக்கம் காட்டுகிறது.

இது என்ன

உள்ளீடுEVM இயக்கநேர பைட்கோடு, ஹெக்ஸ் உரையாக (.hex) அல்லது மூல பைட்டுகளாக
வெளியீடுஒரு C இடைப்பொருத்து கிரேட்; rand-guest build அதை ஒரு படிமக் கொள்கலனாக்குகிறது
இயங்கும் இடம்சங்கிலிக்கு வெளியே, உருவாக்குநரின் கணினியில்; சங்கிலி படிமத்தை மட்டுமே காண்கிறது
பொருந்த வேண்டியவைevm.bin-இன் நிலைக் குறி, எட்டு வெளியீட்டுச் சொற்கள், gas_used
களஞ்சியம்circuits களஞ்சியத்தில் evm2rv/
நிலைப்படுத்தப்பட்ட கருவித்தொடர்Rust 1.98.1, clang 23.1.1, cc கிரேட் 1.4.6

மொழிபெயர்ப்பி இயக்கநேரக் குறியீட்டை எடுத்துக்கொள்கிறது, உருவாக்கக் குறியீட்டை அல்ல. ஒரு நிரூபணம் ஏற்கெனவே நிறுவப்பட்ட ஒப்பந்தத்திற்கான ஓர் அழைப்பை மட்டுமே உள்ளடக்குகிறது; ஆகவே ஆக்கி ஒருபோதும் இயங்குவதில்லை. ஆக்கி எழுதியிருக்கக்கூடிய நிலை, அதற்குப் பதிலாக, சேமிப்புச் சாட்சிகளாக முன்-நிலையின் பகுதியாகிறது.

மொழிபெயர்ப்பில் இரண்டு நிலைகள் உள்ளன. இரண்டும் ஒரே முடிவுகளையும் ஒரே கேஸையும் தருகின்றன; ஒவ்வொன்றும் தனக்கென்ற hc கொண்ட தனி நிரல்.

நிலைகொடிசெய்வது
ஒன்று--stage 1ஒவ்வொரு செயற்குறியீடும் நினைவக அடுக்கின் மீது
இரண்டு--stage 2, இயல்புநிலைஒவ்வொரு தொகுதியின் அடுக்குச் சொற்களும் C உள்ளூர் மாறிகளில், மாறிலிகள் மொழிபெயர்ப்பின்போதே சுருக்கப்படுகின்றன

உள்ளீட்டு வெக்டர் உரைபெயர்ப்பியினுடையதே: குறியீடு, அழைப்புத் தரவு, அழைப்பவர் மற்றும் பிற சூழல் சொற்கள், கேஸ் வரம்பு, முன்-நிலை மூலம், அழைப்பு தொடும் ஒவ்வொரு இடத்திற்கும் ஒரு சேமிப்புச் சாட்சி. வெளியீடுகள்: out[0], நிலைக் குறி (1 வெற்றி, 0 மீட்டமைப்பு, 2 விதிவிலக்கான நிறுத்தம்), மற்றும் out[1..8], குறியீட்டு ஹாஷ், இரு நிலை மூலங்கள், திருப்பித் தரும் தரவு, பதிவுகள் ஆகியவற்றின் மீதான EVM_OUT சுருக்கம்.

நம்பிக்கை மாதிரி

மொழிபெயர்க்கப்பட்ட ஒப்பந்தத்தை ஒரு சரிபார்ப்பான் இரண்டு படிகளில் சரிபார்க்கிறது.

  1. hc == translate(bytecode). வெளியிடப்பட்ட பைட்கோடின் மீது அதே --stage, --chain-id உடன் evm2rv-ஐ மீண்டும் இயக்கி, நிலைப்படுத்தப்பட்ட கருவித்தொடருடன் மீண்டும் கட்டமைத்து, hc-ஐ ஒப்பிடுங்கள். உருவாக்கப்பட்ட கிரேட் cc-ஐத் துல்லியமாக நிலைப்படுத்துகிறது; தனக்கென்ற Cargo.lock-ஐயும் கொண்டுள்ளது.
  2. குறியீட்டுக் காவல் hc-ஐ பைட்கோடுடன் பிணைக்கிறது. மொழிபெயர்க்கப்பட்ட தர்க்கம் படிமத்திற்குள் தொகுக்கப்படுகிறது; ஆனால் CODECOPY, CODESIZE ஆகியவை உள்ளீட்டு வெக்டரில் உள்ள குறியீட்டைப் படிக்கின்றன. சரிபார்ப்பு இல்லாவிட்டால், ஒரே hc அழைப்பவர் தேர்ந்தெடுத்த குறியீட்டு பைட்டுகளுடன் இயங்கக்கூடும். ஆகவே contract.c மூல பைட்கோடின் (அதன் நீளம், பைட்டுகள்) Poseidon2 சுருக்கத்தைக் கொண்டுள்ளது; மொழிபெயர்க்கப்பட்ட எந்தக் குறியீடும் இயங்கும் முன்பே, இடைப்பொருத்து உள்ளீட்டு வெக்டரின் குறியீட்டை அதே முறையில் ஹாஷ் செய்கிறது. வேறு குறியீடு மறுக்கப்படும்: நிலைக் குறி 2, gas_used 0, நிறுத்தம் OutOfBounds.

உரைபெயர்ப்பியின் சுருக்கத்தைப் போலவே, EVM_OUT சுருக்கமும் குறியீட்டின் keccak256-ஐப் பிணைக்கிறது. மூல பைட்கோடையோ அதன் ஹாஷையோ சங்கிலி பதிவு செய்வதில்லை. பிறர் hc-ஐச் சரிபார்க்க வேண்டுமெனில், பைட்கோடை வெளியிடுங்கள்; அல்லது Solidity மூலத்தையும் துல்லியமான solc கட்டமைப்பையும் வெளியிடுங்கள்.

பரிமாற்றத்தில் காவலின் செலவு 1,008 சுழற்சிகள். மூலத்திலிருந்து ஒரு பைட் மட்டும் வேறுபடும் குறியீடு, நிலை இரண்டில் 30,418 சுழற்சிகளில் (அடுக்கு 16) மறுக்கப்படுகிறது.

உள்ளடக்கம், எவை இடைநிறுத்தப்படுகின்றன

செயற்குறியீடுகள். Shanghai தொகுப்பு. --evm-version shanghai உடன் தொகுங்கள்: புதிய இலக்குகள் MCOPY மற்றும் பிற Cancun செயற்குறியீடுகளை வெளியிடுகின்றன; அவை இடைநிறுத்தப்படும்.

சூழல் செயற்குறியீடுகள்:

செயற்குறியீடுமொழிபெயர்ப்பு
ADDRESS, CALLER, CALLVALUE, CALLDATASIZE, CODESIZEஉள்ளீட்டு வெக்டரிலிருந்து, உரைபெயர்ப்பி படிப்பதைப் போலவே
CHAINID--chain-id மதிப்பு, மொழிபெயர்ப்பின்போதே பதிக்கப்படுகிறது, ஆகவே hc அதைப் பிணைக்கிறது; குறியீட்டில் CHAINID இருந்தால் கட்டாயம்
ORIGINCALLER-க்குச் சமம் (ஓர் அழைப்பு, இடைத்தொடர்பி இல்லை)
GASPRICE, COINBASE, TIMESTAMP, NUMBER, PREVRANDAO, GASLIMIT, SELFBALANCE, BASEFEE, BLOCKHASHஇடைநிறுத்தப்படும் (நிலைக் குறி 2), உரைபெயர்ப்பியில் உள்ளதைப் போலவே

இந்த ஒன்பது தொகுதிச் சூழல் செயற்குறியீடுகளையும் ஒரு தொகுதியுடன் பிணைப்பதற்கான வடிவமைப்பு உருவாகும் வரை அவை இடைநிறுத்தப்படும். ஒரு தனிப்பட்ட உள்ளீடு தொகுதி பற்றிய உண்மையைக் கொண்டுசெல்ல முடியாது; ஏனெனில் சரிபார்ப்பானால் H_IN-ஐத் திறக்க முடியாது. அந்த முடிவு எடுக்கப்படும் வரை, நேரத்தையோ தொகுதி எண்ணையோ படிக்கும் ஒப்பந்தம் (எடுத்துக்காட்டாக, அனுமதிச் சீட்டின் காலக்கெடு) இடைநிறுத்தப்படும்.

அழைப்புகள். இலக்கு முகவரி 1 முதல் 9 வரை இருக்கும்போது CALL, CALLCODE, DELEGATECALL, STATICCALL ஆகியவை ஒரு முன்தொகுப்பை இயக்குகின்றன. வேறு எந்த இலக்கும் இடைநிறுத்தப்படும். CALL அல்லது CALLCODE மீதான பூஜ்யமற்ற மதிப்பு இடைநிறுத்தப்படும்: இருப்பு மாதிரி இல்லை.

முன்தொகுப்புகள். ஒன்பதும் மென்பொருளில் இயங்குகின்றன. ஒரு நிரூபணம் அதிகபட்சம் 2²⁰ வரிசைகளையே கொள்ளும் என்பதால், சில இன்று நிரூபிக்க மிக மெதுவானவை:

முன்தொகுப்புவெக்டர்சுழற்சிகள்2²⁰-க்குள் அடங்குமா
1 ecrecoverValidKey14,510,525இல்லை
2 sha256”abc” / 200 பைட்டுகள்2,791 / 5,289ஆம்
3 ripemd160”abc”12,195ஆம்
4 identity100 பைட்டுகள்4,498ஆம்
5 modexpnagydani-1-square / -1-pow0x10001122,332 / 874,548ஆம்
5 modexpeip_example1 (256-பிட்)11,170,118இல்லை
5 modexpnagydani-5-pow0x10001 (1,024-பைட்)55,076,950இல்லை
6 bn256 addchfast1978,262ஆம், மிகக் குறுகிய இடைவெளியில்
7 bn256 mulchfast13,060,669இல்லை
8 bn256 pairing1 ஜோடி / 2 ஜோடிகள்1,853,656,212 / 2,019,000,469இல்லை
9 blake2f12 சுற்றுகள்14,493ஆம், சுமார் 1,800 சுற்றுகள் வரை

modexp-இன் அடியும் மட்டும் ஒவ்வொன்றும் 1,024 பைட்டுகளுக்கு வரம்பிடப்பட்டுள்ளன.

ஏற்கப்பட்ட வேறுபாடுகள். நிலைக் குறி, எட்டுச் சொற்கள், gas_used ஆகியவை பொருந்த வேண்டும். மூன்று வேறுபாடுகள் ஏற்கப்படுகின்றன: நிறுத்தத்தின் வகை வேறுபடலாம் (நிலையான கேஸ் ஒவ்வொரு தொகுதியின் தொடக்கத்திலும் வசூலிக்கப்படுவதால், OutOfGas-உம் வேறொரு நிறுத்தமும் இடம் மாறலாம்; இரண்டுமே நிலைக் குறி 2, முழுக் கேஸும் பயன்படுத்தப்பட்டது); உரைபெயர்ப்பி இடைநிறுத்தும் CHAINID, ORIGIN, முன்தொகுப்பு அழைப்புகள் ஆகியவற்றை மொழிபெயர்ப்பு செயல்படுத்துகிறது; குறியீட்டுக் காவல் தன் மூலம் அல்லாத குறியீட்டை மறுக்கிறது.

எண்ணிக்கைகள்

குறியீட்டுக் காவல் உள்ளடங்கிய ERC-20 அழைப்புகள். சுழற்சிகள் rand-guest run-இலிருந்து; அடைப்புக்குறிக்குள் அடுக்கு.

அழைப்புஉரைபெயர்ப்பி (evm.bin)நிலை ஒன்றுநிலை இரண்டு (இயல்புநிலை)
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)
நிரல்சொற்கள்hc
evm.bin, உரைபெயர்ப்பி18,0097e1aea2b…854c08
ERC-20, நிலை ஒன்று15,8049cdb79e7…2fd048c8
ERC-20, நிலை இரண்டு11,686a0feae92a7311c9562495717100eb7aea71270a38ed435d06dc31387e0ea8ff6

நிலை இரண்டு இந்த மூன்று அழைப்புகளையும் உரைபெயர்ப்பியின் சுழற்சிகளில் முறையே 54.5%, 56.2%, 55.0%-இல் இயக்குகிறது. பரிமாற்றம் அடுக்கு 18-இலேயே நிற்கிறது: அதன் 66,235 சுழற்சிகளும் 3,155 சுருக்க வரிசைகளும் சேர்ந்து 69,390 வரிசைகள்; இது அடுக்கு 16-இன் 65,535-ஐ விட 3,855 அதிகம்.

நிலை இரண்டுப் பரிமாற்றத்தின் சுமார் 60% (சுமார் 39,928 சுழற்சிகள்) இரு படிமங்களும் பகிரும் பொதுச் சட்டகமே: உள்ளீட்டைக் குறிவிலக்குதல், சேமிப்புச் சாட்சிகளைச் சரிபார்த்தல், ABI-இன் keccak256 அழைப்புகள், வெளியீட்டுச் சுருக்கம். எந்த மொழிபெயர்ப்பு உழைப்பும் அந்த அடித்தளத்திற்குக் கீழே செல்ல முடியாது.

படிப்படியான வழிகாட்டி: ஒரு ERC-20, Solidity-இலிருந்து பொருந்தும் வெளியீடுகள் வரை

ஒவ்வொரு கட்டளையும் 7ef3220-இல் உள்ள circuits களஞ்சிய நகலின் மூலத்திலிருந்து இயங்குகிறது; ஒரு Rust நிரலை நிறுவுதல் பக்கத்தில் உள்ள கருவித்தொடரும், ஒரு RISC-V நிரலை நிறுவுதல் பக்கத்தில் உள்ள clang 23.1.1-உம் தேவை. நீண்ட வெளியீடு … எனக் குறிக்கப்பட்ட இடங்களில் வெட்டப்பட்டுள்ளது.

0. கருவிகளைக் கட்டமைத்தல்

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

1. Solidity-ஐ இயக்கநேர பைட்கோடாகத் தொகுத்தல்

ஒப்பந்தம், உறுதிசெய்யப்பட்ட guests-compiled/evm/contracts/ERC20.sol: OpenZeppelin v4-இன் சேமிப்பு அமைப்பைக் கொண்ட, தன்னிறைவான ERC-20, pragma solidity 0.8.37. துல்லியமாக solc 0.8.37-ஐயே பயன்படுத்துங்கள்; வேறு பதிப்பு வேறுவிதமாக உகப்பாக்கம் செய்து வேறு பைட்கோடைத் தரும்.

வெளியீடுgithub.com/ethereum/solidity/releases-இலிருந்து v0.8.37
macOS கோப்புsolc-macos, sha256 a27396e7732aa52e80ff89ad7bd8a2e46fec2a6dcc4ef20cd16e5e0c502d6821
Linux கோப்புsolc-static-linux, அதே வெளியீட்டிலிருந்து
$ 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

கடைசி வரி இயக்கநேர பைட்கோடு, 1,296 பைட்டுகள். இது உறுதிசெய்யப்பட்ட guests-compiled/evm/contracts/erc20.runtime.hex-உடன் பைட்டுக்கு பைட் ஒத்ததே; SOLC=$PWD/solc bash guests-compiled/evm/contracts/build.sh அதைச் சரிபார்த்து contracts: erc20.runtime.hex reproduces என அச்சிடுகிறது.

கொடிகள் முக்கியமானவை:

  • --bin-runtime: நிறுவப்பட்ட குறியீடு, உருவாக்கக் குறியீடு அல்ல.
  • --evm-version shanghai: 0.8.37-இன் இயல்புநிலை இலக்கு MCOPY-ஐ வெளியிடுகிறது; அது இடைநிறுத்தப்படும்.
  • --optimize --optimize-runs 200: நிறுவப்பட்ட ஒப்பந்தத்திற்கான சுயவிவரம்.

2. மொழிபெயர்த்தல்

$ 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 ஒரு circuits களஞ்சிய நகலுக்குள் இருக்க வேண்டும். அது இல்லாவிட்டால், evm2rv குறியீட்டைப் பகுப்பாய்வு மட்டுமே செய்யும்.
  • இடைநிறுத்தப்படும் எந்தச் செயற்குறியீடும் அதன் pc-உடன் ஓர் எச்சரிக்கையாக இங்கே பட்டியலிடப்படும்.
  • இந்த அமர்வு --chain-id 12 உடன் பதிவுசெய்யப்பட்டது. இந்த ERC-20-இல் CHAINID இல்லை; ஆகவே --chain-id அதன் hc-ஐ மாற்றுவதில்லை. CHAINID-ஐப் படிக்கும் ஒப்பந்தத்திற்கு இந்தக் கொடி கட்டாயம்; நீங்கள் நிறுவப்போகும் சங்கிலிக்கு அதை அமையுங்கள் (நேரடிச் சங்கிலிக்கு --chain-id 19).

contract.c குறியீட்டுக் காவலின் சுருக்கத்துடன் முடிகிறது:

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

3. படிமத்தைக் கட்டமைத்தல்

இயல்புநிலை வரம்பு 4,096 சொற்கள்; ஆகவே --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

இதுவே வெளியிடப்பட்ட நிலை இரண்டு hc. கிரேட்டின் பெயர் அதைப் பாதிப்பதில்லை.

4. ஓர் உள்ளீட்டு வெக்டரைக் கட்டமைத்து ஒரு பரிமாற்றத்தை இயக்குதல்

erc20_vector எடுத்துக்காட்டு, சமநிலைச் சோதனையின் வெக்டர்களை உள்ளீட்டுச் சொற்களாக அச்சிடுகிறது: transfer (ALICE தன்னிடமுள்ள 1,000-இல் 250-ஐ BOB-க்கு அனுப்புகிறார்), approve (ALICE, BOB 5-ஐச் செலவிட அனுமதிக்கிறார்), transferFrom (300 அனுமதித் தொகைக்கு எதிராக, ALICE-இன் 1,000-இல் 100-ஐ BOB நகர்த்துகிறார்). உங்கள் சொந்த ஒப்பந்தத்திற்கு, Rust-இல் இதே முறையில் ஒரு EvmCall-ஐக் கட்டமையுங்கள்; இந்த எடுத்துக்காட்டே வார்ப்புரு.

$ (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. உரைபெயர்ப்பியுடன் ஒப்பிடுதல்

உரைபெயர்ப்பி விருந்தினர் மீது அதே உள்ளீடு:

$ 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

மற்றும் ஹோஸ்டில் நேரடியாக இயங்கும் வரிமொழிபெயர்ப்பி, சோதனைகளின் ஒப்பீட்டு அளவுகோல்:

$ (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

சரிபார்ப்பு ஒரே கட்டளையாக:

$ 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

approve, transferFrom ஆகியவற்றுடன் படிகள் 4, 5 ஐ மீண்டும் செய்யவும்; இரண்டும் ஒரே சொற்களைத் தருகின்றன. cd evm2rv && cargo +1.98.1 test --release இவற்றையும் மேலும் ஐந்து திசையன்களையும் இரு கட்டங்களிலும் இயக்குகிறது, gas_used ஐயும் சரிபார்க்கிறது (70 சோதனைகள், மேலும் புறக்கணிக்கப்பட்ட 2 நிரூபணங்கள்).

மொழிபெயர்க்கப்பட்டது (இரண்டாம் கட்டம்)வரிமொழிபெயர்ப்பி (evm.bin)
எட்டு வெளியீட்டுச் சொற்கள்ஒரே மாதிரியானவைஒரே மாதிரியானவை
சுழற்சிகள், பரிமாற்றம்66,235121,638
அடுக்கு1818
நிரல் சொற்கள்11,68618,009

6. நிறுவுதல்

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

பணப்பை நிரல் அடையாளம், சொல் எண்ணிக்கை, hc ஆகியவற்றை அச்சிடுகிறது; பின்னர் எதையும் நிரூபிப்பதற்கு முன் சங்கிலியின் வரம்பைச் சரிபார்க்கிறது. படிமம் 11,686 சொற்கள் கொண்டது, எனவே அதன் ஜெனிசிஸ் max_program_words ஐக் குறைந்தது 11,686 ஆக அமைக்கும் சங்கிலி தேவை. சங்கிலி 12 இயல்புநிலை 4,096 இல் இயங்கியது, எனவே அங்கே நிறுவுதல் மறுக்கப்பட்டது. v0.4 சங்கிலியான சங்கிலி 13, max_program_words ஐ 65,535 ஆக அமைத்தது; அதன் பிறகான ஒவ்வொரு சங்கிலியும் அந்த மதிப்பையே வைத்துள்ளது. தற்போது இயங்கும் சங்கிலி 20 (ஜெனிசிஸ் 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135), சங்கிலி 13 இன் தொகுதி, அழைப்பு-உறை, பொது-உள்ளீட்டு வரம்புகளையும் வைத்துள்ளது; நிரூபண வரம்பைப் பாதியாக்கி 4 MiB ஆக்குகிறது (4,194,304 பைட்டுகள், சங்கிலி 17 முதல்; சங்கிலிகள் 13 முதல் 16 வரை 8 MiB அமைத்தன). சொல் வரம்பு மட்டுமே இனி ஒரே தடை அல்ல. சங்கிலி 20 இன் ஜெனிசிஸ் hardening_v6 ஐ அமைக்கிறது; அதன்கீழ், அடுக்கு-14 அழைப்பு வரம்பில் ஓர் அழைப்பு தாங்கக்கூடியதை விட அதிக நிரல் சொற்களைக் கொண்ட நிறுவுதல் செல்லாதது (ProgramUncallable): பொது உள்ளீடு இல்லாதபோது அதிகபட்சம் 8,180 சொற்கள். இந்தப் படிமம் 11,686 சொற்கள், எனவே சங்கிலி 20 நிறுவுதலை மறுக்கிறது; அழைப்புகளையும் அது மறுக்கும்: ஒவ்வொரு ERC-20 அழைப்பும் அடுக்கு 16 அல்லது 18 இல் நிரூபிக்கப்படுகிறது, இது அடுக்கு-14 அழைப்பு வரம்பை விட அதிகம் (படி 7). சங்கிலி 20 இல் தொகுதித் திரட்டல் முடக்கப்பட்டுள்ளது (அதன் ஜெனிசிஸில் aggregation பிரிவு இல்லை); அதன் தொடக்க முனைகள் சரிபார்ப்பாளரை இயக்குதல் பக்கத்தில் பட்டியலிடப்பட்டுள்ளன. நிறுவுதல் கட்டணம் 0.001 + 0.0001 × 11,686 = 1.1696 RAND, கீழே உள்ள சங்கிலி-13 நிறுவுதல் செலுத்திய கட்டணம் இதுவே.

இந்த நிறுவுதல் 2026-09-19 அன்று, சங்கிலி 13 இயங்கும் சங்கிலியாக இருந்தபோது (உற்பத்தி FRI சுயவிவரம், ஜெனிசிஸ் 8123ccac1883a45750e4df6964fb7cd3f0b321798cde4c0ef406a0293939ece3), ஜெனிசிஸ் பணப்பை shielded-1 இலிருந்து சங்கிலி 13 இல் இயங்கியது. அதன் பிறகான ஒவ்வொரு சங்கிலியும் (14 முதல் 19 வரை) சங்கிலி 13 இன் நிரல்கள் இல்லாத புதிய சங்கிலியாகத் தொடங்கப்பட்டது; படிமம் அவற்றில் எதிலும் மீண்டும் நிறுவப்படவில்லை, எனவே கீழே உள்ள பரிவர்த்தனையும் உயரமும் சங்கிலி 13 க்கு உரியவை, சங்கிலி உலாவியில் இனி கிடைக்காது. நிரல் அடையாளம் base_pc மற்றும் சொற்களின் மீதான ஹாஷ் மட்டுமே, எனவே நிறுவுதலை ஏற்கும் எந்தச் சங்கிலியிலும் அதே படிமம் அதே அடையாளத்தைப் பெறுகிறது. முன்னேற்ற வரிகள் நீக்கப்பட்ட (…) பணப்பையின் வெளியீடு:

$ rand program deploy <image.bin>
program id: f074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d (11686 words, hc 92aefea0951c31a717574962aeb70e10a37012a7d035d48e8713c36df68feae0)
…
proved in 92.2s: tier 14, 1419655 bytes
submitted deploy c7a66dc4d9cdb7f9bfc4bde01f618c356e5abad7097e6bf7dc04e2e49c53acd0
…
நிரல் அடையாளம்f074c4eb834cf01886a8241b6a2e0caf6e1cee5327fee6cb1a1a37436607280d
படிமம்11,686 சொற்கள்; rand-guest இன் எழுத்துமுறையில் hc a0feae92…, பணப்பையின் எழுத்துமுறையில் 92aefea0…
கட்டணத் தொகுப்பு (சங்கிலி 13 இன் 2-உள்-2-வெளி தொகுப்பு)அடுக்கு 14, 1,419,655 பைட்டுகள், 92.2 s இல் நிரூபிக்கப்பட்டது
நிறுவுதல் பரிவர்த்தனை (சங்கிலி 13)c7a66dc4d9cdb7f9bfc4bde01f618c356e5abad7097e6bf7dc04e2e49c53acd0
உறுதிசெய்யப்பட்ட உயரம் (சங்கிலி 13)381

சங்கிலி 14 முதல், கட்டணம் செலுத்தும் தொகுப்பு ஒவ்வொரு பரிவர்த்தனையும் கொண்டுசெல்லும் ஒரே 4-உள்-4-வெளி மறைக்கப்பட்ட-சொத்து தொகுப்பாகும்; இது பரிவர்த்தனையின் பிணைப்புக்கு எதிராக நிரூபிக்கப்படுகிறது. இது இன்னும் அடுக்கு 14 தான்: சங்கிலிகள் 14, 15 இல் உற்பத்திச் சுயவிவரத்தில் சுமார் 100 s, சுமார் 1.42 MB. சங்கிலி 17 முதல் ஒரு தொகுப்பு அடுக்கு-10 அங்கீகார நிரூபணத்தையும் கொண்டுசெல்கிறது (பிரிக்கப்பட்ட அங்கீகாரம்), எனவே சங்கிலிகள் 18, 19 இல் ஒரு பரிவர்த்தனையின் கட்டணத் தொகுப்பு சுமார் 1.49 MB தொகுப்பு நிரூபணமும் சுமார் 1.37 MB அங்கீகார நிரூபணமும் ஆகும்.

7. அழைப்பு

ஒரு பரிமாற்ற அழைப்பு 921-சொல் திசையனைத் தனிப்பட்ட உள்ளீடுகளாகக் கொண்டுசெல்கிறது; இது எந்தச் சங்கிலியிலும் உள்ளீட்டு வரம்புக்குள் உள்ளது (இயல்புநிலையாக 4,295 சொற்கள், சங்கிலி 20 இல் 16,071), பொதுச் சொற்கள் எதுவும் இல்லை. இதைச் சங்கிலி 20 க்குச் சமர்ப்பிக்க முடியாது: நிரலை அங்கே நிறுவ முடியாது (படி 6), பரிமாற்றம் அடுக்கு 18 இல் நிரூபிக்கப்படுகிறது, மேலும் fullnode v0.5.6 (2026-09-25) முதல், அடுக்கு 14 க்கு மேற்பட்ட எந்த அழைப்பு நிரூபணத்தையும் ஒரு முனை சரிபார்ப்பு விசையை உருவாக்குவதற்கு முன்பே CallTierTooHigh உடன் மறுக்கிறது. கீழே உள்ள கட்டளை உள்ளூரில் நிரூபிக்கிறது, சங்கிலி அதன் முடிவை மறுக்கிறது; அளவீடுகள் சங்கிலிக்கு வெளியிலான நிரூபணங்கள். rand call ஒவ்வொரு சொல்லையும் மீண்டும் மீண்டும் வரும் --input ஆக எடுத்துக்கொள்கிறது:

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

இப்போது அளவிடப்பட்டது. ஓர் அடுக்கு-18 நிரூபணம் 48 GB மடிக்கணினியில் 24.7 GB இல் நிறுத்தப்பட்டது, ஆனால் 128 GB டிராப்லெட்டில் (m-16vcpu-128gb) மொழிபெயர்க்கப்பட்ட transfer அழைப்பு நிரூபிக்கப்பட்டது: 85.0 GB உச்ச RSS, 3,230.5 s (53.8 நிமிடம்), 811,600-பைட் நிரூபணம். இது டிராப்லெட்டில் 101.4 s இலும், 48 GB Apple silicon மடிக்கணினியில் 3.66 GB RSS உடன் 50.2 s இலும் சரிபார்க்கப்பட்டது (நிரூபண நினைவகம்). gas பிரிவு இல்லாத சங்கிலிகளின் விதியான (சங்கிலி 17 வரை) பேரேட்டின் நிலையான அடுக்குக் கட்டண அட்டவணையின்கீழ், அடுக்கு 18 இல் அழைப்புக் கட்டணம் 0.0024 RAND ஆக இருந்தது. சங்கிலிகள் 18, 19 அதற்குப் பதிலாக ஓர் அழைப்பை அதன் அறிவிக்கப்பட்ட கேஸ் வரம்பு மற்றும் பைட்டுகளின் அடிப்படையில் விலையிடுகின்றன, ஜெனிசிஸ் விலைகளில் ஒரு கேஸுக்கு 100 அலகுகளும் ஒரு KiB க்கு 800 அலகுகளும்; அடுக்கு 14 க்கு மேற்பட்ட எந்த அழைப்பையும் அவை ஏற்பதில்லை.

சங்கிலி 13 இல் அழைப்பு, 2026-09-19

approve(BOB, 5) அழைப்பு (649 தனிப்பட்ட சொற்கள், அடுக்கு 16) 2026-09-19 அன்று, சங்கிலி 13 இயங்கும் சங்கிலியாக இருந்தபோது, உற்பத்தி FRI சுயவிவரத்தில், அதே பணப்பையிலிருந்து சங்கிலி 13 இல் இயங்கியது. நிரல் நிறுவப்படாத பிந்தைய எந்தச் சங்கிலியிலும் எந்த அழைப்பும் செய்யப்படவில்லை; சங்கிலி 20 இந்த அடுக்கு-16 அழைப்பு நிரூபணத்தை மறுக்கிறது (CallTierTooHigh). முன்னேற்ற வரிகள் நீக்கப்பட்ட (…) பணப்பையின் வெளியீடு:

$ 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
…
அழைப்பு நிரூபணம்அடுக்கு 16, 3,412,405 பைட்டுகள், 388.7 s இல் நிரூபிக்கப்பட்டது
கட்டணத் தொகுப்பு (சங்கிலி 13 இன் 2-உள்-2-வெளி தொகுப்பு)அடுக்கு 14, 1,420,423 பைட்டுகள், 96.0 s இல் நிரூபிக்கப்பட்டது
முத்திரையிடப்பட்ட உறை2,700 பைட்டுகள்
அழைப்புப் பரிவர்த்தனை (சங்கிலி 13)279e1f62abf3f177ca71b08c633e051c37bc4720118c79ddb00936f036c4bfa7
நங்கூரமிடப்பட்ட உயரம் / உறுதிசெய்யப்பட்ட உயரம்உயரம் 802 / உயரம் 919
கட்டணம்0.00357 RAND
ரசீது h_pubnull
ரசீது வெளியீடுகள்அதே திசையனுக்கான வரிமொழிபெயர்ப்பியின் எட்டுச் சொற்களுக்குச் சமம்
மொத்த நேரம், உச்ச RSS622.8 s, 22.9 GB, 48 GB M-வரிசை மடிக்கணினியில்
  • உற்பத்தி நிரூபணம் 3,412,405 பைட்டுகள், இது சங்கிலி 12 இன் 2 MiB நிரூபண வரம்பை விட அதிகம். சங்கிலி 12 இந்த அழைப்பை ஏற்க முடியவில்லை; சங்கிலி 13 இன் 8 MiB வரம்பு ஏற்றது. சங்கிலிகள் 14 முதல் 16 வரை அதே வரம்பை வைத்திருந்தன; சங்கிலிகள் 17 முதல் 20 வரை 4 MiB (4,194,304 பைட்டுகள்) அமைத்தன, இந்த அளவிலான நிரூபணம் அதற்குள்ளும் அடங்குகிறது. v0.5.6 முதல், ஒரு முனை அழைப்பின் அளவைப் பார்ப்பதற்கு முன்பே அதன் அடுக்குக்காக அதை மறுக்கிறது.
  • கட்டணத்தில் சங்கிலி 13 இன் அட்டவணையின் பைட் உறுப்பு அடங்கும்: 3.41 MB நிரூபணம் 2 MiB + 18,432-பைட் இலவச வரம்பை விட அதிகம். சங்கிலி 18 முதல் ஒவ்வொரு அழைப்பும் பைட் 0 முதலே ஒரு KiB க்குக் கட்டணம் செலுத்துகிறது.

ரசீதின் எட்டுச் சொற்கள் படி 4 இல் உள்ளவையே. சங்கிலி எந்த EVM நிலையையும் வைத்திருப்பதில்லை: அழைப்பவர் முன்-நிலை வேரையும் சேமிப்புச் சாட்சிகளையும் வழங்குகிறார், பின்-நிலை வேர் EVM_OUT சுருக்கத்தினுள் உள்ளது.

வரம்புகள்

  • தொகுதிச் சூழல் இல்லை. தொகுதியைப் பிணைக்கும் வடிவமைப்பு ஒன்று உருவாகும் வரை, தொகுதிச் சூழலுக்கான ஒன்பது செயல்குறியீடுகளும் இடைநிறுத்தப்படும்.
  • மதிப்புப் பரிமாற்றங்கள் இல்லை. பூஜ்ஜியமற்ற மதிப்புடன் கூடிய CALL இடைநிறுத்தப்படும். முன்தொகுக்கப்பட்ட ஒப்பந்தங்கள் அல்லாத பிற ஒப்பந்தங்களுக்கான அழைப்புகளும் இடைநிறுத்தப்படும்.
  • ecrecover, bn256 பெருக்கல், pairing மற்றும் பெரிய modexp ஆகியவற்றை இன்று நிரூபிக்க இயலாது. ஒவ்வொன்றும் 2²⁰-வரிசை அடுக்கு வரம்பை மீறுகிறது; இவற்றுக்கு இணைச்செயலி அட்டவணைகள் தேவை.
  • சங்கிலியில் EVM நிலை இல்லை. ஓர் அழைப்பு என்பது ஓர் இயக்கத்தின் மீதான ஒரு நிரூபணம்; நிலையை அழைப்பவரே சுமந்து செல்கிறார்.
  • சங்கிலி 20-இல் deploy-உம் எந்த ERC-20 அழைப்பும் ஏற்கத்தக்கவை அல்ல. சங்கிலி 20-இன் hardening_v6 விதியின் கீழ், அடுக்கு-14 அழைப்பு ஒன்று தாங்கக்கூடியதை விட அதிகச் சொற்களைக் கொண்ட deploy செல்லாது (ProgramUncallable; அதிகபட்சம் 8,180 சொற்கள்); இந்தப் படிமமோ 11,686 சொற்கள். fullnode v0.5.6 முதல், ஓர் அழைப்பு நிரூபணம் அடுக்கு 14 அல்லது அதற்குக் கீழ் இருக்க வேண்டும் (CallTierTooHigh); approve அடுக்கு 16-இலும், transfer, transferFrom ஆகியவை அடுக்கு 18-இலும் நிரூபிக்கப்படுகின்றன. ஓர் அழைப்பு அறிவிக்கக்கூடிய ஹாஷ் அட்டவணைகளுக்கும் இதே சரிபார்ப்பு வரம்பிடுகிறது: 2¹² Keccak வரிசைகள் (128 permutation-கள்), 2¹³ SHA-256 வரிசைகள் (128 சுருக்கங்கள்). கீழே காட்டியுள்ளபடி, இந்த அழைப்புகள் சங்கிலிக்கு வெளியே இன்னும் நிரூபிக்கப்படுகின்றன.
  • சேமிப்புக் குறியீட்டின் ஆழம் 32 பிட்கள் மட்டுமே. evm-core ஒப்பந்தச் சேமிப்பு இலை ஒன்றை keccak256(slot)-இன் மேல் 32 பிட்களைக் கொண்டு இடுகிறது; எனவே தேர்ந்தெடுக்கப்பட்ட slot ஒன்றுடன் மோதும் slot-ஐக் கண்டறிய ஏறத்தாழ 2³² Keccak ஹாஷ்கள் தேவை; அந்த slot பூஜ்ஜியமற்ற மதிப்பைக் கொண்டிருக்கும் வரை, தேர்ந்தெடுக்கப்பட்ட slot உறைந்திருக்கும் (போலியாக்கமும் இல்லை, மதிப்பு இழப்பும் இல்லை). இது தற்போது செயலற்ற நிலையில் உள்ளது: evm.bin 18,009 சொற்கள் கொண்டது; அடுக்கு-14 வரம்பில் உள்ள அழைப்பு அதிகபட்சம் 8,184 சொற்களையே தாங்கும்; எனவே எந்தச் சங்கிலியிலும் எந்த EVM இயக்கச்சூழலையும் அழைக்க இயலாது. fullnode-இன் docs/confidential.md இந்த முன்நிபந்தனையை அழைப்பு வரம்புக்கு அருகிலேயே பதிவு செய்கிறது (தணிக்கை v6, ZKV-6; v0.6.7 குறிச்சொல்லுக்குப் பின், 2026-09-30 முதல் main-இல் உள்ளது): ஒரு சங்கிலி அடுக்கு-14 அழைப்பு வரம்பை நீக்குவதற்கு முன்போ, அழைக்கக்கூடிய அளவுக்குச் சிறிய EVM இயக்கச்சூழலை ஏற்பதற்கு முன்போ, சேமிப்புக் குறியீடு ஆழப்படுத்தப்பட்டு evm.bin மீண்டும் பொருத்தப்பட வேண்டும்.
  • நிரூபிக்கப்பட்டது. முதல் கட்ட transfer நிரூபணம் (அடுக்கு 18) 48 GB மடிக்கணினியில் 1,016 s-க்குப் பிறகு 24.7 GB நிலையில் SIGKILL மூலம் நிறுத்தப்பட்டது; ஆனால் இரண்டாம் கட்ட transfer அழைப்பு 128 GB droplet-இல் (m-16vcpu-128gb) நிரூபிக்கப்பட்டது: உச்ச RSS 85.0 GB, 3,230.5 s (53.8 நிமிடம்), 811,600-பைட் நிரூபணம்; அது 101.4 s-இல் (droplet) சரிபார்க்கப்பட்டது, 48 GB மடிக்கணினியில் 3.66 GB RSS உடன் 50.2 s-இல் சரிபார்க்கப்பட்டது. மொழிபெயர்ப்பியின் evm.bin transfer நிரூபணம் மிக நெருக்கமாக ஒத்திருந்தது: 85.5 GB, 3,143.3 s (52.4 நிமிடம்), 805,108-பைட் நிரூபணம் — இரண்டு நிரூபணங்களும் ஒரே பொது வெளியீட்டுச் சொற்களைக் கொண்டுள்ளன; இது உண்மையான நிரூபிப்பானில் இரண்டும் சமமாக இருப்பதை உறுதிப்படுத்துகிறது. approve (அடுக்கு 16, மாற்றப்பட்டது) மிகக் குறைந்த செலவுடையது: 21.7 GB, 786.7 s (13.1 நிமிடம்), 798,930-பைட் நிரூபணம். ஓர் அழைப்பைச் சிறிய அடுக்குக்குக் கொண்டுவரும்போது மட்டுமே மாற்றம் நிரூபணச் செலவைக் குறைக்கிறது.
  • சங்கிலி bytecode-ஐப் பதிவு செய்வதில்லை. பிறர் hc-ஐ மீண்டும் உருவாக்க முடியும்படி அதை வெளியிடுங்கள்.

fullnode கமிட் c0878c3f (சங்கிலி 21), மற்றும் 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 உடன் 2026-10-12 அன்று இறுதியாகச் சரிபார்க்கப்பட்டது. நிரலும் இந்தப் பக்கமும் முரண்படும் இடங்களில் நிரலே சரியானது; எங்களுக்குத் தெரிவியுங்கள்.