whisper: bloom filter refactoring (#16046)

* whisper: bloom filter refactoring

* whisper: fixed full node
pull/16055/head
gluk256 7 years ago committed by Péter Szilágyi
parent ccf8083537
commit 42628ba7ed
  1. 30
      whisper/whisperv6/peer.go
  2. 7
      whisper/whisperv6/whisper.go

@ -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
peer.fullNode = isFullNode(bloom)
if peer.fullNode && peer.bloomFilter == nil {
peer.bloomFilter = makeFullNodeBloom()
} }
}
return bloomFilterMatch(peer.bloomFilter, env.Bloom()) func makeFullNodeBloom() []byte {
bloom := make([]byte, bloomFilterSize)
for i := 0; i < bloomFilterSize; i++ {
bloom[i] = 0xFF
}
return bloom
} }

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

Loading…
Cancel
Save