igneum/docs/build/compatibility.md

9.4 KiB
Raw Blame History

Compatibility, measured

A GPU-secured network for Ethereum-compatible applications and verifiable computation. Compatibility is a product deliverable here, not a sentence: every row below is a test that ran against the devnet from the repository (tools/reference-apps/compat/run.mjs), with its evidence, and a row that could not run says so and why. Devnet, no value.

Last run: 2026-10-08 17:45 UTC on igneum-devnet-4 (chain id 4465), run id ra-20261008T1744-evm. 22 passed, 0 failed, 0 untested. Sender 0x27C433aE…, contracts compiled with solc 0.8.28+commit.7893614a.Emscripten.clang.

Three boundaries hold for everything on this page: proven execution is not finality; EVM compatibility is not Ethereum security; ZK is not privacy. The four words included, executed, proven and finalised are defined on /receipt.

Representative contracts (register case EVM-05)

Row Verdict What was measured Evidence
an ERC-20 deploys (CREATE address as Ethereum computes it, code at the address) passed at 0xd93f5e2091ccd544757a38ecf5e4fa176c141b62, block 3016, gas 436751 of 639078 estimated tx 0x314c059b…a679, address 0xd93f5e2091ccd544757a38ecf5e4fa176c141b62, block 3016, gasUsed 436751, estimated 639078
ERC-20 transfer: balances move, the Transfer log decodes, eth_call reads the new balance passed 5 CTT to 0x00000000, log decoded, balance read tx 0xd8dbd034…15ce, block 3018
ERC-20 approve then transferFrom by a spender (the sender approves itself as spender): allowance consumed, logs decode passed allowance 3 then 1 after transferFrom of 2 approve 0x570bbe86…52c8, transferFrom 0xe6031b34…cd5f
a probe contract deploys (counter, block context reader, revert, out-of-gas loop, CREATE2) passed at 0xc4de4cf5766650a5c029fa908e3eb9270a19ed7d tx 0x97e39c81…bdfa, address 0xc4de4cf5766650a5c029fa908e3eb9270a19ed7d, block 3026
a counter increments twice and reads 2 (state persists across chain blocks) passed count 2 after blocks 3029 and 3032 first 0x1771f03c…cd3a, second 0xad3f6594…c013

Transaction binding and replay (register case EVM-02)

