mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 02:12:23 +00:00
eth/tracers: read from kvdb directly
Signed-off-by: jsvisa <delweng@gmail.com>
This commit is contained in:
parent
d5632f55fb
commit
68b63d48a2
2 changed files with 36 additions and 17 deletions
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue