From 8979a83284e508f884540ad819ddabc7e6987b3a Mon Sep 17 00:00:00 2001 From: Vlad Date: Fri, 9 Feb 2018 11:10:12 +0100 Subject: [PATCH 1/2] whisper: bloom filter refactoring --- whisper/whisperv6/peer.go | 27 ++++++++++++++++----------- whisper/whisperv6/whisper.go | 7 +------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/whisper/whisperv6/peer.go b/whisper/whisperv6/peer.go index 4f9a7c3780bd..7878183f1f5d 100644 --- a/whisper/whisperv6/peer.go +++ b/whisper/whisperv6/peer.go @@ -36,7 +36,8 @@ type Peer struct { trusted bool 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 @@ -118,11 +119,7 @@ func (peer *Peer) handshake() error { if sz != bloomFilterSize && sz != 0 { return fmt.Errorf("peer [%x] sent bad status message: wrong bloom filter size %d", peer.ID(), sz) } - if isFullNode(bloom) { - peer.bloomFilter = nil - } else { - peer.bloomFilter = bloom - } + peer.setBloomFilter(bloom) } } @@ -226,10 +223,18 @@ func (peer *Peer) notifyAboutBloomFilterChange(bloom []byte) error { } func (peer *Peer) bloomMatch(env *Envelope) bool { - if peer.bloomFilter == nil { - // no filter - full node, accepts all envelops - return true - } + return peer.fullNode || bloomFilterMatch(peer.bloomFilter, env.Bloom()) +} - 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 + } + } + } } diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go index d75ad04ac3c4..600f9cb286ec 100644 --- a/whisper/whisperv6/whisper.go +++ b/whisper/whisperv6/whisper.go @@ -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) return errors.New("invalid bloom filter exchange message") } - if isFullNode(bloom) { - p.bloomFilter = nil - } else { - p.bloomFilter = bloom - } + p.setBloomFilter(bloom) case p2pMessageCode: // peer-to-peer message, sent directly to peer bypassing PoW checks, etc. // 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 { if filter == nil { - // full node, accepts all messages return true } From 4b34c24cff592b6d26868ddcd78f5d44107165f4 Mon Sep 17 00:00:00 2001 From: Vlad Date: Fri, 9 Feb 2018 15:03:09 +0100 Subject: [PATCH 2/2] whisper: fixed full node --- whisper/whisperv6/peer.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/whisper/whisperv6/peer.go b/whisper/whisperv6/peer.go index 7878183f1f5d..4ef0f3c434fa 100644 --- a/whisper/whisperv6/peer.go +++ b/whisper/whisperv6/peer.go @@ -54,6 +54,8 @@ func newPeer(host *Whisper, remote *p2p.Peer, rw p2p.MsgReadWriter) *Peer { powRequirement: 0.0, known: set.New(), quit: make(chan struct{}), + bloomFilter: makeFullNodeBloom(), + fullNode: true, } } @@ -229,12 +231,15 @@ func (peer *Peer) bloomMatch(env *Envelope) bool { 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 - } - } + 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 }