eth/tracers: use atomic type (#27031)
Use the new atomic types in package eth/tracers --------- Co-authored-by: Martin Holst Swende <martin@swende.se> Co-authored-by: Sina Mahmoodi <itz.s1na@gmail.com>
This commit is contained in:
parent
b4dcd1a391
commit
2adce0b066
@ -835,8 +835,8 @@ func TestTraceChain(t *testing.T) {
|
|||||||
signer := types.HomesteadSigner{}
|
signer := types.HomesteadSigner{}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ref uint32 // total refs has made
|
ref atomic.Uint32 // total refs has made
|
||||||
rel uint32 // total rels has made
|
rel atomic.Uint32 // total rels has made
|
||||||
nonce uint64
|
nonce uint64
|
||||||
)
|
)
|
||||||
backend := newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) {
|
backend := newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) {
|
||||||
@ -849,8 +849,8 @@ func TestTraceChain(t *testing.T) {
|
|||||||
nonce += 1
|
nonce += 1
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
backend.refHook = func() { atomic.AddUint32(&ref, 1) }
|
backend.refHook = func() { ref.Add(1) }
|
||||||
backend.relHook = func() { atomic.AddUint32(&rel, 1) }
|
backend.relHook = func() { rel.Add(1) }
|
||||||
api := NewAPI(backend)
|
api := NewAPI(backend)
|
||||||
|
|
||||||
single := `{"result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}`
|
single := `{"result":{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}}`
|
||||||
@ -863,7 +863,8 @@ func TestTraceChain(t *testing.T) {
|
|||||||
{10, 20, nil}, // the middle chain range, blocks [11, 20]
|
{10, 20, nil}, // the middle chain range, blocks [11, 20]
|
||||||
}
|
}
|
||||||
for _, c := range cases {
|
for _, c := range cases {
|
||||||
ref, rel = 0, 0 // clean up the counters
|
ref.Store(0)
|
||||||
|
rel.Store(0)
|
||||||
|
|
||||||
from, _ := api.blockByNumber(context.Background(), rpc.BlockNumber(c.start))
|
from, _ := api.blockByNumber(context.Background(), rpc.BlockNumber(c.start))
|
||||||
to, _ := api.blockByNumber(context.Background(), rpc.BlockNumber(c.end))
|
to, _ := api.blockByNumber(context.Background(), rpc.BlockNumber(c.end))
|
||||||
@ -888,8 +889,9 @@ func TestTraceChain(t *testing.T) {
|
|||||||
if next != c.end+1 {
|
if next != c.end+1 {
|
||||||
t.Error("Missing tracing block")
|
t.Error("Missing tracing block")
|
||||||
}
|
}
|
||||||
if ref != rel {
|
|
||||||
t.Errorf("Ref and deref actions are not equal, ref %d rel %d", ref, rel)
|
if nref, nrel := ref.Load(), rel.Load(); nref != nrel {
|
||||||
|
t.Errorf("Ref and deref actions are not equal, ref %d rel %d", nref, nrel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,8 +116,8 @@ type StructLogger struct {
|
|||||||
gasLimit uint64
|
gasLimit uint64
|
||||||
usedGas uint64
|
usedGas uint64
|
||||||
|
|
||||||
interrupt uint32 // Atomic flag to signal execution interruption
|
interrupt atomic.Bool // Atomic flag to signal execution interruption
|
||||||
reason error // Textual reason for the interruption
|
reason error // Textual reason for the interruption
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewStructLogger returns a new logger
|
// NewStructLogger returns a new logger
|
||||||
@ -149,7 +149,7 @@ func (l *StructLogger) CaptureStart(env *vm.EVM, from common.Address, to common.
|
|||||||
// CaptureState also tracks SLOAD/SSTORE ops to track storage change.
|
// CaptureState also tracks SLOAD/SSTORE ops to track storage change.
|
||||||
func (l *StructLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
func (l *StructLogger) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
|
||||||
// If tracing was interrupted, set the error and stop
|
// If tracing was interrupted, set the error and stop
|
||||||
if atomic.LoadUint32(&l.interrupt) > 0 {
|
if l.interrupt.Load() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// check if already accumulated the specified number of logs
|
// check if already accumulated the specified number of logs
|
||||||
@ -258,7 +258,7 @@ func (l *StructLogger) GetResult() (json.RawMessage, error) {
|
|||||||
// Stop terminates execution of the tracer at the first opportune moment.
|
// Stop terminates execution of the tracer at the first opportune moment.
|
||||||
func (l *StructLogger) Stop(err error) {
|
func (l *StructLogger) Stop(err error) {
|
||||||
l.reason = err
|
l.reason = err
|
||||||
atomic.StoreUint32(&l.interrupt, 1)
|
l.interrupt.Store(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *StructLogger) CaptureTxStart(gasLimit uint64) {
|
func (l *StructLogger) CaptureTxStart(gasLimit uint64) {
|
||||||
|
@ -48,7 +48,7 @@ func init() {
|
|||||||
type fourByteTracer struct {
|
type fourByteTracer struct {
|
||||||
noopTracer
|
noopTracer
|
||||||
ids map[string]int // ids aggregates the 4byte ids found
|
ids map[string]int // ids aggregates the 4byte ids found
|
||||||
interrupt uint32 // Atomic flag to signal execution interruption
|
interrupt atomic.Bool // Atomic flag to signal execution interruption
|
||||||
reason error // Textual reason for the interruption
|
reason error // Textual reason for the interruption
|
||||||
activePrecompiles []common.Address // Updated on CaptureStart based on given rules
|
activePrecompiles []common.Address // Updated on CaptureStart based on given rules
|
||||||
}
|
}
|
||||||
@ -93,7 +93,7 @@ func (t *fourByteTracer) CaptureStart(env *vm.EVM, from common.Address, to commo
|
|||||||
// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct).
|
// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct).
|
||||||
func (t *fourByteTracer) CaptureEnter(op vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
func (t *fourByteTracer) CaptureEnter(op vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
|
||||||
// Skip if tracing was interrupted
|
// Skip if tracing was interrupted
|
||||||
if atomic.LoadUint32(&t.interrupt) > 0 {
|
if t.interrupt.Load() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if len(input) < 4 {
|
if len(input) < 4 {
|
||||||
@ -124,7 +124,7 @@ func (t *fourByteTracer) GetResult() (json.RawMessage, error) {
|
|||||||
// Stop terminates execution of the tracer at the first opportune moment.
|
// Stop terminates execution of the tracer at the first opportune moment.
|
||||||
func (t *fourByteTracer) Stop(err error) {
|
func (t *fourByteTracer) Stop(err error) {
|
||||||
t.reason = err
|
t.reason = err
|
||||||
atomic.StoreUint32(&t.interrupt, 1)
|
t.interrupt.Store(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func bytesToHex(s []byte) string {
|
func bytesToHex(s []byte) string {
|
||||||
|
@ -102,8 +102,8 @@ type callTracer struct {
|
|||||||
callstack []callFrame
|
callstack []callFrame
|
||||||
config callTracerConfig
|
config callTracerConfig
|
||||||
gasLimit uint64
|
gasLimit uint64
|
||||||
interrupt uint32 // Atomic flag to signal execution interruption
|
interrupt atomic.Bool // Atomic flag to signal execution interruption
|
||||||
reason error // Textual reason for the interruption
|
reason error // Textual reason for the interruption
|
||||||
}
|
}
|
||||||
|
|
||||||
type callTracerConfig struct {
|
type callTracerConfig struct {
|
||||||
@ -161,7 +161,7 @@ func (t *callTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, sco
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Skip if tracing was interrupted
|
// Skip if tracing was interrupted
|
||||||
if atomic.LoadUint32(&t.interrupt) > 0 {
|
if t.interrupt.Load() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch op {
|
switch op {
|
||||||
@ -197,7 +197,7 @@ func (t *callTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Skip if tracing was interrupted
|
// Skip if tracing was interrupted
|
||||||
if atomic.LoadUint32(&t.interrupt) > 0 {
|
if t.interrupt.Load() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,7 +262,7 @@ func (t *callTracer) GetResult() (json.RawMessage, error) {
|
|||||||
// Stop terminates execution of the tracer at the first opportune moment.
|
// Stop terminates execution of the tracer at the first opportune moment.
|
||||||
func (t *callTracer) Stop(err error) {
|
func (t *callTracer) Stop(err error) {
|
||||||
t.reason = err
|
t.reason = err
|
||||||
atomic.StoreUint32(&t.interrupt, 1)
|
t.interrupt.Store(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// clearFailedLogs clears the logs of a callframe and all its children
|
// clearFailedLogs clears the logs of a callframe and all its children
|
||||||
|
@ -62,8 +62,8 @@ type prestateTracer struct {
|
|||||||
to common.Address
|
to common.Address
|
||||||
gasLimit uint64 // Amount of gas bought for the whole tx
|
gasLimit uint64 // Amount of gas bought for the whole tx
|
||||||
config prestateTracerConfig
|
config prestateTracerConfig
|
||||||
interrupt uint32 // Atomic flag to signal execution interruption
|
interrupt atomic.Bool // Atomic flag to signal execution interruption
|
||||||
reason error // Textual reason for the interruption
|
reason error // Textual reason for the interruption
|
||||||
created map[common.Address]bool
|
created map[common.Address]bool
|
||||||
deleted map[common.Address]bool
|
deleted map[common.Address]bool
|
||||||
}
|
}
|
||||||
@ -136,6 +136,10 @@ func (t *prestateTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// Skip if tracing was interrupted
|
||||||
|
if t.interrupt.Load() {
|
||||||
|
return
|
||||||
|
}
|
||||||
stack := scope.Stack
|
stack := scope.Stack
|
||||||
stackData := stack.Data()
|
stackData := stack.Data()
|
||||||
stackLen := len(stackData)
|
stackLen := len(stackData)
|
||||||
@ -259,7 +263,7 @@ func (t *prestateTracer) GetResult() (json.RawMessage, error) {
|
|||||||
// Stop terminates execution of the tracer at the first opportune moment.
|
// Stop terminates execution of the tracer at the first opportune moment.
|
||||||
func (t *prestateTracer) Stop(err error) {
|
func (t *prestateTracer) Stop(err error) {
|
||||||
t.reason = err
|
t.reason = err
|
||||||
atomic.StoreUint32(&t.interrupt, 1)
|
t.interrupt.Store(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// lookupAccount fetches details of an account and adds it to the prestate
|
// lookupAccount fetches details of an account and adds it to the prestate
|
||||||
|
Loading…
Reference in New Issue
Block a user