Skip to content

Commit 30824fa

Browse files
holimans1na
andauthored
eth/tracers: avoid panic in state test runner (#30332)
Make tracers more robust by handling `nil` receipt as input. Also pass in a receipt with gas used in the state test runner. Closes #30117. --------- Co-authored-by: Sina Mahmoodi <[email protected]>
1 parent 733fcbb commit 30824fa

File tree

4 files changed

+17
-9
lines changed

4 files changed

+17
-9
lines changed

eth/tracers/js/goja.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,9 @@ func (t *jsTracer) OnTxEnd(receipt *types.Receipt, err error) {
275275
}
276276
return
277277
}
278-
t.ctx["gasUsed"] = t.vm.ToValue(receipt.GasUsed)
278+
if receipt != nil {
279+
t.ctx["gasUsed"] = t.vm.ToValue(receipt.GasUsed)
280+
}
279281
}
280282

281283
// onStart implements the Tracer interface to initialize the tracing operation.

eth/tracers/logger/logger.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,9 @@ func (l *StructLogger) OnTxEnd(receipt *types.Receipt, err error) {
268268
}
269269
return
270270
}
271-
l.usedGas = receipt.GasUsed
271+
if receipt != nil {
272+
l.usedGas = receipt.GasUsed
273+
}
272274
}
273275

274276
// StructLogs returns the captured log entries.

eth/tracers/native/call.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,9 @@ func (t *callTracer) OnTxEnd(receipt *types.Receipt, err error) {
225225
if err != nil {
226226
return
227227
}
228-
t.callstack[0].GasUsed = receipt.GasUsed
228+
if receipt != nil {
229+
t.callstack[0].GasUsed = receipt.GasUsed
230+
}
229231
if t.config.WithLog {
230232
// Logs are not emitted when the call fails
231233
clearFailedLogs(&t.callstack[0], false)

tests/state_test_util.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -297,19 +297,17 @@ func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapsh
297297

298298
if tracer := vmconfig.Tracer; tracer != nil && tracer.OnTxStart != nil {
299299
tracer.OnTxStart(evm.GetVMContext(), nil, msg.From)
300-
if evm.Config.Tracer.OnTxEnd != nil {
301-
defer func() {
302-
evm.Config.Tracer.OnTxEnd(nil, err)
303-
}()
304-
}
305300
}
306301
// Execute the message.
307302
snapshot := st.StateDB.Snapshot()
308303
gaspool := new(core.GasPool)
309304
gaspool.AddGas(block.GasLimit())
310-
_, err = core.ApplyMessage(evm, msg, gaspool)
305+
vmRet, err := core.ApplyMessage(evm, msg, gaspool)
311306
if err != nil {
312307
st.StateDB.RevertToSnapshot(snapshot)
308+
if tracer := evm.Config.Tracer; tracer != nil && tracer.OnTxEnd != nil {
309+
evm.Config.Tracer.OnTxEnd(nil, err)
310+
}
313311
}
314312
// Add 0-value mining reward. This only makes a difference in the cases
315313
// where
@@ -320,6 +318,10 @@ func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapsh
320318

321319
// Commit state mutations into database.
322320
root, _ = st.StateDB.Commit(block.NumberU64(), config.IsEIP158(block.Number()))
321+
if tracer := evm.Config.Tracer; tracer != nil && tracer.OnTxEnd != nil {
322+
receipt := &types.Receipt{GasUsed: vmRet.UsedGas}
323+
tracer.OnTxEnd(receipt, nil)
324+
}
323325
return st, root, err
324326
}
325327

0 commit comments

Comments
 (0)