cmd, core, internal, miner: wrap post-execution as a core function

This commit is contained in:
Gary Rong 2026-04-24 11:45:40 +08:00 committed by Jared Wasinger
parent 60db25b070
commit 297adcb2f0
5 changed files with 36 additions and 81 deletions

View file

@ -17,6 +17,7 @@
package t8ntool package t8ntool
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
stdmath "math" stdmath "math"
@ -331,27 +332,14 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
} }
// Gather the execution-layer triggered requests. // Gather the execution-layer triggered requests.
var requests [][]byte var allLogs []*types.Log
if chainConfig.IsPrague(vmContext.BlockNumber, vmContext.Time) { for _, receipt := range receipts {
requests = [][]byte{} allLogs = append(allLogs, receipt.Logs...)
// EIP-6110 }
var allLogs []*types.Log requests, err := core.PostExecution(context.Background(), chainConfig, vmContext.BlockNumber, vmContext.Time, allLogs, evm)
for _, receipt := range receipts { if err != nil {
allLogs = append(allLogs, receipt.Logs...) return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("failed to process post-execution: %v", err))
}
if err := core.ParseDepositLogs(&requests, allLogs, chainConfig); err != nil {
return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not parse requests logs: %v", err))
}
// EIP-7002
if err := core.ProcessWithdrawalQueue(&requests, evm); err != nil {
return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not process withdrawal requests: %v", err))
}
// EIP-7251
if err := core.ProcessConsolidationQueue(&requests, evm); err != nil {
return nil, nil, nil, NewError(ErrorEVM, fmt.Errorf("could not process consolidation requests: %v", err))
}
} }
// Commit block // Commit block
root, err := statedb.Commit(vmContext.BlockNumber.Uint64(), chainConfig.IsEIP158(vmContext.BlockNumber), chainConfig.IsCancun(vmContext.BlockNumber, vmContext.Time)) root, err := statedb.Commit(vmContext.BlockNumber.Uint64(), chainConfig.IsEIP158(vmContext.BlockNumber), chainConfig.IsCancun(vmContext.BlockNumber, vmContext.Time))
if err != nil { if err != nil {

View file

@ -17,6 +17,7 @@
package core package core
import ( import (
"context"
"fmt" "fmt"
"math/big" "math/big"
@ -314,28 +315,18 @@ func (b *BlockGen) collectRequests(readonly bool) (requests [][]byte) {
// off the statedb before executing the system calls. // off the statedb before executing the system calls.
statedb = statedb.Copy() statedb = statedb.Copy()
} }
// EIP-6110 deposits
if b.cm.config.IsPrague(b.header.Number, b.header.Time) { var blockLogs []*types.Log
requests = [][]byte{} for _, r := range b.receipts {
// EIP-6110 deposits blockLogs = append(blockLogs, r.Logs...)
var blockLogs []*types.Log }
for _, r := range b.receipts { // TODO(rjl493456442) the EVM instance should be shared across the entire
blockLogs = append(blockLogs, r.Logs...) // generation life cycle.
} blockContext := NewEVMBlockContext(b.header, b.cm, &b.header.Coinbase)
if err := ParseDepositLogs(&requests, blockLogs, b.cm.config); err != nil { evm := vm.NewEVM(blockContext, statedb, b.cm.config, vm.Config{})
panic(fmt.Sprintf("failed to parse deposit log: %v", err)) requests, err := PostExecution(context.Background(), b.cm.config, b.header.Number, b.header.Time, blockLogs, evm)
} if err != nil {
// create EVM for system calls panic(fmt.Sprintf("failed to run post-execution: %v", err))
blockContext := NewEVMBlockContext(b.header, b.cm, &b.header.Coinbase)
evm := vm.NewEVM(blockContext, statedb, b.cm.config, vm.Config{})
// EIP-7002
if err := ProcessWithdrawalQueue(&requests, evm); err != nil {
panic(fmt.Sprintf("could not process withdrawal requests: %v", err))
}
// EIP-7251
if err := ProcessConsolidationQueue(&requests, evm); err != nil {
panic(fmt.Sprintf("could not process consolidation requests: %v", err))
}
} }
return requests return requests
} }

View file

@ -118,11 +118,10 @@ func (p *StateProcessor) Process(ctx context.Context, block *types.Block, stated
allLogs = append(allLogs, receipt.Logs...) allLogs = append(allLogs, receipt.Logs...)
spanEnd(nil) spanEnd(nil)
} }
requests, err := postExecution(ctx, config, block, allLogs, evm) requests, err := PostExecution(ctx, config, block.Number(), block.Time(), allLogs, evm)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Finalize the block, applying any consensus engine specific extras (e.g. block rewards) // Finalize the block, applying any consensus engine specific extras (e.g. block rewards)
p.chain.Engine().Finalize(p.chain, header, tracingStateDB, block.Body()) p.chain.Engine().Finalize(p.chain, header, tracingStateDB, block.Body())
@ -134,28 +133,29 @@ func (p *StateProcessor) Process(ctx context.Context, block *types.Block, stated
}, nil }, nil
} }
// postExecution processes the post-execution system calls if Prague is enabled. // PostExecution processes post-execution system calls when Prague is enabled.
func postExecution(ctx context.Context, config *params.ChainConfig, block *types.Block, allLogs []*types.Log, evm *vm.EVM) (requests [][]byte, err error) { // If Prague is not activated, it returns null requests to differentiate from
// empty requests.
func PostExecution(ctx context.Context, config *params.ChainConfig, number *big.Int, time uint64, allLogs []*types.Log, evm *vm.EVM) (requests [][]byte, err error) {
_, _, spanEnd := telemetry.StartSpan(ctx, "core.postExecution") _, _, spanEnd := telemetry.StartSpan(ctx, "core.postExecution")
defer spanEnd(&err) defer spanEnd(&err)
// Read requests if Prague is enabled. // Read requests if Prague is enabled.
if config.IsPrague(block.Number(), block.Time()) { if config.IsPrague(number, time) {
requests = [][]byte{} requests = [][]byte{}
// EIP-6110 // EIP-6110
if err := ParseDepositLogs(&requests, allLogs, config); err != nil { if err := ParseDepositLogs(&requests, allLogs, config); err != nil {
return requests, fmt.Errorf("failed to parse deposit logs: %w", err) return nil, fmt.Errorf("failed to parse deposit logs: %w", err)
} }
// EIP-7002 // EIP-7002
if err := ProcessWithdrawalQueue(&requests, evm); err != nil { if err := ProcessWithdrawalQueue(&requests, evm); err != nil {
return requests, fmt.Errorf("failed to process withdrawal queue: %w", err) return nil, fmt.Errorf("failed to process withdrawal queue: %w", err)
} }
// EIP-7251 // EIP-7251
if err := ProcessConsolidationQueue(&requests, evm); err != nil { if err := ProcessConsolidationQueue(&requests, evm); err != nil {
return requests, fmt.Errorf("failed to process consolidation queue: %w", err) return nil, fmt.Errorf("failed to process consolidation queue: %w", err)
} }
} }
return requests, nil return requests, nil
} }

