Summary
evmone-t8n returns CHAINID = 1 even when run with a different --state.chainid.
The same tx/env/alloc produces different post-state vs geth evm t8n when the contract executes CHAINID.
Reproducer (Cancun, chain id = 2)
alloc.json
{
"0x095e7baea6a6c7c4c2dfeb977efac326af552d87": {
"code": "0x4660005500",
"nonce": "0x0",
"balance": "0x0",
"storage": {}
},
"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": {
"code": "0x",
"nonce": "0x0",
"balance": "0xde0b6b3a7640000",
"storage": {}
}
}
env.json
{
"currentCoinbase": "0x8888f1f195afa192cfee860698584c030f4c9db1",
"currentNumber": "0x01",
"currentTimestamp": "0x54c99069",
"currentGasLimit": "0x2fefd8",
"currentRandom": "0x0000000000000000000000000000000000000000000000000000000000000001",
"parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
"currentBaseFee": "0x1",
"currentExcessBlobGas": "0x0",
"withdrawals": []
}
txs.json
[
{
"chainId": "0x2",
"gas": "0x186a0",
"gasPrice": "0x1",
"hash": "0x0c22569888cd0d60438efe2aa73f0432747521c0b00ae6d23438460a3472b6fd",
"input": "0x",
"nonce": "0x0",
"r": "0x4b2e52f9747df7f24e93ee6f19a920dcf6bab9696cabf27c5e662f5cbf2baf4d",
"s": "0x6d2be974c69cbcf0965c2e69bc02300702575bcd6ee3c21abe2a84aad25a4eac",
"sender": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
"to": "0x095e7baea6a6c7c4c2dfeb977efac326af552d87",
"v": "0x27",
"value": "0x0"
}
]
Commands
# evmone
evmone-t8n \
--state.fork Cancun --state.chainid 2 \
--input.alloc alloc.json --input.env env.json --input.txs txs.json \
--output.basedir out-evmone --output.result result.json --output.alloc alloc.json
# geth
evm t8n \
--state.fork Cancun --state.chainid 2 \
--input.alloc alloc.json --input.env env.json --input.txs txs.json \
--output.basedir out-geth --output.result result.json --output.alloc alloc.json
Observed divergence
txRoot and receiptsRoot match.
stateRoot differs:
- evmone:
0x37bdda8f0c6377867644e4dca47b1a57e529c3b0f16cdef6d15e6674fff411ee
- geth:
0xa15bdc8810f73f3f6831d201a3b01a7fe3fc31f56593fb94c30bb2272a4ff1de
- Contract storage slot
0x0 after execution:
- evmone:
...0001
- geth:
...0002
Control: with --state.chainid 1 and a chain-1 tx, both clients agree and store ...0001.
Suspected root cause
In evmone test host tx context:
test/state/host.cpp sets chain id to a hardcoded 0x01_bytes32 in get_tx_context().
So CHAINID opcode does not reflect configured chain id.
For reference, geth CHAINID uses chain configuration:
core/vm/eips.go: opChainID pushes evm.chainConfig.ChainID.
Summary
evmone-t8nreturnsCHAINID = 1even when run with a different--state.chainid.The same tx/env/alloc produces different post-state vs geth
evm t8nwhen the contract executesCHAINID.Reproducer (Cancun, chain id = 2)
alloc.json{ "0x095e7baea6a6c7c4c2dfeb977efac326af552d87": { "code": "0x4660005500", "nonce": "0x0", "balance": "0x0", "storage": {} }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "code": "0x", "nonce": "0x0", "balance": "0xde0b6b3a7640000", "storage": {} } }env.json{ "currentCoinbase": "0x8888f1f195afa192cfee860698584c030f4c9db1", "currentNumber": "0x01", "currentTimestamp": "0x54c99069", "currentGasLimit": "0x2fefd8", "currentRandom": "0x0000000000000000000000000000000000000000000000000000000000000001", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", "currentBaseFee": "0x1", "currentExcessBlobGas": "0x0", "withdrawals": [] }txs.json[ { "chainId": "0x2", "gas": "0x186a0", "gasPrice": "0x1", "hash": "0x0c22569888cd0d60438efe2aa73f0432747521c0b00ae6d23438460a3472b6fd", "input": "0x", "nonce": "0x0", "r": "0x4b2e52f9747df7f24e93ee6f19a920dcf6bab9696cabf27c5e662f5cbf2baf4d", "s": "0x6d2be974c69cbcf0965c2e69bc02300702575bcd6ee3c21abe2a84aad25a4eac", "sender": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", "to": "0x095e7baea6a6c7c4c2dfeb977efac326af552d87", "v": "0x27", "value": "0x0" } ]Commands
Observed divergence
txRootandreceiptsRootmatch.stateRootdiffers:0x37bdda8f0c6377867644e4dca47b1a57e529c3b0f16cdef6d15e6674fff411ee0xa15bdc8810f73f3f6831d201a3b01a7fe3fc31f56593fb94c30bb2272a4ff1de0x0after execution:...0001...0002Control: with
--state.chainid 1and a chain-1 tx, both clients agree and store...0001.Suspected root cause
In evmone test host tx context:
test/state/host.cppsets chain id to a hardcoded0x01_bytes32inget_tx_context().So CHAINID opcode does not reflect configured chain id.
For reference, geth CHAINID uses chain configuration:
core/vm/eips.go:opChainIDpushesevm.chainConfig.ChainID.