diff options
-rw-r--r-- | core/block_processor.go | 21 | ||||
-rw-r--r-- | core/filter.go | 118 | ||||
-rw-r--r-- | event/filter/old_filter.go | 8 | ||||
-rw-r--r-- | ui/filter.go | 26 | ||||
-rw-r--r-- | ui/qt/filter.go | 17 |
5 files changed, 76 insertions, 114 deletions
diff --git a/core/block_processor.go b/core/block_processor.go index 37acc4f72..2dcaa37c2 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -330,3 +330,24 @@ func (sm *BlockProcessor) GetMessages(block *types.Block) (messages []*state.Mes return state.Manifest().Messages, nil } + +func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err error) { + if !sm.bc.HasBlock(block.Header().ParentHash) { + return nil, ParentError(block.Header().ParentHash) + } + + sm.lastAttemptedBlock = block + + var ( + parent = sm.bc.GetBlock(block.Header().ParentHash) + //state = state.New(parent.Trie().Copy()) + state = state.New(parent.Root(), sm.db) + ) + + defer state.Reset() + + sm.TransitionState(state, parent, block) + sm.AccumelateRewards(state, block, parent) + + return state.Logs(), nil +} diff --git a/core/filter.go b/core/filter.go index 29be8841c..efdd819ed 100644 --- a/core/filter.go +++ b/core/filter.go @@ -3,10 +3,8 @@ package core import ( "bytes" "math" - "math/big" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/state" ) @@ -20,13 +18,12 @@ type Filter struct { earliest int64 latest int64 skip int - from, to [][]byte + address []byte max int + topics [][]byte - Altered []AccountChange - - BlockCallback func(*types.Block) - MessageCallback func(state.Messages) + BlockCallback func(*types.Block) + LogsCallback func(state.Logs) } // Create a new filter which uses a bloom filter on blocks to figure out whether a particular block @@ -35,10 +32,6 @@ func NewFilter(eth EthManager) *Filter { return &Filter{eth: eth} } -func (self *Filter) AddAltered(address, stateAddress []byte) { - self.Altered = append(self.Altered, AccountChange{address, stateAddress}) -} - // Set the earliest and latest block for filtering. // -1 = latest block (i.e., the current block) // hash = particular hash from-to @@ -50,20 +43,12 @@ func (self *Filter) SetLatestBlock(latest int64) { self.latest = latest } -func (self *Filter) SetFrom(addr [][]byte) { - self.from = addr -} - -func (self *Filter) AddFrom(addr []byte) { - self.from = append(self.from, addr) -} - -func (self *Filter) SetTo(addr [][]byte) { - self.to = addr +func (self *Filter) SetAddress(addr []byte) { + self.address = addr } -func (self *Filter) AddTo(addr []byte) { - self.to = append(self.to, addr) +func (self *Filter) SetTopics(topics [][]byte) { + self.topics = topics } func (self *Filter) SetMax(max int) { @@ -74,8 +59,8 @@ func (self *Filter) SetSkip(skip int) { self.skip = skip } -// Run filters messages with the current parameters set -func (self *Filter) Find() []*state.Message { +// Run filters logs with the current parameters set +func (self *Filter) Find() state.Logs { earliestBlock := self.eth.ChainManager().CurrentBlock() var earliestBlockNo uint64 = uint64(self.earliest) if self.earliest == -1 { @@ -87,39 +72,39 @@ func (self *Filter) Find() []*state.Message { } var ( - messages []*state.Message - block = self.eth.ChainManager().GetBlockByNumber(latestBlockNo) - quit bool + logs state.Logs + block = self.eth.ChainManager().GetBlockByNumber(latestBlockNo) + quit bool ) for i := 0; !quit && block != nil; i++ { // Quit on latest switch { case block.NumberU64() == earliestBlockNo, block.NumberU64() == 0: quit = true - case self.max <= len(messages): + case self.max <= len(logs): break } // Use bloom filtering to see if this block is interesting given the // current parameters if self.bloomFilter(block) { - // Get the messages of the block - msgs, err := self.eth.BlockProcessor().GetMessages(block) + // Get the logs of the block + logs, err := self.eth.BlockProcessor().GetLogs(block) if err != nil { - chainlogger.Warnln("err: filter get messages ", err) + chainlogger.Warnln("err: filter get logs ", err) break } - messages = append(messages, self.FilterMessages(msgs)...) + logs = append(logs, self.FilterLogs(logs)...) } block = self.eth.ChainManager().GetBlock(block.ParentHash()) } - skip := int(math.Min(float64(len(messages)), float64(self.skip))) + skip := int(math.Min(float64(len(logs)), float64(self.skip))) - return messages[skip:] + return logs[skip:] } func includes(addresses [][]byte, a []byte) (found bool) { @@ -132,70 +117,37 @@ func includes(addresses [][]byte, a []byte) (found bool) { return } -func (self *Filter) FilterMessages(msgs []*state.Message) []*state.Message { - var messages []*state.Message +func (self *Filter) FilterLogs(logs state.Logs) state.Logs { + var ret state.Logs - // Filter the messages for interesting stuff - for _, message := range msgs { - if len(self.to) > 0 && !includes(self.to, message.To) { + // Filter the logs for interesting stuff + for _, log := range logs { + if len(self.address) > 0 && !bytes.Equal(self.address, log.Address()) { continue } - if len(self.from) > 0 && !includes(self.from, message.From) { - continue - } - - var match bool - if len(self.Altered) == 0 { - match = true - } - - for _, accountChange := range self.Altered { - if len(accountChange.Address) > 0 && bytes.Compare(message.To, accountChange.Address) != 0 { + for _, topic := range self.topics { + if !includes(log.Topics(), topic) { continue } - - if len(accountChange.StateAddress) > 0 && !includes(message.ChangedAddresses, accountChange.StateAddress) { - continue - } - - match = true - break - } - - if !match { - continue } - messages = append(messages, message) + ret = append(ret, log) } - return messages + return ret } func (self *Filter) bloomFilter(block *types.Block) bool { - var fromIncluded, toIncluded bool - if len(self.from) > 0 { - for _, from := range self.from { - if types.BloomLookup(block.Bloom(), from) || bytes.Equal(block.Coinbase(), from) { - fromIncluded = true - break - } - } - } else { - fromIncluded = true + if len(self.address) > 0 && !types.BloomLookup(block.Bloom(), self.address) { + return false } - if len(self.to) > 0 { - for _, to := range self.to { - if types.BloomLookup(block.Bloom(), ethutil.U256(new(big.Int).Add(ethutil.Big1, ethutil.BigD(to))).Bytes()) || bytes.Equal(block.Coinbase(), to) { - toIncluded = true - break - } + for _, topic := range self.topics { + if !types.BloomLookup(block.Bloom(), topic) { + return false } - } else { - toIncluded = true } - return fromIncluded && toIncluded + return true } diff --git a/event/filter/old_filter.go b/event/filter/old_filter.go index 1a9a88173..c30a7e584 100644 --- a/event/filter/old_filter.go +++ b/event/filter/old_filter.go @@ -77,13 +77,13 @@ out: } self.filterMu.RUnlock() - case state.Messages: + case state.Logs: self.filterMu.RLock() for _, filter := range self.filters { - if filter.MessageCallback != nil { - msgs := filter.FilterMessages(event) + if filter.LogsCallback != nil { + msgs := filter.FilterLogs(event) if len(msgs) > 0 { - filter.MessageCallback(msgs) + filter.LogsCallback(msgs) } } } diff --git a/ui/filter.go b/ui/filter.go index e0797dad2..8f298a40c 100644 --- a/ui/filter.go +++ b/ui/filter.go @@ -28,14 +28,9 @@ func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core. filter.SetLatestBlock(val.Int()) } - if object["to"] != nil { - val := ethutil.NewValue(object["to"]) - filter.AddTo(fromHex(val.Str())) - } - - if object["from"] != nil { - val := ethutil.NewValue(object["from"]) - filter.AddFrom(fromHex(val.Str())) + if object["address"] != nil { + val := ethutil.NewValue(object["address"]) + filter.SetAddress(fromHex(val.Str())) } if object["max"] != nil { @@ -48,8 +43,8 @@ func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core. filter.SetSkip(int(val.Uint())) } - if object["altered"] != nil { - filter.Altered = makeAltered(object["altered"]) + if object["topics"] != nil { + filter.SetTopics(MakeTopics(object["topics"])) } return filter @@ -70,16 +65,13 @@ func mapToAccountChange(m map[string]interface{}) (d core.AccountChange) { // data can come in in the following formats: // ["aabbccdd", {id: "ccddee", at: "11223344"}], "aabbcc", {id: "ccddee", at: "1122"} -func makeAltered(v interface{}) (d []core.AccountChange) { +func MakeTopics(v interface{}) (d [][]byte) { if str, ok := v.(string); ok { - d = append(d, core.AccountChange{fromHex(str), nil}) - } else if obj, ok := v.(map[string]interface{}); ok { - d = append(d, mapToAccountChange(obj)) - } else if slice, ok := v.([]interface{}); ok { + d = append(d, fromHex(str)) + } else if slice, ok := v.([]string); ok { for _, item := range slice { - d = append(d, makeAltered(item)...) + d = append(d, fromHex(item)) } } - return } diff --git a/ui/qt/filter.go b/ui/qt/filter.go index 423d5bd43..cb4d0311b 100644 --- a/ui/qt/filter.go +++ b/ui/qt/filter.go @@ -9,24 +9,21 @@ import ( func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter { filter := ui.NewFilterFromMap(object, eth) - if object["altered"] != nil { - filter.Altered = makeAltered(object["altered"]) + if object["topics"] != nil { + filter.SetTopics(makeTopics(object["topics"])) } return filter } -func makeAltered(v interface{}) (d []core.AccountChange) { +func makeTopics(v interface{}) (d [][]byte) { if qList, ok := v.(*qml.List); ok { - var s []interface{} + var s []string qList.Convert(&s) - d = makeAltered(s) - } else if qMap, ok := v.(*qml.Map); ok { - var m map[string]interface{} - qMap.Convert(&m) - - d = makeAltered(m) + d = ui.MakeTopics(s) + } else if str, ok := v.(string); ok { + d = ui.MakeTopics(str) } return |