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
|
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() {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue