core/filtermaps: revert to legacy filter in case of "match all" search
This commit is contained in:
parent
932769e06c
commit
197c77792f
|
@ -11,6 +11,11 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ErrMatchAll is returned when the specified filter matches everything.
|
||||||
|
// Handling this case in filtermaps would require an extra special case and
|
||||||
|
// would actually be slower than reverting to legacy filter.
|
||||||
|
var ErrMatchAll = errors.New("match all patterns not supported")
|
||||||
|
|
||||||
// MatcherBackend defines the functions required for searching in the log index
|
// MatcherBackend defines the functions required for searching in the log index
|
||||||
// data structure. It is currently implemented by FilterMapsMatcherBackend but
|
// data structure. It is currently implemented by FilterMapsMatcherBackend but
|
||||||
// once EIP-7745 is implemented and active, these functions can also be trustlessly
|
// once EIP-7745 is implemented and active, these functions can also be trustlessly
|
||||||
|
@ -198,6 +203,9 @@ func getPotentialMatches(ctx context.Context, backend MatcherBackend, firstBlock
|
||||||
}
|
}
|
||||||
// get the actual logs located at the matching log value indices
|
// get the actual logs located at the matching log value indices
|
||||||
for _, m := range matches {
|
for _, m := range matches {
|
||||||
|
if m == nil {
|
||||||
|
return nil, ErrMatchAll
|
||||||
|
}
|
||||||
mlogs, err := getLogsFromMatches(ctx, backend, firstIndex, lastIndex, m)
|
mlogs, err := getLogsFromMatches(ctx, backend, firstIndex, lastIndex, m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return logs, err
|
return logs, err
|
||||||
|
|
|
@ -154,6 +154,30 @@ func (f *Filter) Logs(ctx context.Context) ([]*types.Log, error) {
|
||||||
mb := f.sys.backend.NewMatcherBackend()
|
mb := f.sys.backend.NewMatcherBackend()
|
||||||
logs, _, _, _, err := filtermaps.GetPotentialMatches(ctx, mb, uint64(f.begin), uint64(f.end), f.addresses, f.topics)
|
logs, _, _, _, err := filtermaps.GetPotentialMatches(ctx, mb, uint64(f.begin), uint64(f.end), f.addresses, f.topics)
|
||||||
mb.Close()
|
mb.Close()
|
||||||
|
if err == filtermaps.ErrMatchAll {
|
||||||
|
// revert to legacy filter
|
||||||
|
hdr, _ := f.sys.backend.HeaderByNumber(ctx, rpc.LatestBlockNumber)
|
||||||
|
if hdr == nil {
|
||||||
|
return nil, errors.New("latest header not found")
|
||||||
|
}
|
||||||
|
headNumber := hdr.Number.Int64()
|
||||||
|
if f.begin > headNumber {
|
||||||
|
f.begin = headNumber
|
||||||
|
}
|
||||||
|
if f.end > headNumber {
|
||||||
|
f.end = headNumber
|
||||||
|
}
|
||||||
|
logChan, errChan := f.rangeLogsAsync(ctx)
|
||||||
|
var logs []*types.Log
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case log := <-logChan:
|
||||||
|
logs = append(logs, log)
|
||||||
|
case err := <-errChan:
|
||||||
|
return logs, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
fmLogs := filterLogs(logs, nil, nil, f.addresses, f.topics)
|
fmLogs := filterLogs(logs, nil, nil, f.addresses, f.topics)
|
||||||
log.Debug("Finished log search", "run time", time.Since(start), "true matches", len(fmLogs), "false positives", len(logs)-len(fmLogs))
|
log.Debug("Finished log search", "run time", time.Since(start), "true matches", len(fmLogs), "false positives", len(logs)-len(fmLogs))
|
||||||
return fmLogs, err
|
return fmLogs, err
|
||||||
|
|
Loading…
Reference in New Issue