Skip to content

Commit 8c80cdd

Browse files
holimans1na
authored andcommitted
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 ethereum/go-ethereum#30117. --------- Co-authored-by: Sina Mahmoodi <[email protected]> # Conflicts: # tests/state_test_util.go
1 parent cc18bca commit 8c80cdd

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
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
func (l *StructLogger) CaptureSystemTxEnd(intrinsicGas uint64) {

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -295,13 +295,19 @@ func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapsh
295295
}
296296
evm := vm.NewEVM(context, txContext, st.StateDB, config, vmconfig)
297297

298+
if tracer := vmconfig.Tracer; tracer != nil && tracer.OnTxStart != nil {
299+
tracer.OnTxStart(evm.GetVMContext(), nil, msg.From)
300+
}
298301
// Execute the message.
299302
snapshot := st.StateDB.Snapshot()
300303
gaspool := new(core.GasPool)
301304
gaspool.AddGas(block.GasLimit())
302-
_, err = core.ApplyMessage(evm, msg, gaspool)
305+
vmRet, err := core.ApplyMessage(evm, msg, gaspool)
303306
if err != nil {
304307
st.StateDB.RevertToSnapshot(snapshot)
308+
if tracer := evm.Config.Tracer; tracer != nil && tracer.OnTxEnd != nil {
309+
evm.Config.Tracer.OnTxEnd(nil, err)
310+
}
305311
}
306312

307313
// Commit block
@@ -316,6 +322,10 @@ func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapsh
316322
root = st.StateDB.IntermediateRoot(config.IsEIP158(block.Number()))
317323
st.StateDB.SetExpectedStateRoot(root)
318324
root, _, _ = st.StateDB.Commit(block.NumberU64(), config.IsEIP158(block.Number()))
325+
if tracer := evm.Config.Tracer; tracer != nil && tracer.OnTxEnd != nil {
326+
receipt := &types.Receipt{GasUsed: vmRet.UsedGas}
327+
tracer.OnTxEnd(receipt, nil)
328+
}
319329
return st, root, err
320330
}
321331

0 commit comments

Comments
 (0)