Commit 42628ba7 authored by gluk256's avatar gluk256 Committed by Péter Szilágyi

whisper: bloom filter refactoring (#16046)

* whisper: bloom filter refactoring

* whisper: fixed full node
parent ccf80835
...@@ -36,7 +36,8 @@ type Peer struct { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment