erigon-pulse/turbo/jsonrpc/trace_api.go

51 lines
2.0 KiB
Go
Raw Normal View History

package jsonrpc
import (
"context"
"encoding/json"
"github.com/ledgerwatch/erigon-lib/common/hexutil"
jsoniter "github.com/json-iterator/go"
libcommon "github.com/ledgerwatch/erigon-lib/common"
2021-07-29 11:53:13 +00:00
"github.com/ledgerwatch/erigon-lib/kv"
"github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg"
"github.com/ledgerwatch/erigon/rpc"
)
// TraceAPI RPC interface into tracing API
type TraceAPI interface {
// Ad-hoc (see ./trace_adhoc.go)
trace_block: add new `gasBailOut` parameter to request (default: false) (#7326) **Problem** While tracing the block with Parity tracer(`trace_block`) it returns error for a few blocks. <details><summary>Example of blocks that couldn't be traced</summary> These are the example of payloads with the errors occured during tracing the blocks: 1. `{"method":"trace_block","params":["0x24165bd"],"id":0}` - `first run for txIndex 32 error: insufficient funds for gas * price + value: address 0x000005D814d5abD6e0F9345c9b1f37C82Eaf1EBb have 547961731687102852 want 675024999764675175` 2. `{"method":"trace_block","params":["0x2658753"],"id":0}` - `first run for txIndex 45 error: insufficient funds for gas * price + value: address 0x000004BeDC012a5D043270AF67de24c20a3b8aeB have 211658993830905595 want 235579381558610848` 3. `{"method":"trace_block","params":["0x258b00c"],"id":0} -first run for txIndex 274 error: insufficient funds for gas * price + value: address 0xA3a762006D22806B35895f4C0599bAe3adF1B349 have 342048586356638524 want 386865441635818752` </details> After looking through the [trace_filtering.go](https://github.com/ledgerwatch/erigon/blob/devel/cmd/rpcdaemon/commands/trace_filtering.go#L1006) and [trace_adhoc.go](https://github.com/ledgerwatch/erigon/blob/devel/cmd/rpcdaemon/commands/trace_adhoc.go#L1072) noticed that `doCallMany` called with `gasBailOut = true` in [one](https://github.com/ledgerwatch/erigon/blob/devel/cmd/rpcdaemon/commands/trace_adhoc.go#L1072) place and `gasBailOut = false` in [another](https://github.com/ledgerwatch/erigon/blob/devel/cmd/rpcdaemon/commands/trace_filtering.go#L1006) (actually the part of the code that is called by `trace_block`. Changing its value to `true` fixed the problem and traces are successful with this change. Attaching the partial result of the successful trace below. <details><summary>{"method":"trace_block","params":["0x24165bd"],"id":0}</summary> ```json { "jsonrpc": "2.0", "id": 0, "result": [ { "action": { "from": "0x3eaf7de168a79c1d6a1aab8c106e42b6f4e0a7c8", "callType": "call", "gas": "0x30464", "input": "0x0000000100000000000000000000000000000000000000000000000000000001dcbde73f0000000000000000000000000000000000000000000002086b35cd47c9189dc02791bca1f2de4661ed88a30c99a7a9449aa841740d500b1d8e8ef31e21c99d1db9a6444d3adf12700001f4000000000000000000000f490d8e000000000000", "to": "0x1d36f9688cceafee9d7df45fe8e24884ed0d6730", "value": "0x0" }, "blockHash": "0x96f0792349a67b7995dda853df79bd5fa9d2926eb2ac8a07ac46e4df429632af", "blockNumber": 37840317, "error": "Reverted", "result": { "gasUsed": "0x1d2d", "output": "0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000056572723332000000000000000000000000000000000000000000000000000000" }, "subtraces": 1, "traceAddress": [], "transactionHash": "0x1417cab7ae635884117909cc828474df0121d4a2a0ad033f462e6fa84bfab176", "transactionPosition": 0, "type": "call" }, { "action": { "from": "0x1d36f9688cceafee9d7df45fe8e24884ed0d6730", "callType": "staticcall", "gas": "0x2e9b7", "input": "0x3850c7bd", "to": "0xa374094527e1673a86de625aa59517c5de346d32", "value": "0x0" }, "blockHash": "0x96f0792349a67b7995dda853df79bd5fa9d2926eb2ac8a07ac46e4df429632af", "blockNumber": 37840317, "result": { "gasUsed": "0xa88", "output": "0x000000000000000000000000000000000000000000000f49c33e3991750050fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc158000000000000000000000000000000000000000000000000000000000000096d00000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" }, "subtraces": 0, "traceAddress": [ 0 ], ..... }, "blockHash": "0x96f0792349a67b7995dda853df79bd5fa9d2926eb2ac8a07ac46e4df429632af", "blockNumber": 37840317, "result": null, "subtraces": 0, "traceAddress": [], "type": "reward" } ] } ``` </details> --------- Co-authored-by: alexqrid <>
2023-04-21 02:28:04 +00:00
ReplayBlockTransactions(ctx context.Context, blockNr rpc.BlockNumberOrHash, traceTypes []string, gasBailOut *bool) ([]*TraceCallResult, error)
ReplayTransaction(ctx context.Context, txHash libcommon.Hash, traceTypes []string, gasBailOut *bool) (*TraceCallResult, error)
Call(ctx context.Context, call TraceCallParam, types []string, blockNr *rpc.BlockNumberOrHash) (*TraceCallResult, error)
CallMany(ctx context.Context, calls json.RawMessage, blockNr *rpc.BlockNumberOrHash) ([]*TraceCallResult, error)
RawTransaction(ctx context.Context, txHash libcommon.Hash, traceTypes []string) ([]interface{}, error)
// Filtering (see ./trace_filtering.go)
trace_block: add new `gasBailOut` parameter to request (default: false) (#7326) **Problem** While tracing the block with Parity tracer(`trace_block`) it returns error for a few blocks. <details><summary>Example of blocks that couldn't be traced</summary> These are the example of payloads with the errors occured during tracing the blocks: 1. `{"method":"trace_block","params":["0x24165bd"],"id":0}` - `first run for txIndex 32 error: insufficient funds for gas * price + value: address 0x000005D814d5abD6e0F9345c9b1f37C82Eaf1EBb have 547961731687102852 want 675024999764675175` 2. `{"method":"trace_block","params":["0x2658753"],"id":0}` - `first run for txIndex 45 error: insufficient funds for gas * price + value: address 0x000004BeDC012a5D043270AF67de24c20a3b8aeB have 211658993830905595 want 235579381558610848` 3. `{"method":"trace_block","params":["0x258b00c"],"id":0} -first run for txIndex 274 error: insufficient funds for gas * price + value: address 0xA3a762006D22806B35895f4C0599bAe3adF1B349 have 342048586356638524 want 386865441635818752` </details> After looking through the [trace_filtering.go](https://github.com/ledgerwatch/erigon/blob/devel/cmd/rpcdaemon/commands/trace_filtering.go#L1006) and [trace_adhoc.go](https://github.com/ledgerwatch/erigon/blob/devel/cmd/rpcdaemon/commands/trace_adhoc.go#L1072) noticed that `doCallMany` called with `gasBailOut = true` in [one](https://github.com/ledgerwatch/erigon/blob/devel/cmd/rpcdaemon/commands/trace_adhoc.go#L1072) place and `gasBailOut = false` in [another](https://github.com/ledgerwatch/erigon/blob/devel/cmd/rpcdaemon/commands/trace_filtering.go#L1006) (actually the part of the code that is called by `trace_block`. Changing its value to `true` fixed the problem and traces are successful with this change. Attaching the partial result of the successful trace below. <details><summary>{"method":"trace_block","params":["0x24165bd"],"id":0}</summary> ```json { "jsonrpc": "2.0", "id": 0, "result": [ { "action": { "from": "0x3eaf7de168a79c1d6a1aab8c106e42b6f4e0a7c8", "callType": "call", "gas": "0x30464", "input": "0x0000000100000000000000000000000000000000000000000000000000000001dcbde73f0000000000000000000000000000000000000000000002086b35cd47c9189dc02791bca1f2de4661ed88a30c99a7a9449aa841740d500b1d8e8ef31e21c99d1db9a6444d3adf12700001f4000000000000000000000f490d8e000000000000", "to": "0x1d36f9688cceafee9d7df45fe8e24884ed0d6730", "value": "0x0" }, "blockHash": "0x96f0792349a67b7995dda853df79bd5fa9d2926eb2ac8a07ac46e4df429632af", "blockNumber": 37840317, "error": "Reverted", "result": { "gasUsed": "0x1d2d", "output": "0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000056572723332000000000000000000000000000000000000000000000000000000" }, "subtraces": 1, "traceAddress": [], "transactionHash": "0x1417cab7ae635884117909cc828474df0121d4a2a0ad033f462e6fa84bfab176", "transactionPosition": 0, "type": "call" }, { "action": { "from": "0x1d36f9688cceafee9d7df45fe8e24884ed0d6730", "callType": "staticcall", "gas": "0x2e9b7", "input": "0x3850c7bd", "to": "0xa374094527e1673a86de625aa59517c5de346d32", "value": "0x0" }, "blockHash": "0x96f0792349a67b7995dda853df79bd5fa9d2926eb2ac8a07ac46e4df429632af", "blockNumber": 37840317, "result": { "gasUsed": "0xa88", "output": "0x000000000000000000000000000000000000000000000f49c33e3991750050fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc158000000000000000000000000000000000000000000000000000000000000096d00000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" }, "subtraces": 0, "traceAddress": [ 0 ], ..... }, "blockHash": "0x96f0792349a67b7995dda853df79bd5fa9d2926eb2ac8a07ac46e4df429632af", "blockNumber": 37840317, "result": null, "subtraces": 0, "traceAddress": [], "type": "reward" } ] } ``` </details> --------- Co-authored-by: alexqrid <>
2023-04-21 02:28:04 +00:00
Transaction(ctx context.Context, txHash libcommon.Hash, gasBailOut *bool) (ParityTraces, error)
Get(ctx context.Context, txHash libcommon.Hash, txIndicies []hexutil.Uint64, gasBailOut *bool) (*ParityTrace, error)
Block(ctx context.Context, blockNr rpc.BlockNumber, gasBailOut *bool) (ParityTraces, error)
Filter(ctx context.Context, req TraceFilterRequest, gasBailOut *bool, stream *jsoniter.Stream) error
}
// TraceAPIImpl is implementation of the TraceAPI interface based on remote Db access
type TraceAPIImpl struct {
*BaseAPI
kv kv.RoDB
maxTraces uint64
gasCap uint64
compatibility bool // Bug for bug compatiblity with OpenEthereum
}
// NewTraceAPI returns NewTraceAPI instance
func NewTraceAPI(base *BaseAPI, kv kv.RoDB, cfg *httpcfg.HttpCfg) *TraceAPIImpl {
return &TraceAPIImpl{
BaseAPI: base,
kv: kv,
maxTraces: cfg.MaxTraces,
gasCap: cfg.Gascap,
compatibility: cfg.TraceCompatibility,
}
}