diff --git a/core/chain_makers.go b/core/chain_makers.go index a98bfe868a..46cd98de61 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -31,7 +31,6 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/triedb" "github.com/holiman/uint256" ) @@ -425,15 +424,8 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse body.Withdrawals = make([]*types.Withdrawal, 0) } } - // Finalize the state transition by applying operations such as withdrawals, - // uncle rewards, and related processing. - b.engine.Finalize(cm, b.header, statedb, &body) - - // Calculate the state root after applying all mutations. - b.header.Root = statedb.IntermediateRoot(cm.Config().IsEIP158(b.header.Number)) - // Assemble the block for delivery. - block := types.NewBlock(b.header, &body, b.receipts, trie.NewStackTrie(nil)) + block := AssembleBlock(b.engine, cm, b.header, statedb, &body, b.receipts) // Write state changes to db root, err := statedb.Commit(b.header.Number.Uint64(), config.IsEIP158(b.header.Number), config.IsCancun(b.header.Number, b.header.Time)) diff --git a/core/state_processor.go b/core/state_processor.go index 0a324379f9..87d89ef2fa 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -22,6 +22,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/tracing" @@ -30,6 +31,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/internal/telemetry" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" ) // StateProcessor is a basic Processor, which takes care of transitioning @@ -372,3 +374,11 @@ func onSystemCallStart(tracer *tracing.Hooks, ctx *tracing.VMContext) { tracer.OnSystemCallStart() } } + +// AssembleBlock finalizes the state and assembles the block with provided +// body and receipts. +func AssembleBlock(engine consensus.Engine, chain consensus.ChainHeaderReader, header *types.Header, state *state.StateDB, body *types.Body, receipts []*types.Receipt) *types.Block { + engine.Finalize(chain, header, state, body) + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + return types.NewBlock(header, body, receipts, trie.NewStackTrie(nil)) +} diff --git a/internal/ethapi/simulate.go b/internal/ethapi/simulate.go index 5fb911fe90..d18561760e 100644 --- a/internal/ethapi/simulate.go +++ b/internal/ethapi/simulate.go @@ -37,7 +37,6 @@ import ( "github.com/ethereum/go-ethereum/internal/ethapi/override" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/trie" ) const ( @@ -421,15 +420,8 @@ func (sim *simulator) processBlock(ctx context.Context, block *simBlock, header, } chainHeadReader := &simChainHeadReader{ctx, sim.b} - // Finalize the state transition by applying operations such as withdrawals, - // uncle rewards, and related processing. - sim.b.Engine().Finalize(chainHeadReader, header, sim.state, blockBody) - - // Calculate the state root after applying all mutations. - header.Root = sim.state.IntermediateRoot(chainHeadReader.Config().IsEIP158(header.Number)) - - // Assemble the block for delivery. - b := types.NewBlock(header, blockBody, receipts, trie.NewStackTrie(nil)) + // Assemble the block + b := core.AssembleBlock(sim.b.Engine(), chainHeadReader, header, sim.state, blockBody, receipts) repairLogs(callResults, b.Hash()) return b, callResults, senders, nil diff --git a/miner/worker.go b/miner/worker.go index 6e7882719e..ae5d6c306f 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -36,7 +36,6 @@ import ( "github.com/ethereum/go-ethereum/internal/telemetry" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/trie" "github.com/holiman/uint256" ) @@ -226,21 +225,10 @@ func (miner *Miner) generateWork(ctx context.Context, genParam *generateParams, reqHash := types.CalcRequestsHash(requests) work.header.RequestsHash = &reqHash } - // Finalize the state transition by applying operations such as withdrawals, - // uncle rewards, and related processing. - _, _, finalizeSpanEnd := telemetry.StartSpan(ctx, "miner.Finalize") - miner.engine.Finalize(miner.chain, work.header, work.state, &body) - finalizeSpanEnd(nil) - - // Calculate the state root after applying all mutations. - _, _, rootSpanEnd := telemetry.StartSpan(ctx, "miner.IntermediateRoot") - work.header.Root = work.state.IntermediateRoot(miner.chain.Config().IsEIP158(work.header.Number)) - rootSpanEnd(nil) - // Assemble the block for delivery. - _, _, blockSpanEnd := telemetry.StartSpan(ctx, "miner.NewBlock") - block := types.NewBlock(work.header, &body, work.receipts, trie.NewStackTrie(nil)) - blockSpanEnd(nil) + _, _, assembleSpanEnd := telemetry.StartSpan(ctx, "miner.AssembleBlock") + block := core.AssembleBlock(miner.engine, miner.chain, work.header, work.state, &body, work.receipts) + assembleSpanEnd(nil) return &newPayloadResult{ block: block, @@ -439,6 +427,7 @@ func (miner *Miner) applyTransaction(env *environment, tx *types.Transaction) (* func (miner *Miner) commitTransactions(ctx context.Context, env *environment, plainTxs, blobTxs *transactionsByPriceAndNonce, interrupt *atomic.Int32) error { ctx, _, spanEnd := telemetry.StartSpan(ctx, "miner.commitTransactions") defer spanEnd(nil) + isCancun := miner.chainConfig.IsCancun(env.header.Number, env.header.Time) for { // Check interruption signal and abort building if it's fired. @@ -555,6 +544,7 @@ func (miner *Miner) commitTransactions(ctx context.Context, env *environment, pl func (miner *Miner) fillTransactions(ctx context.Context, interrupt *atomic.Int32, env *environment) (err error) { ctx, span, spanEnd := telemetry.StartSpan(ctx, "miner.fillTransactions") defer spanEnd(&err) + miner.confMu.RLock() tip := miner.config.GasPrice prio := miner.prio