diff --git a/packages/client/test/blockchainEngine.spec.ts b/packages/client/test/blockchainEngine.spec.ts new file mode 100644 index 00000000000..eb587fbf908 --- /dev/null +++ b/packages/client/test/blockchainEngine.spec.ts @@ -0,0 +1,972 @@ +import { createBlock } from '@ethereumjs/block' +import { EthashConsensus, createBlockchain } from '@ethereumjs/blockchain' +import { + Common, + ConsensusAlgorithm, + Hardfork, + Mainnet, + createCustomCommon, + parseGethGenesis, +} from '@ethereumjs/common' +import { Ethash } from '@ethereumjs/ethash' +import { + type EVMBLSInterface, + type EVMBN254Interface, + MCLBLS, + NobleBLS, + NobleBN254, + RustBN254, +} from '@ethereumjs/evm' +import { MerklePatriciaTrie } from '@ethereumjs/mpt' +import { Caches, MerkleStateManager, StatefulVerkleStateManager } from '@ethereumjs/statemanager' +import { + Account, + Address, + MapDB, + bigIntToBytes, + bytesToHex, + createPartialAccount, + hexToBytes, + isHexString, + setLengthLeft, + stripHexPrefix, + toBytes, +} from '@ethereumjs/util' +import { createVerkleTree } from '@ethereumjs/verkle' +import { createVM } from '@ethereumjs/vm' +import { trustedSetup } from '@paulmillr/trusted-setups/fast.js' +import { keccak256 } from 'ethereum-cryptography/keccak' +import * as mcl from 'mcl-wasm' +import { KZG as microEthKZG } from 'micro-eth-signer/kzg' +import * as verkle from 'micro-eth-signer/verkle' +import * as minimist from 'minimist' +import { initRustBN } from 'rustbn-wasm' +import { assert, describe, it } from 'vitest' + +import type { ConsensusDict } from '@ethereumjs/blockchain' +import type { HardforkTransitionConfig, StateManagerInterface } from '@ethereumjs/common' +import type { KZG } from '@ethereumjs/util' +import type { VerkleTree } from '@ethereumjs/verkle' +import { createClient, createManager, getRPCClient, setupChain, startRPC } from './rpc/helpers.js' +import { VMExecution } from '../src/execution/vmexecution.js' +import { Chain } from '../src/blockchain/chain.js' +import { getLogger } from '../src/logging.js' +import { Config } from '../src/config.js' +import { Skeleton } from '../src/service/skeleton.js' +import { MemoryLevel } from 'memory-level' +import { postMergeData } from './testdata/geth-genesis/post-merge.js' + +const argv = minimist.default(process.argv.slice(2)) + +const data = { + network: 'Prague', + genesisBlockHeader: { + parentHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + uncleHash: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + coinbase: '0x0000000000000000000000000000000000000000', + stateRoot: '0x5e5fc7fb30faa5cdc163023c4ce2dc8807601ec858dd2905738dad824d0a21ce', + transactionsTrie: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + receiptTrie: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + bloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + difficulty: '0x00', + number: '0x00', + gasLimit: '0x016345785d8a0000', + gasUsed: '0x00', + timestamp: '0x00', + extraData: '0x00', + mixHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + nonce: '0x0000000000000000', + baseFeePerGas: '0x07', + withdrawalsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + blobGasUsed: '0x00', + excessBlobGas: '0x00', + parentBeaconBlockRoot: '0x0000000000000000000000000000000000000000000000000000000000000000', + requestsHash: '0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', + hash: '0x4d08f35fa6e7bdb5d73b447b0fa5071e389788f2ffab13ed668b49dfb5bf6bd3', + }, + pre: { + '0x00000000219ab540356cbb839cbe05303d7705fa': { + nonce: '0x01', + balance: '0x00', + code: '0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033', + storage: { + '0x22': '0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b', + '0x23': '0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71', + '0x24': '0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c', + '0x25': '0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c', + '0x26': '0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30', + '0x27': '0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1', + '0x28': '0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c', + '0x29': '0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193', + '0x2a': '0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1', + '0x2b': '0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b', + '0x2c': '0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220', + '0x2d': '0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f', + '0x2e': '0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e', + '0x2f': '0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784', + '0x30': '0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb', + '0x31': '0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb', + '0x32': '0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab', + '0x33': '0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4', + '0x34': '0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f', + '0x35': '0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa', + '0x36': '0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c', + '0x37': '0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167', + '0x38': '0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7', + '0x39': '0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0', + '0x3a': '0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544', + '0x3b': '0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765', + '0x3c': '0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4', + '0x3d': '0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1', + '0x3e': '0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636', + '0x3f': '0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c', + '0x40': '0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7', + }, + }, + '0x00000961ef480eb55e80d19ad83579a64c007002': { + nonce: '0x01', + balance: '0x00', + code: '0x3373fffffffffffffffffffffffffffffffffffffffe1460cb5760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146101f457600182026001905f5b5f82111560685781019083028483029004916001019190604d565b909390049250505036603814608857366101f457346101f4575f5260205ff35b34106101f457600154600101600155600354806003026004013381556001015f35815560010160203590553360601b5f5260385f601437604c5fa0600101600355005b6003546002548082038060101160df575060105b5f5b8181146101835782810160030260040181604c02815460601b8152601401816001015481526020019060020154807fffffffffffffffffffffffffffffffff00000000000000000000000000000000168252906010019060401c908160381c81600701538160301c81600601538160281c81600501538160201c81600401538160181c81600301538160101c81600201538160081c81600101535360010160e1565b910180921461019557906002556101a0565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14156101cd57505f5b6001546002828201116101e25750505f6101e8565b01600290035b5f555f600155604c025ff35b5f5ffd', + storage: {}, + }, + '0x0000bbddc7ce488642fb579f8b00f3a590007251': { + nonce: '0x01', + balance: '0x00', + code: '0x3373fffffffffffffffffffffffffffffffffffffffe1460d35760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461019a57600182026001905f5b5f82111560685781019083028483029004916001019190604d565b9093900492505050366060146088573661019a573461019a575f5260205ff35b341061019a57600154600101600155600354806004026004013381556001015f358155600101602035815560010160403590553360601b5f5260605f60143760745fa0600101600355005b6003546002548082038060021160e7575060025b5f5b8181146101295782810160040260040181607402815460601b815260140181600101548152602001816002015481526020019060030154905260010160e9565b910180921461013b5790600255610146565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff141561017357505f5b6001546001828201116101885750505f61018e565b01600190035b5f555f6001556074025ff35b5f5ffd', + storage: {}, + }, + '0x0000f90827f1c53a10cb7a02335b175320002935': { + nonce: '0x01', + balance: '0x00', + code: '0x3373fffffffffffffffffffffffffffffffffffffffe14604657602036036042575f35600143038111604257611fff81430311604257611fff9006545f5260205ff35b5f5ffd5b5f35611fff60014303065500', + storage: {}, + }, + '0x000f3df6d732807ef1319fb7b8bb8522d0beac02': { + nonce: '0x01', + balance: '0x00', + code: '0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500', + storage: {}, + }, + '0x0000000000000000000000000000000000001000': { + nonce: '0x01', + balance: '0x00', + code: '0x366000600037600060003660006000600b610177f26000553d6001553d600060003e3d600020600255', + storage: {}, + }, + '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b': { + nonce: '0x00', + balance: '0x0de0b6b3a7640000', + code: '0x', + storage: {}, + }, + }, + postState: { + '0x00000000219ab540356cbb839cbe05303d7705fa': { + nonce: '0x01', + balance: '0x00', + code: '0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033', + storage: { + '0x22': '0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b', + '0x23': '0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71', + '0x24': '0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c', + '0x25': '0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c', + '0x26': '0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30', + '0x27': '0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1', + '0x28': '0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c', + '0x29': '0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193', + '0x2a': '0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1', + '0x2b': '0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b', + '0x2c': '0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220', + '0x2d': '0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f', + '0x2e': '0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e', + '0x2f': '0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784', + '0x30': '0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb', + '0x31': '0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb', + '0x32': '0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab', + '0x33': '0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4', + '0x34': '0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f', + '0x35': '0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa', + '0x36': '0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c', + '0x37': '0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167', + '0x38': '0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7', + '0x39': '0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0', + '0x3a': '0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544', + '0x3b': '0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765', + '0x3c': '0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4', + '0x3d': '0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1', + '0x3e': '0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636', + '0x3f': '0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c', + '0x40': '0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7', + }, + }, + '0x00000961ef480eb55e80d19ad83579a64c007002': { + nonce: '0x01', + balance: '0x00', + code: '0x3373fffffffffffffffffffffffffffffffffffffffe1460cb5760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146101f457600182026001905f5b5f82111560685781019083028483029004916001019190604d565b909390049250505036603814608857366101f457346101f4575f5260205ff35b34106101f457600154600101600155600354806003026004013381556001015f35815560010160203590553360601b5f5260385f601437604c5fa0600101600355005b6003546002548082038060101160df575060105b5f5b8181146101835782810160030260040181604c02815460601b8152601401816001015481526020019060020154807fffffffffffffffffffffffffffffffff00000000000000000000000000000000168252906010019060401c908160381c81600701538160301c81600601538160281c81600501538160201c81600401538160181c81600301538160101c81600201538160081c81600101535360010160e1565b910180921461019557906002556101a0565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14156101cd57505f5b6001546002828201116101e25750505f6101e8565b01600290035b5f555f600155604c025ff35b5f5ffd', + storage: {}, + }, + '0x0000bbddc7ce488642fb579f8b00f3a590007251': { + nonce: '0x01', + balance: '0x00', + code: '0x3373fffffffffffffffffffffffffffffffffffffffe1460d35760115f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1461019a57600182026001905f5b5f82111560685781019083028483029004916001019190604d565b9093900492505050366060146088573661019a573461019a575f5260205ff35b341061019a57600154600101600155600354806004026004013381556001015f358155600101602035815560010160403590553360601b5f5260605f60143760745fa0600101600355005b6003546002548082038060021160e7575060025b5f5b8181146101295782810160040260040181607402815460601b815260140181600101548152602001816002015481526020019060030154905260010160e9565b910180921461013b5790600255610146565b90505f6002555f6003555b5f54807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff141561017357505f5b6001546001828201116101885750505f61018e565b01600190035b5f555f6001556074025ff35b5f5ffd', + storage: {}, + }, + '0x0000f90827f1c53a10cb7a02335b175320002935': { + nonce: '0x01', + balance: '0x00', + code: '0x3373fffffffffffffffffffffffffffffffffffffffe14604657602036036042575f35600143038111604257611fff81430311604257611fff9006545f5260205ff35b5f5ffd5b5f35611fff60014303065500', + storage: { + '0x00': '0x4d08f35fa6e7bdb5d73b447b0fa5071e389788f2ffab13ed668b49dfb5bf6bd3', + }, + }, + '0x000f3df6d732807ef1319fb7b8bb8522d0beac02': { + nonce: '0x01', + balance: '0x00', + code: '0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500', + storage: { + '0x03e8': '0x03e8', + }, + }, + '0x0000000000000000000000000000000000001000': { + nonce: '0x01', + balance: '0x00', + code: '0x366000600037600060003660006000600b610177f26000553d6001553d600060003e3d600020600255', + storage: { + '0x00': '0x01', + '0x01': '0x80', + '0x02': '0x012893657d8eb2efad4de0a91bcd0e39ad9837745dec3ea923737ea803fc8e3d', + }, + }, + '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b': { + nonce: '0x01', + balance: '0x0de0b6b3a7566c92', + code: '0x', + storage: {}, + }, + '0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba': { + nonce: '0x00', + balance: '0x0412a1', + code: '0x', + storage: {}, + }, + }, + lastblockhash: '0x215dabff3aeca73ad3a91d2c202a3fe55b990ca12a0e7c5eed37c3ece6d4bb53', + config: { + network: 'Prague', + blobSchedule: { + Cancun: { + target: '0x03', + max: '0x06', + baseFeeUpdateFraction: '0x32f0ed', + }, + Prague: { + target: '0x06', + max: '0x09', + baseFeeUpdateFraction: '0x4c6964', + }, + }, + }, + engineNewPayloads: [ + { + params: [ + { + parentHash: '0x4d08f35fa6e7bdb5d73b447b0fa5071e389788f2ffab13ed668b49dfb5bf6bd3', + feeRecipient: '0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba', + stateRoot: '0x282eb81dfedd9a699b7b7acc15f7ab1207183bc5c26b9b1be63c4e9871e4b05e', + receiptsRoot: '0x2ed7caa9dbce5434ab4c524feafcfc95dbdc87cf8cc36d000f52f0903f453a97', + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + blockNumber: '0x1', + gasLimit: '0x16345785d8a0000', + gasUsed: '0x15b8b', + timestamp: '0x3e8', + extraData: '0x00', + prevRandao: '0x0000000000000000000000000000000000000000000000000000000000000000', + baseFeePerGas: '0x7', + blobGasUsed: '0x0', + excessBlobGas: '0x0', + blockHash: '0x215dabff3aeca73ad3a91d2c202a3fe55b990ca12a0e7c5eed37c3ece6d4bb53', + transactions: [ + '0xf90162800a839897f794000000000000000000000000000000000000100080b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026a0a3ce34fee9f8402e9df4c5879044529c158b748a14b14321dae21ff7e0c7a330a0293d06bee05d529ed54f07c0dc19753b82caefd8e4d4523011b81e2e3cb29da3', + ], + withdrawals: [], + }, + [], + '0x0000000000000000000000000000000000000000000000000000000000000000', + [], + ], + newPayloadVersion: '4', + forkchoiceUpdatedVersion: '3', + }, + ], + _info: { + hash: '0x46676858157d57d5c111fa4714356cfbe3771bf2c2c86089d5e174e70f05b207', + comment: '`execution-spec-tests` generated test', + 'filling-transition-tool': 'ethereum-spec-evm-resolver 0.0.5', + description: + 'Test function documentation:\nTest the BLS12_G1ADD precompile using different call types.', + url: 'https://github.com/ethereum/execution-spec-tests/blob/pectra-devnet-6@v1.0.0/tests/prague/eip2537_bls_12_381_precompiles/test_bls12_g1add.py#L200', + fixture_format: 'blockchain_test_engine', + 'reference-spec': 'https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2537.md', + 'reference-spec-version': 'cd0f016ad0c4c68b8b1f5c502ef61ab9353b6e5e', + 'eels-resolution': { + 'git-url': 'https://github.com/ethereum/execution-specs.git', + branch: 'devnets/prague/6', + commit: 'fa33d824decac0a6ac55adc943e7f139b0719f0e', + }, + }, +} + +const transitionNetworks = { + ByzantiumToConstantinopleFixAt5: { + byzantium: 0, + constantinople: 5, + petersburg: 5, + dao: null, + finalSupportedFork: 'petersburg', + startFork: 'byzantium', + }, + EIP158ToByzantiumAt5: { + spuriousDragon: 0, + byzantium: 5, + dao: null, + finalSupportedFork: 'byzantium', + startFork: 'spuriousDragon', + }, + FrontierToHomesteadAt5: { + chainstart: 0, + homestead: 5, + dao: null, + finalSupportedFork: 'homestead', + startFork: 'chainstart', + }, + HomesteadToDaoAt5: { + homestead: 0, + dao: 5, + finalSupportedFork: 'dao', + startFork: 'homestead', + }, + HomesteadToEIP150At5: { + homestead: 0, + tangerineWhistle: 5, + dao: null, + finalSupportedFork: 'tangerineWhistle', + startFork: 'homestead', + }, + BerlinToLondonAt5: { + berlin: 0, + london: 5, + dao: null, + finalSupportedFork: 'london', + startFork: 'berlin', + }, +} + +const retestethAlias = { + Frontier: 'chainstart', + EIP150: 'tangerineWhistle', + EIP158: 'spuriousDragon', + ConstantinopleFix: 'petersburg', + Merge: 'paris', +} + +const normalHardforks = [ + 'chainstart', + 'homestead', + 'dao', + 'tangerineWhistle', + 'spuriousDragon', + 'byzantium', + 'constantinople', + 'petersburg', + 'istanbul', + 'muirGlacier', + 'berlin', + 'london', + 'paris', + 'shanghai', + 'arrowGlacier', // This network has no tests, but need to add it due to common generation logic + 'cancun', + 'prague', + 'osaka', + 'verkle', +] + +/** + * Returns an alias for specified hardforks to meet test dependencies requirements/assumptions. + * @param {String} forkConfig - the name of the hardfork for which an alias should be returned + * @returns {String} Either an alias of the forkConfig param, or the forkConfig param itself + */ +function getRequiredForkConfigAlias(forkConfig: string) { + const indexOfPlus = forkConfig.indexOf('+') + const remainder = indexOfPlus !== -1 ? forkConfig.substring(indexOfPlus) : '' + // Chainstart is also called Frontier and is called as such in the tests + if (String(forkConfig).match(/^chainstart$/i)) { + return 'Frontier' + remainder + } + // TangerineWhistle is named EIP150 (attention: misleading name) + // in the client-independent consensus test suite + if (String(forkConfig).match(/^tangerineWhistle$/i)) { + return 'EIP150' + remainder + } + // SpuriousDragon is named EIP158 (attention: misleading name) + // in the client-independent consensus test suite + if (String(forkConfig).match(/^spuriousDragon$/i)) { + return 'EIP158' + remainder + } + // Run the Istanbul tests for MuirGlacier since there are no dedicated tests + if (String(forkConfig).match(/^muirGlacier/i)) { + return 'Istanbul' + remainder + } + // Petersburg is named ConstantinopleFix + // in the client-independent consensus test suite + if (String(forkConfig).match(/^petersburg$/i)) { + return 'ConstantinopleFix' + remainder + } + return forkConfig +} + +function format(a: any, toZero: boolean = false, isHex: boolean = false): Uint8Array { + if (a === '') { + return new Uint8Array() + } + + if (typeof a === 'string' && isHexString(a)) { + a = a.slice(2) + if (a.length % 2) a = '0' + a + a = hexToBytes(`0x${a}`) + } else if (!isHex) { + try { + a = bigIntToBytes(BigInt(a)) + } catch { + // pass + } + } else { + if (a.length % 2) a = '0' + a + a = hexToBytes(`0x${a}`) + } + + if (toZero && bytesToHex(a) === '0x') { + a = Uint8Array.from([0]) + } + + return a +} +/** + * setupPreConditions given JSON testData + * @param state - the state DB/trie + * @param testData - JSON from tests repo + */ +async function setupPreConditions(state: StateManagerInterface, testData: any) { + await state.checkpoint() + for (const addressStr of Object.keys(testData.pre)) { + const { nonce, balance, code, storage } = testData.pre[addressStr] + + const addressBuf = format(addressStr) + const address = new Address(addressBuf) + await state.putAccount(address, new Account()) + + const codeBuf = format(code) + const codeHash = keccak256(codeBuf) + + // Set contract storage + for (const storageKey of Object.keys(storage)) { + const val = format(storage[storageKey]) + if (['0x', '0x00'].includes(bytesToHex(val))) { + continue + } + const key = setLengthLeft(format(storageKey), 32) + await state.putStorage(address, key, val) + } + + // Put contract code + await state.putCode(address, codeBuf) + + const storageRoot = (await state.getAccount(address))!.storageRoot + + if (testData.exec?.address === addressStr) { + testData.root(storageRoot) + } + + // Put account data + const account = createPartialAccount({ + nonce, + balance, + codeHash, + storageRoot, + codeSize: codeBuf.byteLength, + }) + await state.putAccount(address, account) + } + await state.commit() +} + +/** + * Setups the common with networks + * @param network Network target (this can include EIPs, such as Byzantium+2537+2929) + * @param ttd If set: total terminal difficulty to switch to merge + * @returns + */ +function setupCommonWithNetworks(network: string, ttd?: number, timestamp?: number, kzg?: KZG) { + let networkLowercase: string // This only consists of the target hardfork, so without the EIPs + if (network.includes('+')) { + const index = network.indexOf('+') + networkLowercase = network.slice(0, index).toLowerCase() + } else { + networkLowercase = network.toLowerCase() + } + // normal hard fork, return the common with this hard fork + // find the right upper/lowercased version + const hfName = normalHardforks.reduce((previousValue, currentValue) => + currentValue.toLowerCase() === networkLowercase ? currentValue : previousValue, + ) + const mainnetCommon = new Common({ chain: Mainnet, hardfork: hfName }) + const hardforks = mainnetCommon.hardforks() + const testHardforks: HardforkTransitionConfig[] = [] + for (const hf of hardforks) { + // check if we enable this hf + // disable dao hf by default (if enabled at block 0 forces the first 10 blocks to have dao-hard-fork in extraData of block header) + if (mainnetCommon.gteHardfork(hf.name) && hf.name !== Hardfork.Dao) { + // this hardfork should be activated at block 0 + testHardforks.push({ + name: hf.name, + // Current type definition Partial in Common is currently not allowing to pass in forkHash + // forkHash: hf.forkHash, + block: 0, + }) + } else { + // disable hardforks newer than the test hardfork (but do add "support" for it, it just never gets activated) + if ( + (ttd === undefined && timestamp === undefined) || + (hf.name === 'paris' && ttd !== undefined) + ) { + testHardforks.push({ + name: hf.name, + block: null, + }) + } + if (timestamp !== undefined && hf.name !== Hardfork.Dao) { + testHardforks.push({ + name: hf.name, + block: null, + timestamp, + }) + } + } + } + const common = createCustomCommon( + { + hardforks: testHardforks, + defaultHardfork: hfName, + }, + Mainnet, + { eips: [3607], customCrypto: { kzg } }, + ) + // Activate EIPs + const eips = network.match(/(?<=\+)(.\d+)/g) + if (eips) { + common.setEIPs(eips.map((e: string) => parseInt(e))) + } + return common +} + +/** + * Returns a common instance configured for verkle + * @param network Network target (this can include EIPs, such as Byzantium+2537+2929) + * @param ttd If set: total terminal difficulty to switch to merge + * @returns + */ +function setupCommonForVerkle(network: string, timestamp?: number, kzg?: KZG) { + let ttd + // hard fork that verkle tests are filled on + const hfName = 'shanghai' + const mainnetCommon = new Common({ chain: Mainnet, hardfork: hfName }) + const hardforks = mainnetCommon.hardforks().slice(0, 17) // skip hardforks after Shanghai + const testHardforks: HardforkTransitionConfig[] = [] + for (const hf of hardforks) { + // check if we enable this hf + // disable dao hf by default (if enabled at block 0 forces the first 10 blocks to have dao-hard-fork in extraData of block header) + if (mainnetCommon.gteHardfork(hf.name) && hf.name !== Hardfork.Dao) { + // this hardfork should be activated at block 0 + testHardforks.push({ + name: hf.name, + // Current type definition Partial in Common is currently not allowing to pass in forkHash + // forkHash: hf.forkHash, + block: 0, + }) + } else { + // disable hardforks newer than the test hardfork (but do add "support" for it, it just never gets activated) + if ( + (ttd === undefined && timestamp === undefined) || + (hf.name === 'paris' && ttd !== undefined) + ) { + testHardforks.push({ + name: hf.name, + block: null, + }) + } + if (timestamp !== undefined && hf.name !== Hardfork.Dao) { + testHardforks.push({ + name: hf.name, + block: null, + timestamp, + }) + } + } + } + + testHardforks.push({ name: 'verkle', block: 1 }) + const common = createCustomCommon( + { + hardforks: testHardforks, + defaultHardfork: 'verkle', + }, + Mainnet, + { eips: [2935, 3607], customCrypto: { kzg, verkle } }, + ) + + // Activate EIPs + const eips = network.match(/(?<=\+)(.\d+)/g) + if (eips) { + common.setEIPs(eips.map((e: string) => parseInt(e))) + } + return common +} + +/** + * Returns a Common for the given network (a test parameter) + * @param network - the network field of a test. + * If this network has a `+` sign, it will also include these EIPs. + * For instance, London+3855 will activate the network on the London hardfork, but will also activate EIP 3855. + * Multiple EIPs can also be activated by separating them with a `+` sign. + * For instance, "London+3855+3860" will also activate EIP-3855 and EIP-3860. + * @returns the Common which should be used + */ +function getCommon(network: string, kzg?: KZG): Common { + if (retestethAlias[network as keyof typeof retestethAlias] !== undefined) { + network = retestethAlias[network as keyof typeof retestethAlias] + } + let networkLowercase = network.toLowerCase() + // Special handler for verkle tests + if (networkLowercase.includes('verkle')) { + return setupCommonForVerkle(network, undefined, kzg) + } + if (network.includes('+')) { + const index = network.indexOf('+') + networkLowercase = network.slice(0, index).toLowerCase() + } + if (normalHardforks.map((str) => str.toLowerCase()).includes(networkLowercase)) { + // Case 1: normal network, such as "London" or "Byzantium" (without any EIPs enabled, and it is not a transition network) + return setupCommonWithNetworks(network, undefined, undefined, kzg) + } else if (networkLowercase.match('tomergeatdiff')) { + // Case 2: special case of a transition network, this setups the right common with the right Merge properties (TTD) + // This is a HF -> Merge transition + const start = networkLowercase.match('tomergeatdiff')!.index! + const end = start + 'tomergeatdiff'.length + const startNetwork = network.substring(0, start) // HF before the merge + const TTD = Number('0x' + network.substring(end)) // Total difficulty to transition to PoS + return setupCommonWithNetworks(startNetwork, TTD, undefined, kzg) + } else if (networkLowercase === 'shanghaitocancunattime15k') { + return setupCommonWithNetworks('Shanghai', undefined, 15000, kzg) + } else if (networkLowercase === 'cancuntopragueattime15k') { + return setupCommonWithNetworks('Cancun', undefined, 15000, kzg) + } else { + // Case 3: this is not a "default fork" network, but it is a "transition" network. Test the VM if it transitions the right way + const transitionForks = + network in transitionNetworks + ? transitionNetworks[network as keyof typeof transitionNetworks] + : transitionNetworks[ + (network.charAt(0).toUpperCase() + network.slice(1)) as keyof typeof transitionNetworks + ] + if (transitionForks === undefined) { + throw new Error('network not supported: ' + network) + } + const mainnetCommon = new Common({ + chain: Mainnet, + hardfork: transitionForks.finalSupportedFork, + }) + const hardforks = mainnetCommon.hardforks() + const testHardforks = [] + for (const hf of hardforks) { + if (mainnetCommon.gteHardfork(hf.name)) { + // this hardfork should be activated at block 0 + const forkBlockNumber = transitionForks[hf.name as keyof typeof transitionForks] as + | number + | null + | undefined + testHardforks.push({ + name: hf.name, + block: forkBlockNumber ?? 0, // If hardfork isn't in transitionForks, activate at 0 + }) + } else { + // disable the hardfork + testHardforks.push({ + name: hf.name, + block: null, + }) + } + } + const common = createCustomCommon( + { + hardforks: testHardforks, + }, + Mainnet, + { + hardfork: transitionForks.startFork, + eips: [3607], + customCrypto: { kzg }, + }, + ) + return common + } +} + +function formatBlockHeader(data: any) { + const formatted: any = {} + for (const [key, value] of Object.entries(data) as [string, string][]) { + formatted[key] = isHexString(value) ? value : BigInt(value) + } + return formatted +} + +async function runBlockchainEngineTest(options: any, testData: any) { + // ensure that the test data is the right fork data + // if (testData.network !== options.forkConfigTestSuite) { + // // t.comment(`skipping test: no data available for ${options.forkConfigTestSuite}`) + // return + // } + + // fix for BlockchainTests/GeneralStateTests/stRandom/* + testData.lastblockhash = stripHexPrefix(testData.lastblockhash) + + let common = options.common.copy() as Common + common.setHardforkBy({ blockNumber: 0 }) + + let cacheDB = new MapDB() + let stateTree: MerklePatriciaTrie | VerkleTree + let stateManager: StateManagerInterface + + if (options.stateManager === 'verkle') { + stateTree = await createVerkleTree() + stateManager = new StatefulVerkleStateManager({ + trie: stateTree, + common: options.common, + }) + } else { + stateTree = new MerklePatriciaTrie({ useKeyHashing: true, common }) + stateManager = new MerkleStateManager({ + caches: new Caches(), + trie: stateTree, + common, + }) + } + + let validatePow = false + // Only run with block validation when sealEngine present in test file + // and being set to Ethash PoW validation + if (testData.sealEngine === 'Ethash') { + if (common.consensusAlgorithm() !== ConsensusAlgorithm.Ethash) { + // t.skip('SealEngine setting is not matching chain consensus type, skip test.') + } + validatePow = true + } + + // create and add genesis block + const header = formatBlockHeader(testData.genesisBlockHeader) + const withdrawals = common.isActivatedEIP(4895) ? [] : undefined + const blockData = { header, withdrawals } + const genesisBlock = createBlock(blockData, { common }) + + if (typeof testData.genesisRLP === 'string') { + const rlp = toBytes(testData.genesisRLP) + assert.deepEqual(genesisBlock.serialize(), rlp, 'correct genesis RLP') + } + + const consensusDict: ConsensusDict = {} + consensusDict[ConsensusAlgorithm.Ethash] = new EthashConsensus(new Ethash()) + let blockchain = await createBlockchain({ + common, + validateBlocks: true, + validateConsensus: validatePow, + consensusDict, + genesisBlock, + }) + + if (validatePow) { + ;(blockchain.consensus as EthashConsensus)._ethash!.cacheDB = cacheDB + } + + const begin = Date.now() + + const evmOpts = { + bls: options.bls, + bn254: options.bn254, + } + let vm = await createVM({ + stateManager, + blockchain, + common, + setHardfork: true, + evmOpts, + profilerOpts: { + reportAfterBlock: options.profile, + }, + }) + + // set up pre-state + await setupPreConditions(vm.stateManager, testData) + + assert.deepEqual( + await vm.stateManager.getStateRoot(), + genesisBlock.header.stateRoot, + 'correct pre stateRoot', + ) + + // async function handleError(error: string | undefined, expectException: string | boolean) { + // if (expectException !== false) { + // assert.ok(`Expected exception ${expectException}`) + // } else { + // assert.fail(error) + // } + // } + + console.log(common) + testData.config.blobSchedule = Object.fromEntries( + Object.entries(testData.config.blobSchedule).map(([key, value]) => [key.toLowerCase(), value]), + ) + // const params = parseGethGenesis({...testData.genesisBlockHeader, config: testData.config, alloc: testData.pre}) + // console.log(params) + const { service, server } = await setupChain( + { ...testData.genesisBlockHeader, config: testData.config, alloc: testData.pre }, + 'post-merge', + { engine: true }, + ) + const rpc = getRPCClient(server) + + const config = new Config({ + minerCoinbase: undefined, + common, + accountCache: 10000, + storageCache: 1000, + logger: getLogger({}), + }) + + // const chain = await Chain.create({ config, blockchain }) + // chain.opened = true + + // const execution = new VMExecution({ config, chain }) + // await execution.open() + // const skeleton = new Skeleton({ chain, config, metaDB: new MemoryLevel() }) + + // const client = await createClient({ + // commonChain: common, + // blockchain, + // includeVM: true, + // enableMetaDB: false + // }) + + // client.chain = chain + // client.service.execution = execution + + // const manager = createManager(client) + // const engineMethods = manager.getMethods(true) + // const rpc = getRPCClient(startRPC({ ...manager.getMethods(), ...engineMethods }, {port: 0, wsServer: false})) + + const res = await rpc.request(`engine_newPayloadV4`, testData.engineNewPayloads[0].params) + + console.log(res) + assert.equal( + bytesToHex(blockchain['_headHeaderHash']), + '0x' + testData.lastblockhash, + 'correct last header block', + ) + + const end = Date.now() + const timeSpent = `${(end - begin) / 1000} secs` + // t.comment(`Time: ${timeSpent}`) + + // Explicitly delete objects for memory optimization (early GC) + common = blockchain = stateTree = stateManager = vm = cacheDB = null as any +} + +describe('BlockchainEngine', async () => { + it('Should run test', async () => { + /** + * Default hardfork rules to run tests against + */ + const DEFAULT_FORK_CONFIG = 'Paris' + const FORK_CONFIG: string = argv.fork !== undefined ? argv.fork : DEFAULT_FORK_CONFIG + const FORK_CONFIG_TEST_SUITE = getRequiredForkConfigAlias(FORK_CONFIG) + + // TODO the argument parsing isn't working as expected here, currently hardcoding + // HF to Prague because I can't pass it as -- --fork + // console.log('dbg151') + // console.log(argv) + // console.log(process.argv) + // console.log(process.argv.slice(2)) + + // Examples: Istanbul -> istanbul, MuirGlacier -> muirGlacier + const FORK_CONFIG_VM = FORK_CONFIG.charAt(0).toLowerCase() + FORK_CONFIG.substring(1) + + const RUN_PROFILER: boolean = argv.profile ?? false + + let bls: EVMBLSInterface + if (argv.bls !== undefined && argv.bls.toLowerCase() === 'mcl') { + await mcl.init(mcl.BLS12_381) + bls = new MCLBLS(mcl) + console.log('BLS library used: MCL (WASM)') + } else { + console.log('BLS library used: Noble (JavaScript)') + bls = new NobleBLS() + } + + let bn254: EVMBN254Interface + if (argv.bn254 !== undefined && argv.bn254.toLowerCase() === 'mcl') { + const rustBN = await initRustBN() + bn254 = new RustBN254(rustBN) + console.log('BN254 (alt_BN128) library used: rustbn.js (WASM)') + } else { + console.log('BN254 (alt_BN128) library used: Noble (JavaScript)') + bn254 = new NobleBN254() + } + + const kzg = new microEthKZG(trustedSetup) + + // console.log('dbg150') + // console.log(FORK_CONFIG) + // console.log(FORK_CONFIG_VM) + // console.log(getCommon(FORK_CONFIG_VM, kzg)) + + const runnerArgs: { + forkConfigVM: string + forkConfigTestSuite: string + common: Common + jsontrace?: boolean + dist?: boolean + data?: number + gasLimit?: number + value?: number + debug?: boolean + reps?: number + profile: boolean + bls: EVMBLSInterface + bn254: EVMBN254Interface + stateManager: string + } = { + forkConfigVM: FORK_CONFIG_VM, + forkConfigTestSuite: FORK_CONFIG_TEST_SUITE, + common: getCommon('prague+1559', kzg), + jsontrace: argv.jsontrace, + dist: argv.dist, + debug: argv.debug, // BlockchainTests + reps: argv.reps, // test repetitions + bls, + profile: RUN_PROFILER, + bn254, + stateManager: argv.stateManager, + } + + await runBlockchainEngineTest(runnerArgs, data) + }, 120000) +})