eth/tracers: read from kvdb directly

Signed-off-by: jsvisa <delweng@gmail.com>
This commit is contained in:
jsvisa 2024-08-12 04:16:08 +00:00
parent d5632f55fb
commit 68b63d48a2
2 changed files with 36 additions and 17 deletions

View file

@ -1,6 +1,7 @@
package live package live
import ( import (
"context"
"encoding/binary" "encoding/binary"
"encoding/json" "encoding/json"
"errors" "errors"
@ -37,6 +38,7 @@ type traceResult struct {
} }
type filter struct { type filter struct {
backend tracers.Backend
kvdb ethdb.Database kvdb ethdb.Database
frdb *rawdb.Freezer frdb *rawdb.Freezer
tables map[string]bool tables map[string]bool
@ -127,6 +129,7 @@ func newFilter(cfg json.RawMessage, backend tracers.Backend) (*tracing.Hooks, []
} }
f := &filter{ f := &filter{
backend: backend,
kvdb: kvdb, kvdb: kvdb,
frdb: frdb, frdb: frdb,
tables: tables, tables: tables,
@ -170,7 +173,7 @@ func newFilter(cfg json.RawMessage, backend tracers.Backend) (*tracing.Hooks, []
apis := []rpc.API{ apis := []rpc.API{
{ {
Namespace: "trace", Namespace: "trace",
Service: &filterAPI{filter: f}, Service: &filterAPI{backend: backend, filter: f},
}, },
} }
return hooks, apis, nil return hooks, apis, nil
@ -272,28 +275,42 @@ func (f *filter) OnBlockEnd(err error) {
// }) // })
} }
func (f *filter) readBlockTraces(name string, blknum uint64) ([]*traceResult, error) { func (f *filter) readBlockTraces(ctx context.Context, name string, blknum uint64) ([]*traceResult, error) {
table := toTraceTable(name) header, err := f.backend.HeaderByNumber(ctx, rpc.BlockNumber(blknum))
if _, ok := f.tables[table]; !ok { if err != nil {
return nil, errors.New("tracer not found") return nil, err
} }
if blknum < f.offset.Load() || blknum > f.latest.Load() { kvKey := toKVKey(name, blknum, header.Hash())
return nil, nil data, err := f.kvdb.Get(kvKey)
}
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 { if err != nil {
return nil, err return nil, err
} }
var traces []*traceResult var traces []*traceResult
err = json.Unmarshal(data, &traces) err = json.Unmarshal(data, &traces)
return traces, err 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() { func (f *filter) Close() {

View file

@ -3,11 +3,13 @@ package live
import ( import (
"context" "context"
"github.com/ethereum/go-ethereum/eth/tracers"
"github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/rpc"
) )
type filterAPI struct { type filterAPI struct {
filter *filter backend tracers.Backend
filter *filter
} }
type traceConfig struct { type traceConfig struct {
@ -29,5 +31,5 @@ func (api *filterAPI) Block(ctx context.Context, blockNr rpc.BlockNumber, cfg *t
tracer = cfg.Tracer tracer = cfg.Tracer
} }
return api.filter.readBlockTraces(tracer, blknum) return api.filter.readBlockTraces(ctx, tracer, blknum)
} }