@@ -79,6 +79,70 @@ func (api *API) GetTxBlockTraceOnTopOfBlock(ctx context.Context, tx *types.Trans
79
79
return api .createTraceEnvAndGetBlockTrace (ctx , config , block )
80
80
}
81
81
82
+ func (api * API ) GetTxByTxBlockTrace (ctx context.Context , blockNrOrHash rpc.BlockNumberOrHash , config * TraceConfig ) ([]* types.BlockTrace , error ) {
83
+ if api .scrollTracerWrapper == nil {
84
+ return nil , errNoScrollTracerWrapper
85
+ }
86
+
87
+ // Try to retrieve the specified block
88
+ var (
89
+ err error
90
+ block * types.Block
91
+ )
92
+ if number , ok := blockNrOrHash .Number (); ok {
93
+ block , err = api .blockByNumber (ctx , number )
94
+ } else if hash , ok := blockNrOrHash .Hash (); ok {
95
+ block , err = api .blockByHash (ctx , hash )
96
+ } else {
97
+ return nil , errors .New ("invalid arguments; neither block number nor hash specified" )
98
+ }
99
+ if err != nil {
100
+ return nil , err
101
+ }
102
+ if block .NumberU64 () == 0 {
103
+ return nil , errors .New ("genesis is not traceable" )
104
+ }
105
+
106
+ if config == nil {
107
+ config = & TraceConfig {
108
+ LogConfig : & vm.LogConfig {
109
+ DisableStorage : true ,
110
+ DisableStack : true ,
111
+ EnableMemory : false ,
112
+ EnableReturnData : true ,
113
+ },
114
+ }
115
+ } else if config .Tracer != nil {
116
+ config .Tracer = nil
117
+ log .Warn ("Tracer params is unsupported" )
118
+ }
119
+
120
+ parent , err := api .blockByNumberAndHash (ctx , rpc .BlockNumber (block .NumberU64 ()- 1 ), block .ParentHash ())
121
+ if err != nil {
122
+ return nil , err
123
+ }
124
+ reexec := defaultTraceReexec
125
+ if config != nil && config .Reexec != nil {
126
+ reexec = * config .Reexec
127
+ }
128
+ statedb , err := api .backend .StateAtBlock (ctx , parent , reexec , nil , true , true )
129
+ if err != nil {
130
+ return nil , err
131
+ }
132
+
133
+ chaindb := api .backend .ChainDb ()
134
+ traces := []* types.BlockTrace {}
135
+ for _ , tx := range block .Transactions () {
136
+ singleTxBlock := types .NewBlockWithHeader (block .Header ()).WithBody ([]* types.Transaction {tx }, nil )
137
+ trace , err := api .scrollTracerWrapper .CreateTraceEnvAndGetBlockTrace (api .backend .ChainConfig (), api .chainContext (ctx ), api .backend .Engine (), chaindb , statedb , parent , singleTxBlock , true )
138
+ if err != nil {
139
+ return nil , err
140
+ }
141
+ traces = append (traces , trace )
142
+ }
143
+ return traces , nil
144
+ }
145
+
82
146
// Make trace environment for current block, and then get the trace for the block.
83
147
func (api * API ) createTraceEnvAndGetBlockTrace (ctx context.Context , config * TraceConfig , block * types.Block ) (* types.BlockTrace , error ) {
84
148
if config == nil {
0 commit comments