github.com/cryptotooltop/go-ethereum@v0.0.0-20231103184714-151d1922f3e5/eth/tracers/api_blocktrace.go (about)

     1  package tracers
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  
     7  	"github.com/scroll-tech/go-ethereum/core"
     8  	"github.com/scroll-tech/go-ethereum/core/types"
     9  	"github.com/scroll-tech/go-ethereum/core/vm"
    10  	"github.com/scroll-tech/go-ethereum/log"
    11  	"github.com/scroll-tech/go-ethereum/rpc"
    12  )
    13  
    14  type TraceBlock interface {
    15  	GetBlockTraceByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash, config *TraceConfig) (trace *types.BlockTrace, err error)
    16  }
    17  
    18  // GetBlockTraceByNumberOrHash replays the block and returns the structured BlockTrace by hash or number.
    19  func (api *API) GetBlockTraceByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash, config *TraceConfig) (trace *types.BlockTrace, err error) {
    20  	var block *types.Block
    21  	if number, ok := blockNrOrHash.Number(); ok {
    22  		block, err = api.blockByNumber(ctx, number)
    23  	}
    24  	if hash, ok := blockNrOrHash.Hash(); ok {
    25  		block, err = api.blockByHash(ctx, hash)
    26  	}
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  	if block.NumberU64() == 0 {
    31  		return nil, errors.New("genesis is not traceable")
    32  	}
    33  	if config == nil {
    34  		config = &TraceConfig{
    35  			LogConfig: &vm.LogConfig{
    36  				EnableMemory:     false,
    37  				EnableReturnData: true,
    38  			},
    39  		}
    40  	} else if config.Tracer != nil {
    41  		config.Tracer = nil
    42  		log.Warn("Tracer params is unsupported")
    43  	}
    44  
    45  	// create current execution environment.
    46  	env, err := api.createTraceEnv(ctx, config, block)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	return env.GetBlockTrace(block)
    52  }
    53  
    54  // Make trace environment for current block.
    55  func (api *API) createTraceEnv(ctx context.Context, config *TraceConfig, block *types.Block) (*core.TraceEnv, error) {
    56  	parent, err := api.blockByNumberAndHash(ctx, rpc.BlockNumber(block.NumberU64()-1), block.ParentHash())
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  	reexec := defaultTraceReexec
    61  	if config != nil && config.Reexec != nil {
    62  		reexec = *config.Reexec
    63  	}
    64  	statedb, err := api.backend.StateAtBlock(ctx, parent, reexec, nil, true, true)
    65  	if err != nil {
    66  		return nil, err
    67  	}
    68  	chaindb := api.backend.ChainDb()
    69  	return core.CreateTraceEnv(api.backend.ChainConfig(), api.chainContext(ctx), api.backend.Engine(), chaindb, statedb, parent, block, true)
    70  }