From 68b63d48a2528efc672ceddfbda4be8ef001bc04 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Mon, 12 Aug 2024 04:16:08 +0000 Subject: [PATCH] eth/tracers: read from kvdb directly Signed-off-by: jsvisa --- eth/tracers/live/filter.go | 47 +++++++++++++++++++++++----------- eth/tracers/live/filter_api.go | 6 +++-- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/eth/tracers/live/filter.go b/eth/tracers/live/filter.go index 3cffb45eaf..956115df15 100644 --- a/eth/tracers/live/filter.go +++ b/eth/tracers/live/filter.go @@ -1,6 +1,7 @@ package live import ( + "context" "encoding/binary" "encoding/json" "errors" @@ -37,6 +38,7 @@ type traceResult struct { } type filter struct { + backend tracers.Backend kvdb ethdb.Database frdb *rawdb.Freezer tables map[string]bool @@ -127,6 +129,7 @@ func newFilter(cfg json.RawMessage, backend tracers.Backend) (*tracing.Hooks, [] } f := &filter{ + backend: backend, kvdb: kvdb, frdb: frdb, tables: tables, @@ -170,7 +173,7 @@ func newFilter(cfg json.RawMessage, backend tracers.Backend) (*tracing.Hooks, [] apis := []rpc.API{ { Namespace: "trace", - Service: &filterAPI{filter: f}, + Service: &filterAPI{backend: backend, filter: f}, }, } return hooks, apis, nil @@ -272,28 +275,42 @@ func (f *filter) OnBlockEnd(err error) { // }) } -func (f *filter) readBlockTraces(name string, blknum uint64) ([]*traceResult, error) { - table := toTraceTable(name) - if _, ok := f.tables[table]; !ok { - return nil, errors.New("tracer not found") +func (f *filter) readBlockTraces(ctx context.Context, name string, blknum uint64) ([]*traceResult, error) { + header, err := f.backend.HeaderByNumber(ctx, rpc.BlockNumber(blknum)) + if err != nil { + return nil, err } - if blknum < f.offset.Load() || blknum > f.latest.Load() { - return nil, nil - } - - var data []byte - err := f.frdb.ReadAncients(func(reader ethdb.AncientReaderOp) error { - var err error - data, err = reader.Ancient(table, blknum-f.offset.Load()) - return err - }) + kvKey := toKVKey(name, blknum, header.Hash()) + data, err := f.kvdb.Get(kvKey) if err != nil { return nil, err } var traces []*traceResult err = json.Unmarshal(data, &traces) return traces, err + + // table := toTraceTable(name) + // if _, ok := f.tables[table]; !ok { + // return nil, errors.New("tracer not found") + // } + // + // if blknum < f.offset.Load() || blknum > f.latest.Load() { + // return nil, nil + // } + // + // var data []byte + // err := f.frdb.ReadAncients(func(reader ethdb.AncientReaderOp) error { + // var err error + // data, err = reader.Ancient(table, blknum-f.offset.Load()) + // return err + // }) + // if err != nil { + // return nil, err + // } + // var traces []*traceResult + // err = json.Unmarshal(data, &traces) + // return traces, err } func (f *filter) Close() { diff --git a/eth/tracers/live/filter_api.go b/eth/tracers/live/filter_api.go index 6c2bc58eae..d6e74a2a89 100644 --- a/eth/tracers/live/filter_api.go +++ b/eth/tracers/live/filter_api.go @@ -3,11 +3,13 @@ package live import ( "context" + "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/rpc" ) type filterAPI struct { - filter *filter + backend tracers.Backend + filter *filter } type traceConfig struct { @@ -29,5 +31,5 @@ func (api *filterAPI) Block(ctx context.Context, blockNr rpc.BlockNumber, cfg *t tracer = cfg.Tracer } - return api.filter.readBlockTraces(tracer, blknum) + return api.filter.readBlockTraces(ctx, tracer, blknum) }