Row Verdict What was measured Evidence
a transaction signed for another chain id (the previous devnet's 4464) is refused by the node passed refused: wrong chain id: expected 4465, got Some(4464) chain_id_signed 4464
the same signed transaction sent twice: the second send is refused (nonce already used) passed first send mined in block 3049; the replay refused: nonce too low: account nonce is 40, transaction has 39 tx 0xb1722ee0…a36f, block 3049, nonce_after 40

Wallet fee estimation (register case EVM-03)

Row Verdict What was measured Evidence
eth_gasPrice, eth_maxPriorityFeePerGas and eth_feeHistory answer in Ethereum's shapes passed gasPrice 196.130804856 gwei, priority 1 gwei, feeHistory 5 base fees gasPrice 0x2daa4e9478, maxPriorityFeePerGas 0x3b9aca00
a plain transfer: eth_estimateGas against the receipt's gasUsed (the quote folds proving gas; both above Ethereum's 21,000) passed estimated 59650, used 21000 (35% of the estimate); Ethereum's figure is 21,000 tx 0x6e67cf09…c795, estimated 59650, gasUsed 21000, ethereum 21000
a contract call: eth_estimateGas against gasUsed (a wallet that quotes from the node is covered) passed estimated 134366, used 26371 tx 0xc14d3a76…31c6, estimated 134366, gasUsed 26371
the documented difference: a transfer sent with a local 21,000 gas limit (Ethereum's intrinsic cost) instead of the node's quote passed the node accepted it and it succeeded with gasUsed 21000: a wallet with a hard-coded 21,000 works sent true, hash 0x1581f608…2c32, status success, gasUsed 21000

Indexing (register case EVM-06)

Row Verdict What was measured Evidence
eth_getLogs by address, by topic and by block range returns the receipts' logs with consistent logIndex and transactionIndex passed 4 logs by address, 3 Transfer logs by topic, each found in its receipt byAddress 4, byTopic 3, fromBlock 3016
eth_getBlockByNumber with full transactions, eth_getBlockReceipts and eth_getTransactionByHash agree on indices and hashes passed block 3018: 1 transactions, indices 0 to 0 continuous block 3018, count 1

Failed transactions (register case EVM-05)

Row Verdict What was measured Evidence
a revert with a reason: eth_call returns the reason, the sent transaction has status 0, gas is charged, the nonce advances passed eth_call answers code 3 "execution reverted" with Error(string) data decoding to "compat says no"; the sent transaction: status 0, gasUsed 22292 of 200000, nonce 37 to 38 tx 0x90e50327…1344, gasUsed 22292, block 3044, call_error_code 3, call_error_message execution reverted, revert_data 0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e636f6d7061742073617973206e6f000000000000000000000000000000000000
an out-of-gas call: status 0 and the whole limit charged passed status 0, gasUsed 150000 of the 150000 limit tx 0x4d138920…e5f0, gasUsed 150000, limit 150000

Receipts (register case EVM-06)

Row Verdict What was measured Evidence
a receipt carries every Ethereum field, logsBloom recomputes from its logs, contractAddress is set on creation passed 15 fields, bloom recomputed over 1 log(s), contractAddress 0xd93f5e20 tx 0x314c059b…a679
the block's receipts rebuild its receipts trie root (Ethereum's layout, the node's encoding) equal to the header's receiptsRoot passed block 3018, 1 receipts, root 0xc443c3e57c60 block 3018, receipts 1, receiptsRoot 0xc443c3e5…8836

Application assumptions (register case EVM-04)

Row Verdict What was measured Evidence
block.number, timestamp, chainid, basefee and blockhash(number-1) read from a contract match the block the call executed in passed block 3053: number, timestamp, chainid 4465, basefee, blockhash(n-1) = parentHash, msg.sender and tx.origin all match tx 0x186def3b…a228, block 3053
CREATE2 lands at the address Ethereum computes (keccak(0xff, deployer, salt, keccak(initcode))) passed child at 0xe3bC69915FB7318236c5ff31EF679aF6ae5b8699 tx 0x442569b2…af11, address 0xe3bC69915FB7318236c5ff31EF679aF6ae5b8699

Differences: block context (register case EVM-04)

Row Verdict What was measured Evidence
block.coinbase is the miner of the DAG block that first included the transaction, not one miner per chain block (measured: coinbase against the block's igneum.mergeset) passed coinbase 0x1450a9d8 = the including block's miner 0x1450a9d8; the chain block merged 1 block(s) with 1 distinct miner(s), chain block miner 0x1450a9d8 tx 0x186def3b…a228, coinbase 0x1450a9d804D29084d34b93afB001dE807Aa9920d, includingMiner 0x1450a9d804d29084d34b93afb001de807aa9920d, chainBlockMiner 0x1450a9d804d29084d34b93afb001de807aa9920d

Differences: randomness (register case EVM-04)

Row Verdict What was measured Evidence
block.prevrandao: its value is derived from the chain's epoch seed (not Ethereum's beacon RANDAO); measured across consecutive blocks, and from a contract when a sender is funded passed blocks 3051 to 3054: 1 distinct epoch seed(s), 4 distinct mixHash value(s) in the headers; the source is the chain's epoch seed, which holds for an epoch, so prevrandao is not fresh per block and must not seed a lottery; a contract reading it twice in one call got the same value, and at block 3053 it read 0x3b9abd95a495…

Differences: two-dimensional fees (register case EVM-03)

Row Verdict What was measured Evidence
a receipt carries pgasUsed, provingBaseFeePerGas, burnedProvingFee and burnedExecutionBaseFee; effectiveGasPrice covers both dimensions passed gasUsed 51375, pgasUsed 1968, proving base fee 10000 gwei per pgas; paid 5188875000000000 wei, of which proving burn 19680000000000000, execution burn 5137500000000000, tip 41100000000000 (parts sum differs from gasUsed × effectiveGasPrice) tx 0xd8dbd034…15ce, gasUsed 51375, pgasUsed 1968, effectiveGasPrice 0x178411b200, parts_equal_paid false

What the differences mean for an application

  • Block context: block.coinbase is the miner of the DAG block that first included the transaction, so one chain block can carry transactions with different coinbases; code that pays or trusts block.coinbase as "the block producer" sees several producers per block.
  • Randomness: block.prevrandao derives from the chain's epoch seed and holds for an epoch, so it is not fresh per block and must not seed a lottery or a commitment; use an application-level randomness source.
  • Two-dimensional fees: every transaction pays execution gas and proving gas; the node folds the second into the gas it quotes, so a wallet that quotes from the node (eth_estimateGas, eth_gasPrice, eth_feeHistory) is covered and a wallet with Ethereum's constants (21,000 for a transfer) is not; the receipt carries the split under igneum (pgasUsed, provingBaseFeePerGas, burnedProvingFee, burnedExecutionBaseFee, minerTip).

Source: tools/reference-apps/compat/run.mjs (the rows), tools/reference-apps/compat/results.json (the evidence), docs/build/compatibility.md (this page, rendered by render.mjs).