mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 17:33:47 +00:00
whisper: bloom filter refactoring
This commit is contained in:
parent
1a4e68721a
commit
8979a83284
2 changed files with 18 additions and 18 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -118,11 +119,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 +223,18 @@ 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in a new issue