Skip to content

Commit

Permalink
whisper: bloom filter refactoring (ethereum#16046)
Browse files Browse the repository at this point in the history
* whisper: bloom filter refactoring

* whisper: fixed full node
  • Loading branch information
gluk256 authored and mariameda committed Aug 19, 2018
1 parent d44de5b commit 4b263ca
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 16 deletions.
30 changes: 20 additions & 10 deletions whisper/whisperv6/peer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -53,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,
}
}

Expand Down Expand Up @@ -118,11 +121,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)
}
}

Expand Down Expand Up @@ -226,10 +225,21 @@ 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())
}

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
}
7 changes: 1 addition & 6 deletions whisper/whisperv6/whisper.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}

Expand Down

0 comments on commit 4b263ca

Please sign in to comment.