diff --git a/eth/backend.go b/eth/backend.go index aa76aa0006..a021ab0e53 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -299,7 +299,7 @@ func New(stack *node.Node, config *ethconfig.Config) (*Ethereum, error) { return nil, err } - eth.miner = miner.New(eth, config.Miner, eth.engine) + eth.miner = miner.New(eth, config.Miner, eth.engine, vmConfig) eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) eth.APIBackend = &EthAPIBackend{stack.Config().ExtRPCEnabled(), stack.Config().AllowUnprotectedTxs, config.RollupDisableTxPoolAdmission, eth, nil} diff --git a/miner/miner.go b/miner/miner.go index 8368b96e15..677f7e0aed 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -31,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/txpool" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/params" ) @@ -84,10 +85,15 @@ type Miner struct { pendingMu sync.Mutex // Lock protects the pending block backend Backend + + // evmConfig is the EVM execution configuration used during payload building. + // It must match the vm.Config used by block validation to ensure + // self-consistent gas accounting. + evmConfig vm.Config } // New creates a new miner with provided config. -func New(eth Backend, config Config, engine consensus.Engine) *Miner { +func New(eth Backend, config Config, engine consensus.Engine, evmConfig vm.Config) *Miner { return &Miner{ backend: eth, config: &config, @@ -96,6 +102,7 @@ func New(eth Backend, config Config, engine consensus.Engine) *Miner { txpool: eth.TxPool(), chain: eth.BlockChain(), pending: &pending{}, + evmConfig: evmConfig, } } diff --git a/miner/worker.go b/miner/worker.go index 3089e5afc3..dfce7730c4 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -248,7 +248,7 @@ func (miner *Miner) prepareWork(genParams *generateParams) (*environment, error) } if header.ParentBeaconRoot != nil { context := core.NewEVMBlockContext(header, miner.chain, nil, miner.chainConfig, env.state) - vmenv := vm.NewEVM(context, vm.TxContext{}, env.state, miner.chainConfig, vm.Config{}) + vmenv := vm.NewEVM(context, vm.TxContext{}, env.state, miner.chainConfig, miner.evmConfig) core.ProcessBeaconBlockRoot(*header.ParentBeaconRoot, vmenv, env.state) } return env, nil @@ -328,7 +328,7 @@ func (miner *Miner) applyTransaction(env *environment, tx *types.Transaction) (* snap = env.state.Snapshot() gp = env.gasPool.Gas() ) - receipt, err := core.ApplyTransaction(miner.chainConfig, miner.chain, &env.coinbase, env.gasPool, env.state, env.header, tx, &env.header.GasUsed, vm.Config{}) + receipt, err := core.ApplyTransaction(miner.chainConfig, miner.chain, &env.coinbase, env.gasPool, env.state, env.header, tx, &env.header.GasUsed, miner.evmConfig) if err != nil { env.state.RevertToSnapshot(snap) env.gasPool.SetGas(gp)