Skip to content

fix(precompiles): keep warm addresses when moving precompiles - #433

Open
MysticRyuujin wants to merge 1 commit into
alloy-rs:mainfrom
MysticRyuujin:move-precompiles-keep-warm-set
Open

MysticRyuujin wants to merge 1 commit into
alloy-rs:mainfrom
MysticRyuujin:move-precompiles-keep-warm-set

Conversation

@MysticRyuujin

Copy link
Copy Markdown

PrecompilesMap::move_precompiles removed the source address from the warm addresses and added the destination address. For eth_simulateV1 (movePrecompileToAddress), the warm set must stay the precompile addresses of the fork. The spec says so in ethereum/execution-apis#881 (movePrecompileToAddress in src/schemas/execute.yaml): the move does not change the EIP-2929 warm set, and the destination is not warm because of the move. Geth installs the moved map for execution, but it warms vm.ActivePrecompiles(rules).

With the old behavior, reth charged the warm cost for a call to the destination and the cold cost for a call to the source. Geth charges the opposite. The hive fixture ethSimulate-override-ecrecover fails because of this difference.

This change moves only the precompile map entries. The warm addresses do not change, so warm_addresses() still returns the fork set. addresses() now lists the installed precompiles from the precompile map, so after a move it contains the destination and not the source. Before this change, both methods read the same set. Callers that list precompiles, for example reth eth_config, therefore still see the moved precompile. The doc comments state the new behavior. A new test checks both methods after a move.

Related: ethereum/execution-apis#887.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant