Skip to content

Commit 52077f1

Browse files
authored
support for golang tracers + add golang callTracer (#558)
* feat: rename Tracer interface to EVMLogger; minor changes in API refine api_tracer.go refine Tracer interface * fix: broken tracer tests * feat: add BenchmarkTransactionTrace * feat: tracer CaptureEnter CaptureExit in evm * feat: upgrade js tracers with geth upstream * chore: clean test * feat: eth/tracers: support for golang tracers + add golang callTracer cf. ethereum#23708 * chore: clean testdata json * fix: change test due to IntrinsicGas is not upgraded * feat: make native Tracer the default Tracer * fix: update tracers.New in api * fix: addr prefix in callTracer * fix: remove `native` in BenchmarkTracers * fix: return consensus error of InsufficientBalance for tx, instead of vmerr * chore: drop js tracers: call and noop
1 parent 9a40c26 commit 52077f1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2877
-561
lines changed

cmd/XDC/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ import (
3737
"github.com/XinFinOrg/XDPoSChain/log"
3838
"github.com/XinFinOrg/XDPoSChain/metrics"
3939
"github.com/XinFinOrg/XDPoSChain/node"
40+
41+
// Force-load the native, to trigger registration
42+
_ "github.com/XinFinOrg/XDPoSChain/eth/tracers/native"
43+
4044
"gopkg.in/urfave/cli.v1"
4145
)
4246

cmd/evm/json_logger.go

Lines changed: 0 additions & 90 deletions
This file was deleted.

cmd/evm/runner.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,20 +75,20 @@ func runCmd(ctx *cli.Context) error {
7575
glogger.Verbosity(log.Lvl(ctx.GlobalInt(VerbosityFlag.Name)))
7676
log.Root().SetHandler(glogger)
7777
logconfig := &vm.LogConfig{
78-
DisableMemory: ctx.GlobalBool(DisableMemoryFlag.Name),
78+
EnableMemory: !ctx.GlobalBool(DisableMemoryFlag.Name),
7979
DisableStack: ctx.GlobalBool(DisableStackFlag.Name),
8080
}
8181

8282
var (
83-
tracer vm.Tracer
83+
tracer vm.EVMLogger
8484
debugLogger *vm.StructLogger
8585
statedb *state.StateDB
8686
chainConfig *params.ChainConfig
8787
sender = common.StringToAddress("sender")
8888
receiver = common.StringToAddress("receiver")
8989
)
9090
if ctx.GlobalBool(MachineFlag.Name) {
91-
tracer = NewJSONLogger(logconfig, os.Stdout)
91+
tracer = vm.NewJSONLogger(logconfig, os.Stdout)
9292
} else if ctx.GlobalBool(DebugFlag.Name) {
9393
debugLogger = vm.NewStructLogger(logconfig)
9494
tracer = debugLogger

cmd/evm/staterunner.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,16 @@ func stateTestCmd(ctx *cli.Context) error {
5656

5757
// Configure the EVM logger
5858
config := &vm.LogConfig{
59-
DisableMemory: ctx.GlobalBool(DisableMemoryFlag.Name),
60-
DisableStack: ctx.GlobalBool(DisableStackFlag.Name),
59+
EnableMemory: !ctx.GlobalBool(DisableMemoryFlag.Name),
60+
DisableStack: ctx.GlobalBool(DisableStackFlag.Name),
6161
}
6262
var (
63-
tracer vm.Tracer
63+
tracer vm.EVMLogger
6464
debugger *vm.StructLogger
6565
)
6666
switch {
6767
case ctx.GlobalBool(MachineFlag.Name):
68-
tracer = NewJSONLogger(config, os.Stderr)
68+
tracer = vm.NewJSONLogger(config, os.Stderr)
6969

7070
case ctx.GlobalBool(DebugFlag.Name):
7171
debugger = vm.NewStructLogger(config)

core/error.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,7 @@ var (
4646
// ErrTxTypeNotSupported is returned if a transaction is not supported in the
4747
// current network configuration.
4848
ErrTxTypeNotSupported = types.ErrTxTypeNotSupported
49+
50+
// ErrGasUintOverflow is returned when calculating gas usage.
51+
ErrGasUintOverflow = errors.New("gas uint64 overflow")
4952
)

core/state_transition.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package core
1818

1919
import (
2020
"errors"
21+
"fmt"
2122
"math"
2223
"math/big"
2324

@@ -100,13 +101,13 @@ func IntrinsicGas(data []byte, accessList types.AccessList, isContractCreation,
100101
}
101102
// Make sure we don't exceed uint64 for all data combinations
102103
if (math.MaxUint64-gas)/params.TxDataNonZeroGas < nz {
103-
return 0, vm.ErrOutOfGas
104+
return 0, ErrGasUintOverflow
104105
}
105106
gas += nz * params.TxDataNonZeroGas
106107

107108
z := uint64(len(data)) - nz
108109
if (math.MaxUint64-gas)/params.TxDataZeroGas < z {
109-
return 0, vm.ErrOutOfGas
110+
return 0, ErrGasUintOverflow
110111
}
111112
gas += z * params.TxDataZeroGas
112113
}
@@ -169,15 +170,6 @@ func (st *StateTransition) to() vm.AccountRef {
169170
return reference
170171
}
171172

172-
func (st *StateTransition) useGas(amount uint64) error {
173-
if st.gas < amount {
174-
return vm.ErrOutOfGas
175-
}
176-
st.gas -= amount
177-
178-
return nil
179-
}
180-
181173
func (st *StateTransition) buyGas() error {
182174
var (
183175
state = st.state
@@ -238,9 +230,10 @@ func (st *StateTransition) TransitionDb(owner common.Address) (ret []byte, usedG
238230
if err != nil {
239231
return nil, 0, false, err, nil
240232
}
241-
if err = st.useGas(gas); err != nil {
242-
return nil, 0, false, err, nil
233+
if st.gas < gas {
234+
return nil, 0, false, fmt.Errorf("%w: have %d, want %d", ErrIntrinsicGas, st.gas, gas), nil
243235
}
236+
st.gas -= gas
244237

245238
if rules := st.evm.ChainConfig().Rules(st.evm.Context.BlockNumber); rules.IsEIP1559 {
246239
st.state.PrepareAccessList(msg.From(), msg.To(), vm.ActivePrecompiles(rules), msg.AccessList())
@@ -286,7 +279,7 @@ func (st *StateTransition) TransitionDb(owner common.Address) (ret []byte, usedG
286279
st.state.AddBalance(st.evm.Coinbase, new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice))
287280
}
288281

289-
return ret, st.gasUsed(), vmerr != nil, err, vmerr
282+
return ret, st.gasUsed(), vmerr != nil, nil, vmerr
290283
}
291284

292285
func (st *StateTransition) refundGas() {

core/vm/access_list_tracer.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (al accessList) equal(other accessList) bool {
9696
func (al accessList) accessList() types.AccessList {
9797
acl := make(types.AccessList, 0, len(al))
9898
for addr, slots := range al {
99-
tuple := types.AccessTuple{Address: addr}
99+
tuple := types.AccessTuple{Address: addr, StorageKeys: []common.Hash{}}
100100
for slot := range slots {
101101
tuple.StorageKeys = append(tuple.StorageKeys, slot)
102102
}
@@ -166,6 +166,11 @@ func (*AccessListTracer) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost
166166

167167
func (*AccessListTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {}
168168

169+
func (*AccessListTracer) CaptureEnter(typ OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
170+
}
171+
172+
func (*AccessListTracer) CaptureExit(output []byte, gasUsed uint64, err error) {}
173+
169174
// AccessList returns the current accesslist maintained by the tracer.
170175
func (a *AccessListTracer) AccessList() types.AccessList {
171176
return a.list.accessList()

0 commit comments

Comments
 (0)