feat(payload): add state_gas_used metric for TIP-1016 state gas tracking#3372
Open
feat(payload): add state_gas_used metric for TIP-1016 state gas tracking#3372
Conversation
Bump dependencies to EIP-8037 (State Gas Reservoir Model) branches: - reth: 2a94eed → ff2f857e (eip8037 branch) - revm: patched via local path at 3a29466d (rakita/state-gas branch) - alloy-evm: patched to a8da352a (eip8037 branch) - revm-inspectors: patched to 50676ae7 (eip8037 branch) Adapt to API changes: PrecompileOutput now uses GasTracker instead of gas_used/gas_refunded fields, PrecompileResult error type changed to PrecompileFailure, InitialAndFloorGas.initial_gas renamed to initial_total_gas, Handler trait methods gained EIP-8037 parameters, ResultGas removed with_limit(), and commit_transaction returns GasOutput.
Let `?` auto-convert via `From<PrecompileError> for PrecompileFailure` instead of wrapping explicitly with `PrecompileFailure::from(...)`.
Remove serde-bincode-compat features and RlpBincode impls removed upstream, drop redundant SignedTransaction/InMemorySize impls now covered by blanket impls, and migrate spent() to total_gas_spent() for EIP-8037.
…ipt cumulative_gas_used
Bump dependencies to EIP-8037 (State Gas Reservoir Model) branches: - reth: 2a94eed → ff2f857e (eip8037 branch) - revm: patched via local path at 3a29466d (rakita/state-gas branch) - alloy-evm: patched to a8da352a (eip8037 branch) - revm-inspectors: patched to 50676ae7 (eip8037 branch) Adapt to API changes: PrecompileOutput now uses GasTracker instead of gas_used/gas_refunded fields, PrecompileResult error type changed to PrecompileFailure, InitialAndFloorGas.initial_gas renamed to initial_total_gas, Handler trait methods gained EIP-8037 parameters, ResultGas removed with_limit(), and commit_transaction returns GasOutput.
Bump dependencies to EIP-8037 (State Gas Reservoir Model) branches: - reth: 2a94eed → ff2f857e (eip8037 branch) - revm: patched via local path at 3a29466d (rakita/state-gas branch) - alloy-evm: patched to a8da352a (eip8037 branch) - revm-inspectors: patched to 50676ae7 (eip8037 branch) Adapt to API changes: PrecompileOutput now uses GasTracker instead of gas_used/gas_refunded fields, PrecompileResult error type changed to PrecompileFailure, InitialAndFloorGas.initial_gas renamed to initial_total_gas, Handler trait methods gained EIP-8037 parameters, ResultGas removed with_limit(), and commit_transaction returns GasOutput.
…(TIP-1016) (#2734) Closes CHAIN-791 Adds block-level plumbing to track execution gas and storage creation gas separately in `TempoBlockExecutor`. - Added `cumulative_full_gas_used` and `cumulative_storage_creation_gas` fields to `TempoBlockExecutor` - `commit_transaction` now computes `execution_gas = full_gas - storage_creation_gas` and only execution gas counts toward block gas limits (`non_shared_gas_left`, `non_payment_gas_left`) - Receipts and `cumulative_full_gas_used` continue to track full gas (execution + storage creation) - `finish()` returns execution gas (not full gas) for the block header gas field - `storage_creation_gas` is hardcoded to `0` with a TODO — it will be populated once handler-level tracking lands (CHAIN-789 / PR #2714) Note: hardfork gating is not required. With `storage_creation_gas = 0`, all gas accounting is identical to the current behavior. The hardfork gate (T2) lives in the handler layer, not here. This is pure plumbing that becomes active only when upstream EVM tracking is enabled.
… (TIP-1016) (#2714) Closes CHAIN-789 Introduces state gas tracking in the EVM handler for the T2 hardfork. State gas separates the cost of state-touching operations (account creation, contract deployment) from execution gas, enabling the reservoir model and tx cap bypass for state-heavy transactions. `crates/evm/src/lib.rs`: - Set `cfg_env.enable_state_gas = spec.is_t2()` in both `evm_env` and `next_evm_env` `crates/revm/src/handler.rs` - `adjusted_initial_gas`: propagate `initial_state_gas` through `InitialAndFloorGas::new_with_state_gas` - `calculate_aa_batch_intrinsic_gas`: track `new_account_state_gas + create_state_gas` for AA CREATE calls - Multi-call gas reconstruction: use flattened `Gas::new_spent` + `erase_cost` pattern (robust under EIP-8037 reservoir model) and accumulate `state_gas_spent` across calls - Tx gas limit cap bypass: upstream revm already skips the cap check when `enable_state_gas` is true - `reimburse_caller`: no changes needed — `gas.used()` already includes state gas through the reservoir flattening in `last_frame_result`
…lock gas limits (#2781) Closes CHAIN-798
…r storage gas exemption (#2889) Closes CHAIN-881
Co-authored-by: rakita <rakita@users.noreply.github.com>
…or of inner executor's block_regular_gas_used
…stead of tx_gas_used minus state_gas_used
…that breaks eth_simulateV1
…erflow in revm's execution/first_frame_input subtraction
…bc7, reth to b25459035f - reth-primitives-traits and reth-codecs now from crates.io (extracted from reth repo) - Remove TempoPayloadBuilderAttributes (PayloadBuilderAttributes trait removed upstream) - Add payload_id() to TempoPayloadAttributes PayloadAttributes impl - Update BuildArguments::new(), builder.finish(), EthBuiltPayload::new() signatures - Add into_result() to TxResult impl, rename tx_gas_used -> cumulative_tx_gas_used - Remove EngineApiMessageVersion from fork_choice_updated() calls - Update Decompress impl to use reth_codecs::DecompressError
- Rename tx_gas_used -> cumulative_tx_gas_used in test - Add missing gas_used arg to into_precompile_result - Remove EngineApiMessageVersion from fork_choice_updated calls in tests - Remove unused PayloadId import
- finish() returns cumulative_tx_gas_used - block_state_gas_used for TIP-1016 (state gas exempted from block capacity, charged to users via receipts) - Fix adjusted_initial_gas: evm_initial_gas already includes state gas in new revm - Fix validate_initial_tx_gas: initial_total_gas already includes initial_state_gas - Use saturating_sub for gas subtractions to prevent overflow - Update test assertions for new gas model behavior
Root cause: In the new revm, initial_total_gas must include initial_state_gas. Tempo's nonce==0 and auth list gas additions were adding the execution portion (e.g. 5000) to initial_total_gas but a much larger state portion (e.g. 245000) to initial_state_gas, violating the invariant. Fix: Add both execution + state portions to initial_total_gas when adding state gas, maintaining initial_total_gas >= initial_state_gas. Also fix adjusted_initial_gas to not double-count state gas since evm_initial_gas already includes init_and_floor_gas.initial_state_gas in the new revm. - Fix nonce==0 gas additions in validate_initial_tx_gas and AA batch path - Fix auth list gas additions - Fix validation check (total already includes state) - Increase tip20 test gas limit for higher intrinsic gas
…unt 25k/225k, CREATE 32k/468k, EIP-7702 250k)
1420f88 to
0c4d3cf
Compare
rakita
approved these changes
Mar 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
state_gas_usedhistogram and gauge toTempoPayloadBuilderMetrics, accumulating per-tx state gas viaexecute_transaction_with_result_closureacross pool, subblock, and system transactions. Pre-T3 this will always bezero; post-T3 it captures the state gas dimension split out by TIP-1016.