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 }