diff --git a/cmd/rpcdaemon/commands/trace_adhoc.go b/cmd/rpcdaemon/commands/trace_adhoc.go index b48dcf7c14df509e853b7aef5718c06bf7ed2409..99335bbada3b88187718d44a187b3f35360a2ba1 100644 --- a/cmd/rpcdaemon/commands/trace_adhoc.go +++ b/cmd/rpcdaemon/commands/trace_adhoc.go @@ -60,10 +60,11 @@ type TraceCallParam struct { // TraceCallResult is the response to `trace_call` method type TraceCallResult struct { - Output hexutil.Bytes `json:"output"` - StateDiff map[common.Address]*StateDiffAccount `json:"stateDiff"` - Trace []*ParityTrace `json:"trace"` - VmTrace *TraceCallVmTrace `json:"vmTrace"` + Output hexutil.Bytes `json:"output"` + StateDiff map[common.Address]*StateDiffAccount `json:"stateDiff"` + Trace []*ParityTrace `json:"trace"` + VmTrace *TraceCallVmTrace `json:"vmTrace"` + TransactionHash *common.Hash `json:"transactionHash,omitempty"` } // StateDiffAccount is the part of `trace_call` response that is under "stateDiff" tag @@ -538,7 +539,7 @@ func (api *TraceAPIImpl) ReplayTransaction(ctx context.Context, txHash common.Ha } // Returns an array of trace arrays, one trace array for each transaction - traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), txIndex, types.MakeSigner(chainConfig, *blockNumber)) + traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), traceTypes, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), txIndex, types.MakeSigner(chainConfig, *blockNumber)) if err != nil { return nil, err } @@ -622,7 +623,7 @@ func (api *TraceAPIImpl) ReplayBlockTransactions(ctx context.Context, blockNrOrH } // Returns an array of trace arrays, one trace array for each transaction - traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, blockNumber)) + traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), traceTypes, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, blockNumber)) if err != nil { return nil, err } @@ -645,12 +646,8 @@ func (api *TraceAPIImpl) ReplayBlockTransactions(ctx context.Context, blockNrOrH tr.VmTrace = trace.VmTrace } result[i] = tr - for _, pt := range tr.Trace { - txpos := uint64(i) - txhash := block.Transactions()[i].Hash() - pt.TransactionHash = &txhash - pt.TransactionPosition = &txpos - } + txhash := block.Transactions()[i].Hash() + tr.TransactionHash = &txhash } return result, nil @@ -925,13 +922,11 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } } vmConfig := vm.Config{} - if txIndexNeeded == -1 || txIndex == txIndexNeeded { + if traceTypeTrace && (txIndexNeeded == -1 || txIndex == txIndexNeeded) { var ot OeTracer ot.compat = api.compatibility - if traceTypeTrace { - ot.r = traceResult - ot.traceAddr = []int{} - } + ot.r = traceResult + ot.traceAddr = []int{} vmConfig.Debug = true vmConfig.Tracer = &ot } diff --git a/cmd/rpcdaemon/commands/trace_filtering.go b/cmd/rpcdaemon/commands/trace_filtering.go index 7f12f35eea06c2bdbbd0ac153759f8ca69f2e0f4..942efb3b48a8296aec270238f30b3dc575facfbf 100644 --- a/cmd/rpcdaemon/commands/trace_filtering.go +++ b/cmd/rpcdaemon/commands/trace_filtering.go @@ -60,7 +60,7 @@ func (api *TraceAPIImpl) Transaction(ctx context.Context, txHash common.Hash) (P hash := block.Hash() // Returns an array of trace arrays, one trace array for each transaction - traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), txIndex, types.MakeSigner(chainConfig, *blockNumber)) + traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), txIndex, types.MakeSigner(chainConfig, *blockNumber)) if err != nil { return nil, err } @@ -142,7 +142,7 @@ func (api *TraceAPIImpl) Block(ctx context.Context, blockNr rpc.BlockNumber) (Pa if err != nil { return nil, err } - traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, blockNum)) + traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, blockNum)) if err != nil { return nil, err } @@ -293,7 +293,7 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str blockHash := block.Hash() blockNumber := block.NumberU64() txs := block.Transactions() - t, tErr := api.callManyTransactions(ctx, dbtx, txs, block.ParentHash(), rpc.BlockNumber(block.NumberU64()-1), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, b)) + t, tErr := api.callManyTransactions(ctx, dbtx, txs, []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(block.NumberU64()-1), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, b)) if tErr != nil { stream.WriteNil() return tErr @@ -415,14 +415,14 @@ func filter_trace(pt *ParityTrace, fromAddresses map[common.Address]struct{}, to return false } -func (api *TraceAPIImpl) callManyTransactions(ctx context.Context, dbtx kv.Tx, txs []types.Transaction, parentHash common.Hash, parentNo rpc.BlockNumber, header *types.Header, txIndex int, signer *types.Signer) ([]*TraceCallResult, error) { +func (api *TraceAPIImpl) callManyTransactions(ctx context.Context, dbtx kv.Tx, txs []types.Transaction, traceTypes []string, parentHash common.Hash, parentNo rpc.BlockNumber, header *types.Header, txIndex int, signer *types.Signer) ([]*TraceCallResult, error) { callParams := make([]TraceCallParam, 0, len(txs)) msgs := make([]types.Message, len(txs)) for i, tx := range txs { hash := tx.Hash() callParams = append(callParams, TraceCallParam{ txHash: &hash, - traceTypes: []string{TraceTypeTrace, TraceTypeStateDiff}, + traceTypes: traceTypes, }) var err error if msgs[i], err = tx.AsMessage(*signer, header.BaseFee); err != nil {