aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/block_processor.go21
-rw-r--r--core/filter.go118
-rw-r--r--event/filter/old_filter.go8
-rw-r--r--ui/filter.go26
-rw-r--r--ui/qt/filter.go17
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