diff options
author | obscuren <geffobscura@gmail.com> | 2014-10-18 19:20:06 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-10-18 19:20:06 +0800 |
commit | d2bb83833ffadc91d128a1833853ec3240b8c824 (patch) | |
tree | d73b32a16971da3a3a413f8acd6e01bff0fa25fa /ethchain | |
parent | 70a00d602e38e4a2dc1658d483192165c3e479b8 (diff) | |
download | dexon-d2bb83833ffadc91d128a1833853ec3240b8c824.tar.gz dexon-d2bb83833ffadc91d128a1833853ec3240b8c824.tar.zst dexon-d2bb83833ffadc91d128a1833853ec3240b8c824.zip |
Moved Filter's wrapping functions to their own util package. Fixes #61
* CLI ethereum should no longer require the Qt/QML package
Diffstat (limited to 'ethchain')
-rw-r--r-- | ethchain/filter.go | 104 |
1 files changed, 9 insertions, 95 deletions
diff --git a/ethchain/filter.go b/ethchain/filter.go index 447163b68..90f2512ab 100644 --- a/ethchain/filter.go +++ b/ethchain/filter.go @@ -6,12 +6,10 @@ import ( "math" "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/eth-go/ethutil" - "gopkg.in/qml.v1" ) -type data struct { - id, address []byte +type AccountChange struct { + Address, StateAddress []byte } // Filtering interface @@ -23,7 +21,7 @@ type Filter struct { from, to [][]byte max int - altered []data + Altered []AccountChange BlockCallback func(*Block) MessageCallback func(ethstate.Messages) @@ -35,48 +33,8 @@ func NewFilter(eth EthManager) *Filter { return &Filter{eth: eth} } -func NewFilterFromMap(object map[string]interface{}, eth EthManager) *Filter { - filter := NewFilter(eth) - - if object["earliest"] != nil { - val := ethutil.NewValue(object["earliest"]) - filter.SetEarliestBlock(val.Int()) - } - - if object["latest"] != nil { - val := ethutil.NewValue(object["latest"]) - filter.SetLatestBlock(val.Int()) - } - - if object["to"] != nil { - val := ethutil.NewValue(object["to"]) - filter.AddTo(ethutil.Hex2Bytes(val.Str())) - } - - if object["from"] != nil { - val := ethutil.NewValue(object["from"]) - filter.AddFrom(ethutil.Hex2Bytes(val.Str())) - } - - if object["max"] != nil { - val := ethutil.NewValue(object["max"]) - filter.SetMax(int(val.Uint())) - } - - if object["skip"] != nil { - val := ethutil.NewValue(object["skip"]) - filter.SetSkip(int(val.Uint())) - } - - if object["altered"] != nil { - filter.altered = makeAltered(object["altered"]) - } - - return filter -} - -func (self *Filter) AddAltered(id, address []byte) { - self.altered = append(self.altered, data{id, address}) +func (self *Filter) AddAltered(address, stateAddress []byte) { + self.Altered = append(self.Altered, AccountChange{address, stateAddress}) } // Set the earliest and latest block for filtering. @@ -185,16 +143,16 @@ func (self *Filter) FilterMessages(msgs []*ethstate.Message) []*ethstate.Message } var match bool - if len(self.altered) == 0 { + if len(self.Altered) == 0 { match = true } - for _, item := range self.altered { - if len(item.id) > 0 && bytes.Compare(message.To, item.id) != 0 { + for _, accountChange := range self.Altered { + if len(accountChange.Address) > 0 && bytes.Compare(message.To, accountChange.Address) != 0 { continue } - if len(item.address) > 0 && !includes(message.ChangedAddresses, item.address) { + if len(accountChange.StateAddress) > 0 && !includes(message.ChangedAddresses, accountChange.StateAddress) { continue } @@ -246,47 +204,3 @@ func (self *Filter) bloomFilter(block *Block) bool { return fromIncluded && toIncluded } - -// Conversion methodn -func mapToData(m map[string]interface{}) (d data) { - if str, ok := m["id"].(string); ok { - d.id = ethutil.Hex2Bytes(str) - } - - if str, ok := m["at"].(string); ok { - d.address = ethutil.Hex2Bytes(str) - } - - return -} - -// data can come in in the following formats: -// ["aabbccdd", {id: "ccddee", at: "11223344"}], "aabbcc", {id: "ccddee", at: "1122"} -func makeAltered(v interface{}) (d []data) { - if str, ok := v.(string); ok { - d = append(d, data{ethutil.Hex2Bytes(str), nil}) - } else if obj, ok := v.(map[string]interface{}); ok { - d = append(d, mapToData(obj)) - } else if slice, ok := v.([]interface{}); ok { - for _, item := range slice { - d = append(d, makeAltered(item)...) - } - } else if qList, ok := v.(*qml.List); ok { - var s []interface{} - qList.Convert(&s) - - fmt.Println(s) - - d = makeAltered(s) - } else if qMap, ok := v.(*qml.Map); ok { - var m map[string]interface{} - qMap.Convert(&m) - fmt.Println(m) - - d = makeAltered(m) - } else { - panic(fmt.Sprintf("makeAltered err (unknown conversion): %T\n", v)) - } - - return -} |