aboutsummaryrefslogtreecommitdiffstats
path: root/eth/filters/api.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2018-07-12 22:36:07 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-07-12 23:16:54 +0800
commite1f1d3085c6b868de93313700cac8a325e9b148b (patch)
treeb5a2c834735e0a1405a975d3552df07aebe0e2e0 /eth/filters/api.go
parent96339daf40989072ff2a9e8b476da6698da45dc7 (diff)
downloadgo-tangerine-e1f1d3085c6b868de93313700cac8a325e9b148b.tar
go-tangerine-e1f1d3085c6b868de93313700cac8a325e9b148b.tar.gz
go-tangerine-e1f1d3085c6b868de93313700cac8a325e9b148b.tar.bz2
go-tangerine-e1f1d3085c6b868de93313700cac8a325e9b148b.tar.lz
go-tangerine-e1f1d3085c6b868de93313700cac8a325e9b148b.tar.xz
go-tangerine-e1f1d3085c6b868de93313700cac8a325e9b148b.tar.zst
go-tangerine-e1f1d3085c6b868de93313700cac8a325e9b148b.zip
accounts, eth, les: blockhash based filtering on all code paths
Diffstat (limited to 'eth/filters/api.go')
-rw-r--r--eth/filters/api.go62
1 files changed, 29 insertions, 33 deletions
diff --git a/eth/filters/api.go b/eth/filters/api.go
index f964d9232..4e686c0ce 100644
--- a/eth/filters/api.go
+++ b/eth/filters/api.go
@@ -28,7 +28,6 @@ import (
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
@@ -325,36 +324,26 @@ func (api *PublicFilterAPI) NewFilter(crit FilterCriteria) (rpc.ID, error) {
//
// https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getlogs
func (api *PublicFilterAPI) GetLogs(ctx context.Context, crit FilterCriteria) ([]*types.Log, error) {
- var (
- fromBlock int64
- toBlock int64
- )
-
+ var filter *Filter
if crit.BlockHash != nil {
- // look up block number from block hash
- if block := rawdb.ReadHeaderNumber(api.chainDb, *crit.BlockHash); block != nil {
- // verify block is part of canonical chain
- if canonical := rawdb.ReadCanonicalHash(api.chainDb, *block); canonical != *crit.BlockHash {
- return nil, fmt.Errorf("Block with hash %s was removed from canonical chain", crit.BlockHash.Hex())
- }
- fromBlock = int64(*block)
- toBlock = fromBlock
- } else {
- return nil, fmt.Errorf("Block with hash %s was not found", crit.BlockHash.Hex())
- }
+ // Block filter requested, construct a single-shot filter
+ filter = NewBlockFilter(api.backend, *crit.BlockHash, crit.Addresses, crit.Topics)
} else {
// Convert the RPC block numbers into internal representations
+ var (
+ begin int64
+ end int64
+ )
if crit.FromBlock == nil {
- fromBlock = int64(rpc.LatestBlockNumber)
+ begin = int64(rpc.LatestBlockNumber)
}
if crit.ToBlock == nil {
- toBlock = int64(rpc.LatestBlockNumber)
+ end = int64(rpc.LatestBlockNumber)
}
+ // Construct the range filter
+ filter = NewRangeFilter(api.backend, begin, end, crit.Addresses, crit.Topics)
}
-
- // Create and run the filter to get all the logs
- filter := New(api.backend, fromBlock, toBlock, crit.Addresses, crit.Topics)
-
+ // Run the filter and return all the logs
logs, err := filter.Logs(ctx)
if err != nil {
return nil, err
@@ -392,17 +381,24 @@ func (api *PublicFilterAPI) GetFilterLogs(ctx context.Context, id rpc.ID) ([]*ty
return nil, fmt.Errorf("filter not found")
}
- begin := rpc.LatestBlockNumber.Int64()
- if f.crit.FromBlock != nil {
- begin = f.crit.FromBlock.Int64()
- }
- end := rpc.LatestBlockNumber.Int64()
- if f.crit.ToBlock != nil {
- end = f.crit.ToBlock.Int64()
+ var filter *Filter
+ if f.crit.BlockHash != nil {
+ // Block filter requested, construct a single-shot filter
+ filter = NewBlockFilter(api.backend, *f.crit.BlockHash, f.crit.Addresses, f.crit.Topics)
+ } else {
+ // Convert the RPC block numbers into internal representations
+ begin := rpc.LatestBlockNumber.Int64()
+ if f.crit.FromBlock != nil {
+ begin = f.crit.FromBlock.Int64()
+ }
+ end := rpc.LatestBlockNumber.Int64()
+ if f.crit.ToBlock != nil {
+ end = f.crit.ToBlock.Int64()
+ }
+ // Construct the range filter
+ filter = NewRangeFilter(api.backend, begin, end, f.crit.Addresses, f.crit.Topics)
}
- // Create and run the filter to get all the logs
- filter := New(api.backend, begin, end, f.crit.Addresses, f.crit.Topics)
-
+ // Run the filter and return all the logs
logs, err := filter.Logs(ctx)
if err != nil {
return nil, err