whisper: bloom filter refactoring (#16046)

* whisper: bloom filter refactoring

* whisper: fixed full node
This commit is contained in:
gluk256 2018-02-09 16:25:23 +01:00 committed by Péter Szilágyi
parent ccf8083537
commit 42628ba7ed
2 changed files with 23 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
@ -53,6 +54,8 @@ func newPeer(host *Whisper, remote *p2p.Peer, rw p2p.MsgReadWriter) *Peer {
powRequirement: 0.0, powRequirement: 0.0,
known: set.New(), known: set.New(),
quit: make(chan struct{}), quit: make(chan struct{}),
bloomFilter: makeFullNodeBloom(),
fullNode: true,
} }
} }
@ -118,11 +121,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 +225,21 @@ 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
} func (peer *Peer) setBloomFilter(bloom []byte) {
peer.bloomFilter = bloom
return bloomFilterMatch(peer.bloomFilter, env.Bloom()) peer.fullNode = isFullNode(bloom)
if peer.fullNode && peer.bloomFilter == nil {
peer.bloomFilter = makeFullNodeBloom()
}
}
func makeFullNodeBloom() []byte {
bloom := make([]byte, bloomFilterSize)
for i := 0; i < bloomFilterSize; i++ {
bloom[i] = 0xFF
}
return bloom
} }

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
} }