Skip to content

Commit 150c6e5

Browse files
authored
Merge pull request #490 from iotaledger/merge-evmtrace
Merge wasp/develop
2 parents 962a8ff + 260a0cb commit 150c6e5

File tree

23 files changed

+279
-362
lines changed

23 files changed

+279
-362
lines changed

packages/chainutil/evmcall.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func EVMCall(
5151
log,
5252
time.Now(),
5353
iscReq,
54+
true,
5455
)
5556
if err != nil {
5657
return nil, err

packages/chainutil/evmestimategas.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ func EVMEstimateGas(
7676
log,
7777
blockTime,
7878
iscReq,
79+
true,
7980
)
8081
if err != nil {
8182
return true, nil, err

packages/chainutil/evmtrace.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,14 @@ import (
1212
"github.com/iotaledger/wasp/packages/vm/processors"
1313
)
1414

15-
func EVMTraceTransaction(
15+
func EVMTrace(
1616
anchor *isc.StateAnchor,
1717
l1Params *parameters.L1Params,
1818
store indexedstore.IndexedStore,
1919
processors *processors.Config,
2020
log *logger.Logger,
2121
blockTime time.Time,
2222
iscRequestsInBlock []isc.Request,
23-
txIndex *uint64,
24-
blockNumber *uint64,
2523
tracer *tracers.Tracer,
2624
) error {
2725
_, err := runISCTask(
@@ -32,11 +30,8 @@ func EVMTraceTransaction(
3230
log,
3331
blockTime,
3432
iscRequestsInBlock,
35-
&isc.EVMTracer{
36-
Tracer: tracer,
37-
TxIndex: txIndex,
38-
BlockNumber: blockNumber,
39-
},
33+
false,
34+
tracer,
4035
)
4136
return err
4237
}

packages/chainutil/runvm.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"errors"
55
"time"
66

7+
"github.com/ethereum/go-ethereum/eth/tracers"
78
"github.com/samber/lo"
89
"go.uber.org/zap"
910

@@ -30,16 +31,13 @@ func runISCTask(
3031
log *logger.Logger,
3132
blockTime time.Time,
3233
reqs []isc.Request,
33-
evmTracer *isc.EVMTracer,
34+
estimateGasMode bool,
35+
evmTracer *tracers.Tracer,
3436
) ([]*vm.RequestResult, error) {
3537
migs, err := getMigrationsForBlock(store, anchor)
3638
if err != nil {
3739
return nil, err
3840
}
39-
estimateGasMode := true
40-
if evmTracer != nil {
41-
estimateGasMode = false
42-
}
4341
task := &vm.VMTask{
4442
Processors: processors,
4543
Anchor: anchor,
@@ -91,6 +89,7 @@ func runISCRequest(
9189
log *logger.Logger,
9290
blockTime time.Time,
9391
req isc.Request,
92+
estimateGasMode bool,
9493
) (*vm.RequestResult, error) {
9594
results, err := runISCTask(
9695
anchor,
@@ -100,6 +99,7 @@ func runISCRequest(
10099
log,
101100
blockTime,
102101
[]isc.Request{req},
102+
estimateGasMode,
103103
nil,
104104
)
105105
if err != nil {

packages/chainutil/simulate_request.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func SimulateRequest(
1818
processors *processors.Config,
1919
log *logger.Logger,
2020
req isc.Request,
21+
estimateGasMode bool,
2122
) (*blocklog.RequestReceipt, error) {
2223
res, err := runISCRequest(
2324
anchor,
@@ -27,6 +28,7 @@ func SimulateRequest(
2728
log,
2829
time.Now(),
2930
req,
31+
estimateGasMode,
3032
)
3133
if err != nil {
3234
return nil, err

packages/evm/jsonrpc/chainbackend.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,10 @@ type ChainBackend interface {
2222
EVMSendTransaction(tx *types.Transaction) error
2323
EVMCall(anchor *isc.StateAnchor, callMsg ethereum.CallMsg, l1Params *parameters.L1Params) ([]byte, error)
2424
EVMEstimateGas(anchor *isc.StateAnchor, callMsg ethereum.CallMsg, l1Params *parameters.L1Params) (uint64, error)
25-
EVMTraceTransaction(
25+
EVMTrace(
2626
anchor *isc.StateAnchor,
2727
blockTime time.Time,
2828
iscRequestsInBlock []isc.Request,
29-
txIndex *uint64,
30-
blockNumber *uint64,
3129
tracer *tracers.Tracer,
3230
l1Params *parameters.L1Params,
3331
) error

packages/evm/jsonrpc/evmchain.go

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -672,36 +672,46 @@ func (e *EVMChain) traceTransaction(
672672
tracerType = *config.Tracer
673673
}
674674

675-
blockNumber := uint64(blockInfo.BlockIndex)
676-
677-
tracer, err := newTracer(tracerType, &tracers.Context{
678-
BlockHash: blockHash,
679-
BlockNumber: new(big.Int).SetUint64(blockNumber),
680-
TxIndex: int(txIndex),
681-
TxHash: tx.Hash(),
682-
}, config.TracerConfig, false, nil)
675+
tracer, err := newTracer(
676+
tracerType,
677+
&tracers.Context{
678+
BlockHash: blockHash,
679+
BlockNumber: new(big.Int).SetUint64(uint64(blockInfo.BlockIndex)),
680+
TxIndex: int(txIndex),
681+
TxHash: tx.Hash(),
682+
},
683+
config.TracerConfig,
684+
)
683685
if err != nil {
684686
return nil, err
685687
}
686688

687-
if evmutil.IsFakeTransaction(tx) {
688-
return tracer.TraceFakeTx(tx)
689-
}
690-
691-
err = e.backend.EVMTraceTransaction(
689+
err = e.backend.EVMTrace(
692690
blockInfo.PreviousAnchor,
693691
blockInfo.Timestamp,
694692
requestsInBlock,
695-
&txIndex,
696-
&blockNumber,
697-
tracer.Tracer,
693+
tracer,
698694
blockInfo.L1Params,
699695
)
700696
if err != nil {
701697
return nil, err
702698
}
703699

704-
return tracer.GetResult()
700+
res, err := tracer.GetResult()
701+
if err != nil {
702+
return nil, err
703+
}
704+
705+
var txResults []TxTraceResult
706+
err = json.Unmarshal(res, &txResults)
707+
if err != nil {
708+
return nil, err
709+
}
710+
711+
if len(txResults) <= int(txIndex) {
712+
return nil, errors.New("tx trace not found in tracer result")
713+
}
714+
return txResults[int(txIndex)].Result, nil
705715
}
706716

707717
func (e *EVMChain) debugTraceBlock(config *tracers.TraceConfig, block *types.Block) (any, error) {
@@ -715,31 +725,28 @@ func (e *EVMChain) debugTraceBlock(config *tracers.TraceConfig, block *types.Blo
715725
tracerType = *config.Tracer
716726
}
717727

718-
blockNumber := uint64(iscBlock.BlockIndex)
719-
720-
blockTxs := block.Transactions()
721-
722-
tracer, err := newTracer(tracerType, &tracers.Context{
723-
BlockHash: block.Hash(),
724-
BlockNumber: new(big.Int).SetUint64(blockNumber),
725-
}, config.TracerConfig, true, blockTxs)
728+
tracer, err := newTracer(
729+
tracerType,
730+
&tracers.Context{
731+
BlockHash: block.Hash(),
732+
BlockNumber: new(big.Int).SetUint64(uint64(iscBlock.BlockIndex)),
733+
},
734+
config.TracerConfig,
735+
)
726736
if err != nil {
727737
return nil, err
728738
}
729739

730-
err = e.backend.EVMTraceTransaction(
740+
err = e.backend.EVMTrace(
731741
iscBlock.PreviousAnchor,
732742
iscBlock.Timestamp,
733743
iscRequestsInBlock,
734-
nil,
735-
&blockNumber,
736-
tracer.Tracer,
744+
tracer,
737745
iscBlock.L1Params,
738746
)
739747
if err != nil {
740748
return nil, err
741749
}
742-
743750
return tracer.GetResult()
744751
}
745752

packages/evm/jsonrpc/jsonrpctest/jsonrpc_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -611,15 +611,15 @@ func TestRPCTraceTx(t *testing.T) {
611611

612612
t.Run("prestate", func(t *testing.T) {
613613
accountMap, err := env.traceTransactionWithPrestate(tx1.Hash())
614+
// t.Logf("%s", lo.Must(json.MarshalIndent(accountMap, "", " ")))
614615
require.NoError(t, err)
615616
require.NotEmpty(t, accountMap)
616-
// t.Logf("%s", lo.Must(json.MarshalIndent(accountMap, "", " ")))
617617

618618
diff, err := env.traceTransactionWithPrestateDiff(tx1.Hash())
619+
// t.Logf("%s", lo.Must(json.MarshalIndent(diff, "", " ")))
619620
require.NoError(t, err)
620621
require.NotEmpty(t, diff.Pre)
621622
require.NotEmpty(t, diff.Post)
622-
// t.Logf("%s", lo.Must(json.MarshalIndent(diff, "", " ")))
623623
})
624624
}
625625

packages/evm/jsonrpc/tracer.go

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,32 @@ import (
44
"encoding/json"
55
"fmt"
66

7-
"github.com/ethereum/go-ethereum/core/types"
7+
"github.com/ethereum/go-ethereum/common"
88
"github.com/ethereum/go-ethereum/eth/tracers"
9-
10-
"github.com/iotaledger/wasp/packages/evm/evmutil"
119
)
1210

13-
type Tracer struct {
14-
*tracers.Tracer
15-
TraceFakeTx func(tx *types.Transaction) (json.RawMessage, error)
16-
}
17-
18-
type tracerFactory func(traceCtx *tracers.Context, cfg json.RawMessage, traceBlock bool, initValue any) (*Tracer, error)
11+
type tracerFactory func(traceCtx *tracers.Context, cfg json.RawMessage) (*tracers.Tracer, error)
1912

2013
var allTracers = map[string]tracerFactory{}
2114

2215
func registerTracer(tracerType string, fn tracerFactory) {
2316
allTracers[tracerType] = fn
2417
}
2518

26-
func newTracer(tracerType string, ctx *tracers.Context, cfg json.RawMessage, traceBlock bool, initValue any) (*Tracer, error) {
19+
func newTracer(
20+
tracerType string,
21+
ctx *tracers.Context,
22+
cfg json.RawMessage,
23+
) (*tracers.Tracer, error) {
2724
fn := allTracers[tracerType]
2825
if fn == nil {
2926
return nil, fmt.Errorf("unsupported tracer type: %s", tracerType)
3027
}
31-
return fn(ctx, cfg, traceBlock, initValue)
28+
return fn(ctx, cfg)
3229
}
3330

34-
func GetTraceResults(
35-
blockTxs []*types.Transaction,
36-
traceBlock bool,
37-
getFakeTxTrace func(tx *types.Transaction) (json.RawMessage, error),
38-
getTxTrace func(tx *types.Transaction) (json.RawMessage, error),
39-
getSingleTxTrace func() (json.RawMessage, error),
40-
reason error,
41-
) (json.RawMessage, error) {
42-
var traceResult []byte
43-
var err error
44-
if traceBlock {
45-
results := make([]TxTraceResult, 0, len(blockTxs))
46-
var jsResult json.RawMessage
47-
for _, tx := range blockTxs {
48-
if evmutil.IsFakeTransaction(tx) {
49-
jsResult, err = getFakeTxTrace(tx)
50-
if err != nil {
51-
return nil, err
52-
}
53-
} else {
54-
jsResult, err = getTxTrace(tx)
55-
if err != nil {
56-
return nil, err
57-
}
58-
}
59-
60-
results = append(results, TxTraceResult{TxHash: tx.Hash(), Result: jsResult})
61-
}
62-
63-
traceResult, err = json.Marshal(results)
64-
if err != nil {
65-
return nil, err
66-
}
67-
} else {
68-
traceResult, err = getSingleTxTrace()
69-
if err != nil {
70-
return nil, err
71-
}
72-
}
73-
74-
return traceResult, reason
31+
type TxTraceResult struct {
32+
TxHash common.Hash `json:"txHash"` // transaction hash
33+
Result json.RawMessage `json:"result,omitempty"` // Trace results produced by the tracer
34+
Error string `json:"error,omitempty"` // Trace failure produced by the tracer
7535
}

0 commit comments

Comments
 (0)