forked from cerc-io/plugeth
Added new filter from map
This commit is contained in:
parent
07cfb7b64a
commit
0fcc606569
@ -24,6 +24,46 @@ func NewFilter(eth EthManager) *Filter {
|
|||||||
return &Filter{eth: eth}
|
return &Filter{eth: eth}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewFilterFromMap(object map[string]interface{}, eth EthManager) *Filter {
|
||||||
|
filter := NewFilter(eth)
|
||||||
|
|
||||||
|
if object["earliest"] != nil {
|
||||||
|
earliest := object["earliest"]
|
||||||
|
if e, ok := earliest.(string); ok {
|
||||||
|
filter.SetEarliestBlock(ethutil.Hex2Bytes(e))
|
||||||
|
} else {
|
||||||
|
filter.SetEarliestBlock(earliest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if object["latest"] != nil {
|
||||||
|
latest := object["latest"]
|
||||||
|
if l, ok := latest.(string); ok {
|
||||||
|
filter.SetLatestBlock(ethutil.Hex2Bytes(l))
|
||||||
|
} else {
|
||||||
|
filter.SetLatestBlock(latest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if object["to"] != nil {
|
||||||
|
filter.AddTo(ethutil.Hex2Bytes(object["to"].(string)))
|
||||||
|
}
|
||||||
|
|
||||||
|
if object["from"] != nil {
|
||||||
|
filter.AddFrom(ethutil.Hex2Bytes(object["from"].(string)))
|
||||||
|
}
|
||||||
|
|
||||||
|
if object["max"] != nil {
|
||||||
|
filter.SetMax(object["max"].(int))
|
||||||
|
}
|
||||||
|
|
||||||
|
if object["skip"] != nil {
|
||||||
|
filter.SetSkip(object["skip"].(int))
|
||||||
|
}
|
||||||
|
|
||||||
|
return filter
|
||||||
|
}
|
||||||
|
|
||||||
// Set the earliest and latest block for filtering.
|
// Set the earliest and latest block for filtering.
|
||||||
// -1 = latest block (i.e., the current block)
|
// -1 = latest block (i.e., the current block)
|
||||||
// hash = particular hash from-to
|
// hash = particular hash from-to
|
||||||
@ -109,27 +149,7 @@ func (self *Filter) Find() []*ethstate.Message {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
includes := func(addresses [][]byte, a []byte) (found bool) {
|
messages = append(messages, self.FilterMessages(msgs)...)
|
||||||
for _, addr := range addresses {
|
|
||||||
if bytes.Compare(addr, a) == 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// Filter the messages for interesting stuff
|
|
||||||
for _, message := range msgs {
|
|
||||||
if len(self.to) > 0 && !includes(self.to, message.To) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(self.from) > 0 && !includes(self.from, message.From) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
messages = append(messages, message)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
block = self.eth.BlockChain().GetBlock(block.PrevHash)
|
block = self.eth.BlockChain().GetBlock(block.PrevHash)
|
||||||
@ -138,6 +158,33 @@ func (self *Filter) Find() []*ethstate.Message {
|
|||||||
return messages
|
return messages
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *Filter) FilterMessages(msgs []*ethstate.Message) []*ethstate.Message {
|
||||||
|
var messages []*ethstate.Message
|
||||||
|
includes := func(addresses [][]byte, a []byte) (found bool) {
|
||||||
|
for _, addr := range addresses {
|
||||||
|
if bytes.Compare(addr, a) == 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Filter the messages for interesting stuff
|
||||||
|
for _, message := range msgs {
|
||||||
|
if len(self.to) > 0 && !includes(self.to, message.To) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(self.from) > 0 && !includes(self.from, message.From) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
messages = append(messages, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return messages
|
||||||
|
}
|
||||||
|
|
||||||
func (self *Filter) bloomFilter(block *Block) bool {
|
func (self *Filter) bloomFilter(block *Block) bool {
|
||||||
fk := append([]byte("bloom"), block.Hash()...)
|
fk := append([]byte("bloom"), block.Hash()...)
|
||||||
bin, err := self.eth.Db().Get(fk)
|
bin, err := self.eth.Db().Get(fk)
|
||||||
|
Loading…
Reference in New Issue
Block a user