aboutsummaryrefslogtreecommitdiffstats
path: root/eth/filters/filter.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2018-02-22 18:48:14 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-02-23 01:12:43 +0800
commit5cf1d354704cd2cbc5c64c96d4aaabeeec7dd161 (patch)
tree10c38cbf3cd5a0e796d6df6c667cc84ce57e2a34 /eth/filters/filter.go
parent45352477933d71ec5055504da74547b0cdf0274b (diff)
downloadgo-tangerine-5cf1d354704cd2cbc5c64c96d4aaabeeec7dd161.tar
go-tangerine-5cf1d354704cd2cbc5c64c96d4aaabeeec7dd161.tar.gz
go-tangerine-5cf1d354704cd2cbc5c64c96d4aaabeeec7dd161.tar.bz2
go-tangerine-5cf1d354704cd2cbc5c64c96d4aaabeeec7dd161.tar.lz
go-tangerine-5cf1d354704cd2cbc5c64c96d4aaabeeec7dd161.tar.xz
go-tangerine-5cf1d354704cd2cbc5c64c96d4aaabeeec7dd161.tar.zst
go-tangerine-5cf1d354704cd2cbc5c64c96d4aaabeeec7dd161.zip
eth, les, light: filter on logs only, derive receipts on demand
Diffstat (limited to 'eth/filters/filter.go')
-rw-r--r--eth/filters/filter.go19
1 files changed, 16 insertions, 3 deletions
diff --git a/eth/filters/filter.go b/eth/filters/filter.go
index 43d7e2a81..5dfe60e77 100644
--- a/eth/filters/filter.go
+++ b/eth/filters/filter.go
@@ -34,6 +34,7 @@ type Backend interface {
EventMux() *event.TypeMux
HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error)
GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error)
+ GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error)
SubscribeTxPreEvent(chan<- core.TxPreEvent) event.Subscription
SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription
@@ -201,16 +202,28 @@ func (f *Filter) unindexedLogs(ctx context.Context, end uint64) ([]*types.Log, e
// match the filter criteria. This function is called when the bloom filter signals a potential match.
func (f *Filter) checkMatches(ctx context.Context, header *types.Header) (logs []*types.Log, err error) {
// Get the logs of the block
- receipts, err := f.backend.GetReceipts(ctx, header.Hash())
+ logsList, err := f.backend.GetLogs(ctx, header.Hash())
if err != nil {
return nil, err
}
var unfiltered []*types.Log
- for _, receipt := range receipts {
- unfiltered = append(unfiltered, receipt.Logs...)
+ for _, logs := range logsList {
+ unfiltered = append(unfiltered, logs...)
}
logs = filterLogs(unfiltered, nil, nil, f.addresses, f.topics)
if len(logs) > 0 {
+ // We have matching logs, check if we need to resolve full logs via the light client
+ if logs[0].TxHash == (common.Hash{}) {
+ receipts, err := f.backend.GetReceipts(ctx, header.Hash())
+ if err != nil {
+ return nil, err
+ }
+ unfiltered = unfiltered[:0]
+ for _, receipt := range receipts {
+ unfiltered = append(unfiltered, receipt.Logs...)
+ }
+ logs = filterLogs(unfiltered, nil, nil, f.addresses, f.topics)
+ }
return logs, nil
}
return nil, nil