go-ethereum icon indicating copy to clipboard operation
go-ethereum copied to clipboard

all: implement eip-7702 set code tx

Open lightclient opened this issue 1 year ago • 7 comments

Spec: EIP-7702: Set EOA account code

Add a new transaction type that adds a list of [chain_id, address, nonce, y_parity, r, s] authorization tuples. For each tuple, write a delegation designator (0xef0100 ++ address) to the signing account’s code. All code reading operations must load the code pointed to by the designator.

lightclient avatar Jun 26 '24 23:06 lightclient

Should we propose another EIP to revamp EIP158? Otherwise, as we discussed previously, the leftover storage of an "empty" EOA could be cleared at the end of block.

rjl493456442 avatar Jun 27 '24 06:06 rjl493456442

@rjl493456442 I think the proposal which will get accepted for devnet-2 and on will avoid the 158 problem, so it's probably okay to just let it play out. https://github.com/ethereum/EIPs/pull/8677

lightclient avatar Jun 27 '24 13:06 lightclient

hello, I run [email protected] agaist this branch, still some failed test cases, 3 cases related: ext_code_on_self_set_code set_code_to_self_caller set_code_to_tstore_reentry is there something missed? @lightclient

    --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json (0.01s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_0] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_0]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_0]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_0]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_0]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_1] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_1]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_1]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_1]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/ext_code_on_self_set_code.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_ext_code_on_self_set_code[fork_Prague-state_test-balance_1]/Prague/0/path/snap (0.00s)
    --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json (0.03s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_0] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_1] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_0] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_0]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_0]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_0]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_0]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_1] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_1]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_1]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_1]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-value_1]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_0] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_1] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_0] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_0]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_1] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_self_caller.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_self_caller[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-value_1]/Prague/0/path/snap (0.00s)
    --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json (0.07s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_RETURN] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_REVERT] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_CALLCODE-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/path/snap (0.01s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_DELEGATECALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN] (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/hash/snap (0.01s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_RETURN]/Prague/0/path/snap (0.00s)
        --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT] (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/hash/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/hash/snap (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/path/trie (0.00s)
            --- FAIL: TestExecutionSpecState/prague/eip7702_set_code_tx/set_code_txs/set_code_to_tstore_reentry.json/tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_tstore_reentry[fork_Prague-call_opcode_STATICCALL-evm_code_type_LEGACY-state_test-return_opcode_REVERT]/Prague/0/path/snap (0.00s)

buddh0 avatar Oct 08 '24 07:10 buddh0

Lint is failing atm

MariusVanDerWijden avatar Oct 15 '24 02:10 MariusVanDerWijden

We still need to add the setCodeTxType to accounts/external/backend.go::SignTx and internal/ethapi/transaction_args.go::ToTransaction

MariusVanDerWijden avatar Oct 15 '24 05:10 MariusVanDerWijden

Reading up on the spec, I typed up some questions. Maybe this should have been posted in a different forum


Nonce bumps

After incrementing the sender’s nonce

So, if my auth's are

Prestate: Addr X: nonce 5 tx (nonce: 5, addr X)

  • auth1: auth X, nonce 6, address Y
  • auth2: auth X, nonce 7, address Z
  • auth3: auth X, nonce 8, address Y

Would result in Addr X: nonce 8 delegated to code @ Y. So nonce for X goes from 5 to 8 with this tx, correct?

EDIT: Yes, correct


Dos-ability

How large can we make a transaction, and how costly is it to validate? I.e, how many signature recoveries, if we assume that the final auth invalidates the transaction? THe PER_AUTH_BASE_COST of 12500 is only paid for valid transactions. Perhaps we should specify a max "risk appetite" that geth is willing to spend. If the tx is more expensive than, e.g. 200K gas, then it might be a DoS and not worth the risk of validating (and thus discard)?


Delegate of delegate of delegate

  • auth1: auth X, address Y
    • This sets X code to 0xef0100 || Y
  • auth2: auth Z, address X
    • This sets Z to 0xef0100 || X

What happens when we execute code at Z? Do we resolve it N steps until we reach a final non-delegation? Are there tests for this?

Recursive delegation

  • auth1: auth X, address Y
    • This sets X code to 0xef0100 || Y
  • auth2: auth Y, address X
    • This sets Y to 0xef0100 || X

What happens when we execute code at either X or Y? If we follow resolves, we will spin indefinitely. Are there tests for this?

NOTE: This PR only resolves one step, so in

  • Delegate of delegate of delegate
    • Executing X would resolve code at Y
    • Executing Z would resolve invalid code 0xef0100.. at X.

There are basically three ways this can play out:

  1. Recursively resolve,
  2. Resolve one step, but return original code
  3. Resolve one step, but return overwritten code (what this PR does)

Slots

So, storage slots on EOAs. This will create storage slots on EOAs. Since the authority nonce will be bumped, the auth account will never be empty, so empty-delete is not a problem. Are these slots useful? Do we really want them, or should they be cleared?

Delegate to empty

As a special case, if address is 0x0000000000000000000000000000000000000000

Isn't this special case undistinguishable from the general "delegate to empty code" case? Wouldn't a delegate to 0x00..0 and delegate to 0x00..1 behave identically?


Attacking a multi-auth transaction

Let's consider a transaction with multiple auths.

tx TX_A from sender:

  • auth1: auth X, nonce x, address A
  • auth2: auth Y, nonce y, address B
  • auth3: auth Z, nonce z, address C

Once this transaction is public, an attacker can craft a transaction to include before TX_A.

tx TX_B from evil:

  • auth1: auth X, nonce x, address A

When TX_B is executed, the nonce of A is increased. When TX_A is executed, the first auth will be (silently) ignored, according to the spec:

If any of the above steps fail, immediately stop processing that tuple and continue to the next tuple in the list.

tx TX_A from sender is now:

  • ~~auth1: auth X, nonce x, address A~~
  • auth2: auth Y, nonce y, address B
  • auth3: auth Z, nonce z, address C

OBS Any multi-auth transaction is subject to such an attack: whereby any or all of the bundled authorizations can be made moot, without invalidating the transaction.

Furthermore this is possible even on an single-auth transaction. In the case where tx.origin sets the code of self, this is not a problem (since the auth nonce is not valid until the tx.origin nonce has been incremented once). But whenever the tx.origin != auth, the auth can be made moot by an attacker.


Other

The Security Considerations seems to be written as if auth nonce does not increase, that is, auths are reusable:

Replay protection (e.g., a nonce) should be implemented by the delegate and signed over. Without it, a malicious actor can reuse a signature, repeating its effects.

There seems to be some confusion about whether nonces are reusable, but step 6 in the spec says

Verify the nonce of authority is equal to nonce. In case authority does not exist in the trie, verify that nonce is equal to 0.

???


Changes permanent !?

This EIP breaks the invariant that an account balance can only decrease as a result of transactions originating from that account.

Sounds strange to me -- there's no such invariant. The only invariant somewhat similar is that a tx.sender account balance can only increase after the outer tx cost has been paid (no more can be charged after that. With this EIP, it can, since the tx.sender can issue CALLs).


If transaction execution results in failure (any exceptional condition or code reverting), setting delegation designations is not rolled back.

This is strangely worded. Since all delegations are undone after the transaction ends, what does this mean? EDIT: The eip title is, literally "Add a new tx type that sets the code for an EOA during execution" (emphasis mine). Are these changes permanent?

Eaerlier, this setting of code was temporary. Meaning that whoever who sent the transaction was the one who could to a degree decide what state he wanted to replace. If they control account X, they can decide to temporarily set some code there, and exec code on their own behalf. They could also combine other auths, and "synthesise" the env which their transaction interacted with.

Change since then seems to be:

  • make the auth nonce mandatory. Nice for security!
  • make setting the code global/persisten. This is a huge change! This totally throws previous guarantees about code immutability out the window. This heralds a new era of upgradable contracts. Contracts which change from one transaction to the next, without any form of selfdestruct in-between! Total shapeshifters!

Seems like a gigantic change which should be headlined was just silently slipped into the EIP !

holiman avatar Oct 16 '24 06:10 holiman

@holiman added a test for t8n in 7d7573e.

lightclient avatar Oct 18 '24 17:10 lightclient

We really need to look into worst cases for DOS with this

MariusVanDerWijden avatar Oct 29 '24 03:10 MariusVanDerWijden

One question I had is whether eth_getCode and eth_getProof should resolve the delegation or not, I presume they should not (as it is right now) but I would like to confirm.

I think they should not resolve the code.

lightclient avatar Oct 29 '24 15:10 lightclient

Should we add the new tx type here? accounts/external/backend.go:

	switch tx.Type() {
	case types.LegacyTxType, types.AccessListTxType:
		args.GasPrice = (*hexutil.Big)(tx.GasPrice())
	case types.DynamicFeeTxType, types.BlobTxType:
		args.MaxFeePerGas = (*hexutil.Big)(tx.GasFeeCap())
		args.MaxPriorityFeePerGas = (*hexutil.Big)(tx.GasTipCap())
	default:
		return nil, fmt.Errorf("unsupported tx type %d", tx.Type())
	}

transaction_args.go

unc (args *TransactionArgs) ToTransaction(defaultType int) *types.Transaction {
	usedType := types.LegacyTxType
	switch {
	case args.BlobHashes != nil || defaultType == types.BlobTxType:
		usedType = types.BlobTxType
	case args.MaxFeePerGas != nil || defaultType == types.DynamicFeeTxType:
		usedType = types.DynamicFeeTxType
	case args.AccessList != nil || defaultType == types.AccessListTxType:
		usedType = types.AccessListTxType
	}

?

holiman avatar Nov 26 '24 14:11 holiman

  • need to remove ResolveCode from statedb and do it in the state db
  • also use parse delegation for EOA check
  • remove 7702 type from txpool filter

lightclient avatar Nov 26 '24 14:11 lightclient

All updates in, PTAL!

lightclient avatar Nov 27 '24 00:11 lightclient

Please add the SetCodeTxType here

https://github.com/ethereum/go-ethereum/blob/master/graphql/graphql.go#L315 https://github.com/ethereum/go-ethereum/blob/master/graphql/graphql.go#L328

rjl493456442 avatar Nov 27 '24 08:11 rjl493456442

So, @rjl493456442 raised some very good points (well spotted!), re a sentence in the eip:

all code executing operations to follow the address pointer to get the account’s executable code, and requires all other code reading operations to act only on the first 2 bytes of the designator

So, with a bit of emphasis:

  • all code executing operations should resolve (i.e: CALL-variants (?))
  • all others should treat it as if the code were literally 0xef01. (EXTCODESIZE, EXTCODECOPY, EXTCODEHASH).

That is not the behaviour of this PR.


As an aside, the behaviour in the EIP leads to some funky cornercases:

  • EXTCODECOPY(this, args...) != CODECOPY(args..)
  • EXTCODESIZE(this) != CODESIZE()

So a piece of code can detect if it is being executed as a target

  • EXTCODESIZE(this) == 2: I am currently target of a delegation
  • else: I am currently not target of a delegation

holiman avatar Dec 04 '24 10:12 holiman

The EIP update happened here https://github.com/ethereum/EIPs/pull/8969

https://github.com/ethereum/EIPs/commit/2bb4314865ecb8f41b7fd950612cef584a5d1c2a

holiman avatar Dec 04 '24 10:12 holiman

So, @rjl493456442 raised some very good points (well spotted!), re a sentence in the eip:

all code executing operations to follow the address pointer to get the account’s executable code, and requires all other code reading operations to act only on the first 2 bytes of the designator

Yes this is correct, currently the latest version of the EIP targets this. However, the PR targets the previous devnet-4 version of the EIP as specified https://github.com/ethereum/EIPs/blob/a7fb2260ae2ea39bdd31886832c9e45452d0e76a/EIPS/eip-7702.md.

Depending on when we plan to merge this, I think it is probably better to merge as-is because we can run this PR against the devnet-4 spec tests to ensure correctness. It will be pretty straightforward update when we make the devnet-5 changes.

Let me know if you feel strongly about directly targeting devnet-5 and I can update the PR.

lightclient avatar Dec 05 '24 21:12 lightclient

Depending on when we plan to merge this, I think it is probably better to merge as-is because we can run this PR against the devnet-4 spec tests to ensure correctness. It will be pretty straightforward update when we make the devnet-5 changes.

Let me know if you feel strongly about directly targeting devnet-5 and I can update the PR.

Well, I wouldn't say that I feel strongly, but devnet-4 is no longer operational, afaict, https://notes.ethereum.org/@ethpandaops/pectra-devnet-4 :

Devnet-4 targets launched on 18th Oct 2024 15:33:35 UTC and shut down on the 25th of Nov 2024

So therefore I think we should just go with the latest and greatest.

holiman avatar Dec 06 '24 11:12 holiman

Okay I can update for devnet-5

lightclient avatar Dec 06 '24 15:12 lightclient

The changes for devnet-5 have been made! Was able to fill the tests, but since no other clients have filled the tests there is nothing to verify against at the moment.

I also fixed the issue with the tracer so now it should report the correct gas usage for delegated accounts. That should address all the outstanding feedback on the PR. PTAL!

lightclient avatar Dec 10 '24 03:12 lightclient

The changes for devnet-5 have been made! Was able to fill the tests, but since no other clients have filled the tests there is nothing to verify against at the moment.

Where can I find those tests?

I was able to write a test for the tracer to make sure cost is reported correctly, so I think the change is okay.

~~And also this test~~ Nevermind, I found it

holiman avatar Dec 10 '24 07:12 holiman

Looks good to me.

@marioevz I just wanted to note that we should have a testcase to check that clients do indeed differentiate the behaviour between EXTCODESIZE/CODESIZE and EXTCODECOPY/CODECOPY


The behaviour in the EIP leads to some funky cornercases:

  • EXTCODECOPY(this, args...) != CODECOPY(args..)
  • EXTCODESIZE(this) != CODESIZE()

So a piece of code can detect if it is being executed as a target

  • EXTCODESIZE(this) == 2: I am currently target of a delegation
  • else: I am currently not target of a delegation

holiman avatar Dec 10 '24 08:12 holiman

State tests are failing

rjl493456442 avatar Dec 10 '24 08:12 rjl493456442

I think this PR currently breaks the behavior of the prestateTracer when calling debug_traceTransaction for a type-4 transaction: the tracer returns the auth tuples applied as the "pre" state. E.g. if you try to build a "genesis" based on this prestate, you get a state that never existed on-chain, containing the code and storage just before this transaction, but along with all new "delegates" applied, and nonces advanced. Trying to apply the transaction itself on top if this "genesis" might get different results - the at a minimum, the gas cost of the transaction will be different (as all auth tuples now fail, because of different nonce.)

drortirosh avatar Dec 10 '24 13:12 drortirosh

Thanks @drortirosh, you are correct. I've updated the prestate tracer and added a test - it should be working now. Let me know if you notice any other issues.

lightclient avatar Dec 10 '24 16:12 lightclient

How to run it locally? geth --dev doesn't support tx type 4.

(strangely, it does work in the older eip-7702-txpool branch, but obviously without the above tracer change)

drortirosh avatar Dec 11 '24 00:12 drortirosh

@drortirosh you can actually initialize the datadir with a custom genesis where pragueTime is set to 0.

$ geth init --datadir data genesis.json
$ geth --datadir data --dev

lightclient avatar Dec 11 '24 17:12 lightclient

That doesn't seem to help. it is already set to zero in AllDevChainProtocolChanges SetCodeTxType is not checked in legacypool.go (it is in the eip-7702-txpool obsolete branch)

drortirosh avatar Dec 11 '24 18:12 drortirosh

Also, eth_sendTransaction is a bit strange: it uses authList member, instead of authorizationList which is used everywhere else. It also uses "V" instead if "yParity"

drortirosh avatar Dec 11 '24 18:12 drortirosh

Ah right, we won't enable 7702 in this PR because we don't want to allow the txs into the pool before the txpool changes are completed.

lightclient avatar Dec 11 '24 19:12 lightclient

This PR just blindly overwrites the cancun definition. It doesn't use a prague jumptable.

// NewEVMInterpreter returns a new instance of the Interpreter.
func NewEVMInterpreter(evm *EVM) *EVMInterpreter {
	// If jump table was not initialised we set the default one.
	var table *JumpTable
	switch {
	case evm.chainRules.IsVerkle:
		// TODO replace with proper instruction set when fork is specified
		table = &verkleInstructionSet
	case evm.chainRules.IsCancun:
		table = &cancunInstructionSet

~~I was very close to merging this, it would have consensus-borked master. Not great.~~

EDIT: @fjl pointed out that this might actually work fine on cancun, as there are no delegations. It's still wrong though... I'm going to put it up on bench05 to sanity-check.

EDIT2: It's been running for a few hours now -- seems to work fine with EIP7702-ops activated!

holiman avatar Dec 12 '24 09:12 holiman