aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaylor Gerring <taylor.gerring@gmail.com>2015-03-27 23:36:01 +0800
committerTaylor Gerring <taylor.gerring@gmail.com>2015-03-27 23:36:01 +0800
commit43d521e90e9516429dd0499ff88bf3f37ec78c48 (patch)
tree42e912588cd5a5effdf319a30a641600caf93186
parent0ac346f7078dba597d60f991c32ddbfd7be167ba (diff)
downloaddexon-43d521e90e9516429dd0499ff88bf3f37ec78c48.tar.gz
dexon-43d521e90e9516429dd0499ff88bf3f37ec78c48.tar.zst
dexon-43d521e90e9516429dd0499ff88bf3f37ec78c48.zip
Decouple core from rpc
-rw-r--r--core/filter.go23
-rw-r--r--rpc/api.go37
-rw-r--r--xeth/xeth.go36
3 files changed, 34 insertions, 62 deletions
diff --git a/core/filter.go b/core/filter.go
index ba5d5e14e..1dca5501d 100644
--- a/core/filter.go
+++ b/core/filter.go
@@ -12,17 +12,6 @@ type AccountChange struct {
Address, StateAddress []byte
}
-type FilterOptions struct {
- Earliest int64
- Latest int64
-
- Address []common.Address
- Topics [][]common.Hash
-
- Skip int
- Max int
-}
-
// Filtering interface
type Filter struct {
eth Backend
@@ -44,18 +33,6 @@ func NewFilter(eth Backend) *Filter {
return &Filter{eth: eth}
}
-// SetOptions copies the filter options to the filter it self. The reason for this "silly" copy
-// is simply because named arguments in this case is extremely nice and readable.
-func (self *Filter) SetOptions(options *FilterOptions) {
- self.earliest = options.Earliest
- self.latest = options.Latest
- self.skip = options.Skip
- self.max = options.Max
- self.address = options.Address
- self.topics = options.Topics
-
-}
-
// Set the earliest and latest block for filtering.
// -1 = latest block (i.e., the current block)
// hash = particular hash from-to
diff --git a/rpc/api.go b/rpc/api.go
index f755f07bd..8803c28dd 100644
--- a/rpc/api.go
+++ b/rpc/api.go
@@ -6,7 +6,6 @@ import (
"sync"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/xeth"
)
@@ -277,8 +276,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
return err
}
- opts := toFilterOptions(args)
- id := api.xeth().RegisterFilter(opts)
+ id := api.xeth().RegisterFilter(args.Earliest, args.Latest, args.Skip, args.Max, args.Address, args.Topics)
*reply = common.ToHex(big.NewInt(int64(id)).Bytes())
case "eth_newBlockFilter":
args := new(FilterStringArgs)
@@ -310,8 +308,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
if err := json.Unmarshal(req.Params, &args); err != nil {
return err
}
- opts := toFilterOptions(args)
- *reply = NewLogsRes(api.xeth().AllLogs(opts))
+ *reply = NewLogsRes(api.xeth().AllLogs(args.Earliest, args.Latest, args.Skip, args.Max, args.Address, args.Topics))
case "eth_getWork":
api.xeth().SetMining(true)
*reply = api.xeth().RemoteMining().GetWork()
@@ -456,33 +453,3 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
rpclogger.DebugDetailf("Reply: %T %s", reply, reply)
return nil
}
-
-func toFilterOptions(options *BlockFilterArgs) *core.FilterOptions {
- var opts core.FilterOptions
-
- opts.Address = cAddress(options.Address)
- opts.Topics = cTopics(options.Topics)
-
- opts.Earliest = options.Earliest
- opts.Latest = options.Latest
-
- return &opts
-}
-
-func cAddress(a []string) []common.Address {
- bslice := make([]common.Address, len(a))
- for i, addr := range a {
- bslice[i] = common.HexToAddress(addr)
- }
- return bslice
-}
-
-func cTopics(t [][]string) [][]common.Hash {
- topics := make([][]common.Hash, len(t))
- for i, iv := range t {
- for j, jv := range iv {
- topics[i][j] = common.HexToHash(jv)
- }
- }
- return topics
-}
diff --git a/xeth/xeth.go b/xeth/xeth.go
index 5bb271591..7e1548964 100644
--- a/xeth/xeth.go
+++ b/xeth/xeth.go
@@ -110,6 +110,24 @@ func (self *XEth) stop() {
close(self.quit)
}
+func cAddress(a []string) []common.Address {
+ bslice := make([]common.Address, len(a))
+ for i, addr := range a {
+ bslice[i] = common.HexToAddress(addr)
+ }
+ return bslice
+}
+
+func cTopics(t [][]string) [][]common.Hash {
+ topics := make([][]common.Hash, len(t))
+ for i, iv := range t {
+ for j, jv := range iv {
+ topics[i][j] = common.HexToHash(jv)
+ }
+ }
+ return topics
+}
+
func (self *XEth) DefaultGas() *big.Int { return defaultGas }
func (self *XEth) DefaultGasPrice() *big.Int { return defaultGasPrice }
@@ -301,10 +319,15 @@ func (self *XEth) SecretToAddress(key string) string {
return common.ToHex(pair.Address())
}
-func (self *XEth) RegisterFilter(args *core.FilterOptions) int {
+func (self *XEth) RegisterFilter(earliest, latest int64, skip, max int, address []string, topics [][]string) int {
var id int
filter := core.NewFilter(self.backend)
- filter.SetOptions(args)
+ filter.SetEarliestBlock(earliest)
+ filter.SetLatestBlock(latest)
+ filter.SetSkip(skip)
+ filter.SetMax(max)
+ filter.SetAddress(cAddress(address))
+ filter.SetTopics(cTopics(topics))
filter.LogsCallback = func(logs state.Logs) {
self.logMut.Lock()
defer self.logMut.Unlock()
@@ -380,9 +403,14 @@ func (self *XEth) Logs(id int) state.Logs {
return nil
}
-func (self *XEth) AllLogs(args *core.FilterOptions) state.Logs {
+func (self *XEth) AllLogs(earliest, latest int64, skip, max int, address []string, topics [][]string) state.Logs {
filter := core.NewFilter(self.backend)
- filter.SetOptions(args)
+ filter.SetEarliestBlock(earliest)
+ filter.SetLatestBlock(latest)
+ filter.SetSkip(skip)
+ filter.SetMax(max)
+ filter.SetAddress(cAddress(address))
+ filter.SetTopics(cTopics(topics))
return filter.Find()
}