whisper: bloom filter refactoring

This commit is contained in:
Vlad 2018-02-09 11:10:12 +01:00
parent 1a4e68721a
commit 8979a83284
2 changed files with 18 additions and 18 deletions

View file

@ -36,7 +36,8 @@ type Peer struct {
trusted bool trusted bool
powRequirement float64 powRequirement float64
bloomFilter []byte // may contain nil in case of full node bloomFilter []byte
fullNode bool
known *set.Set // Messages already known by the peer to avoid wasting bandwidth known *set.Set // Messages already known by the peer to avoid wasting bandwidth
@ -118,11 +119,7 @@ func (peer *Peer) handshake() error {
if sz != bloomFilterSize && sz != 0 { if sz != bloomFilterSize && sz != 0 {
return fmt.Errorf("peer [%x] sent bad status message: wrong bloom filter size %d", peer.ID(), sz) return fmt.Errorf("peer [%x] sent bad status message: wrong bloom filter size %d", peer.ID(), sz)
} }
if isFullNode(bloom) { peer.setBloomFilter(bloom)
peer.bloomFilter = nil
} else {
peer.bloomFilter = bloom
}
} }
} }
@ -226,10 +223,18 @@ func (peer *Peer) notifyAboutBloomFilterChange(bloom []byte) error {
} }
func (peer *Peer) bloomMatch(env *Envelope) bool { func (peer *Peer) bloomMatch(env *Envelope) bool {
if peer.bloomFilter == nil { return peer.fullNode || bloomFilterMatch(peer.bloomFilter, env.Bloom())
// no filter - full node, accepts all envelops
return true
} }
return bloomFilterMatch(peer.bloomFilter, env.Bloom()) func (peer *Peer) setBloomFilter(bloom []byte) {
peer.bloomFilter = bloom
peer.fullNode = isFullNode(bloom)
if peer.fullNode {
if peer.bloomFilter == nil {
peer.bloomFilter = make([]byte, bloomFilterSize)
for i := 0; i < bloomFilterSize; i++ {
peer.bloomFilter[i] = 0xFF
}
}
}
} }

View file

@ -710,11 +710,7 @@ func (whisper *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
log.Warn("failed to decode bloom filter exchange message, peer will be disconnected", "peer", p.peer.ID(), "err", err) log.Warn("failed to decode bloom filter exchange message, peer will be disconnected", "peer", p.peer.ID(), "err", err)
return errors.New("invalid bloom filter exchange message") return errors.New("invalid bloom filter exchange message")
} }
if isFullNode(bloom) { p.setBloomFilter(bloom)
p.bloomFilter = nil
} else {
p.bloomFilter = bloom
}
case p2pMessageCode: case p2pMessageCode:
// peer-to-peer message, sent directly to peer bypassing PoW checks, etc. // peer-to-peer message, sent directly to peer bypassing PoW checks, etc.
// this message is not supposed to be forwarded to other peers, and // this message is not supposed to be forwarded to other peers, and
@ -1049,7 +1045,6 @@ func isFullNode(bloom []byte) bool {
func bloomFilterMatch(filter, sample []byte) bool { func bloomFilterMatch(filter, sample []byte) bool {
if filter == nil { if filter == nil {
// full node, accepts all messages
return true return true
} }