View file

@ -394,21 +394,9 @@ func (sim *simulator) processBlock(ctx context.Context, block *simBlock, header,
} }
// Process EIP-7685 requests // Process EIP-7685 requests
var requests [][]byte requests, err := core.PostExecution(ctx, sim.chainConfig, header.Number, header.Time, allLogs, evm)
if sim.chainConfig.IsPrague(header.Number, header.Time) { if err != nil {
requests = [][]byte{} return nil, nil, nil, err
// EIP-6110
if err := core.ParseDepositLogs(&requests, allLogs, sim.chainConfig); err != nil {
return nil, nil, nil, err
}
// EIP-7002
if err := core.ProcessWithdrawalQueue(&requests, evm); err != nil {
return nil, nil, nil, err
}
// EIP-7251
if err := core.ProcessConsolidationQueue(&requests, evm); err != nil {
return nil, nil, nil, err
}
} }
if requests != nil { if requests != nil {
reqHash := types.CalcRequestsHash(requests) reqHash := types.CalcRequestsHash(requests)

View file

@ -208,21 +208,9 @@ func (miner *Miner) generateWork(ctx context.Context, genParam *generateParams,
} }
// Collect consensus-layer requests if Prague is enabled. // Collect consensus-layer requests if Prague is enabled.
var requests [][]byte requests, err := core.PostExecution(ctx, miner.chainConfig, work.header.Number, work.header.Time, allLogs, work.evm)
if miner.chainConfig.IsPrague(work.header.Number, work.header.Time) { if err != nil {
requests = [][]byte{} return &newPayloadResult{err: err}
// EIP-6110 deposits
if err := core.ParseDepositLogs(&requests, allLogs, miner.chainConfig); err != nil {
return &newPayloadResult{err: err}
}
// EIP-7002
if err := core.ProcessWithdrawalQueue(&requests, work.evm); err != nil {
return &newPayloadResult{err: err}
}
// EIP-7251 consolidations
if err := core.ProcessConsolidationQueue(&requests, work.evm); err != nil {
return &newPayloadResult{err: err}
}
} }
if requests != nil { if requests != nil {
reqHash := types.CalcRequestsHash(requests) reqHash := types.CalcRequestsHash(requests)