From 5d71ee3a2d97d8edd2eaffab2fedfe1eccdcd378 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 7 Jan 2018 21:12:05 +0200 Subject: [PATCH] whisper: minor refactoring --- whisper/whisperv6/doc.go | 14 +++++------- whisper/whisperv6/envelope.go | 7 +++--- whisper/whisperv6/peer_test.go | 9 -------- whisper/whisperv6/whisper.go | 40 ++++++++++++++++++++++++++++------ 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/whisper/whisperv6/doc.go b/whisper/whisperv6/doc.go index 062f3ba62c..040e1b0dfc 100644 --- a/whisper/whisperv6/doc.go +++ b/whisper/whisperv6/doc.go @@ -51,12 +51,12 @@ const ( paddingMask = byte(3) signatureFlag = byte(4) - TopicLength = 4 - signatureLength = 65 - aesKeyLength = 32 - AESNonceLength = 12 - keyIdSize = 32 - bloomFilterSize = 64 + TopicLength = 4 // in bytes + signatureLength = 65 // in bytes + aesKeyLength = 32 // in bytes + AESNonceLength = 12 // in bytes + keyIdSize = 32 // in bytes + bloomFilterSize = 64 // in bytes MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message. DefaultMaxMessageSize = uint32(1024 * 1024) @@ -70,8 +70,6 @@ const ( DefaultTTL = 50 // seconds DefaultSyncAllowance = 10 // seconds - - EnvelopeHeaderLength = 20 ) type unknownVersionError uint64 diff --git a/whisper/whisperv6/envelope.go b/whisper/whisperv6/envelope.go index 7f2532c2c9..304608fdeb 100644 --- a/whisper/whisperv6/envelope.go +++ b/whisper/whisperv6/envelope.go @@ -51,6 +51,7 @@ type Envelope struct { // size returns the size of envelope as it is sent (i.e. public fields only) func (e *Envelope) size() int { + const EnvelopeHeaderLength = 20 return EnvelopeHeaderLength + len(e.Data) } @@ -238,13 +239,13 @@ func (e *Envelope) Bloom() []byte { return e.bloom } +// TopicToBloom converts the topic (4 bytes) to the bloom filter (64 bytes) func TopicToBloom(topic TopicType) []byte { - var powers = [...]byte{1, 2, 4, 8, 16, 32, 64, 128} b := make([]byte, bloomFilterSize) var index [3]int for j := 0; j < 3; j++ { index[j] = int(topic[j]) - if (topic[3] & powers[j]) != 0 { + if (topic[3] & (1 << uint(j))) != 0 { index[j] += 256 } } @@ -252,7 +253,7 @@ func TopicToBloom(topic TopicType) []byte { for j := 0; j < 3; j++ { byteIndex := index[j] / 8 bitIndex := index[j] % 8 - b[byteIndex] = powers[bitIndex] + b[byteIndex] = (1 << uint(bitIndex)) } return b } diff --git a/whisper/whisperv6/peer_test.go b/whisper/whisperv6/peer_test.go index b6d0dd02fa..9a1f9dc8e6 100644 --- a/whisper/whisperv6/peer_test.go +++ b/whisper/whisperv6/peer_test.go @@ -428,12 +428,3 @@ func checkBloomFilterExchange(t *testing.T) { } } } - -func isBloomFilterEqual(a, b []byte) bool { - for i := 0; i < bloomFilterSize; i++ { - if a[i] != b[i] { - return false - } - } - return true -} diff --git a/whisper/whisperv6/whisper.go b/whisper/whisperv6/whisper.go index dd99bc3aae..e4fb273005 100644 --- a/whisper/whisperv6/whisper.go +++ b/whisper/whisperv6/whisper.go @@ -49,11 +49,11 @@ type Statistics struct { const ( maxMsgSizeIdx = iota // Maximal message length allowed by the whisper node - overflowIdx = iota // Indicator of message queue overflow - minPowIdx = iota // Minimal PoW required by the whisper node - minPowToleranceIdx = iota // Minimal PoW tolerated by the whisper node for a limited time - bloomFilterIdx = iota // Bloom filter for topics of interest for this node - bloomFilterToleranceIdx = iota // Bloom filter tolerated by the whisper node for a limited time + overflowIdx // Indicator of message queue overflow + minPowIdx // Minimal PoW required by the whisper node + minPowToleranceIdx // Minimal PoW tolerated by the whisper node for a limited time + bloomFilterIdx // Bloom filter for topics of interest for this node + bloomFilterToleranceIdx // Bloom filter tolerated by the whisper node for a limited time ) // Whisper represents a dark communication interface through the Ethereum @@ -129,14 +129,23 @@ func New(cfg *Config) *Whisper { return whisper } +// MinPow returns the PoW value required by this node. func (w *Whisper) MinPow() float64 { val, exist := w.settings.Load(minPowIdx) if !exist || val == nil { return DefaultMinimumPoW } - return val.(float64) + v, ok := val.(float64) + if !ok { + log.Error("Error loading minPowIdx, using default") + return DefaultMinimumPoW + } + return v } +// MinPowTolerance returns the value of minimum PoW which is tolerated for a limited +// time after PoW was changed. If sufficient time have elapsed or no change of PoW +// have ever occurred, the return value will be the same as return value of MinPow(). func (w *Whisper) MinPowTolerance() float64 { val, exist := w.settings.Load(minPowToleranceIdx) if !exist || val == nil { @@ -145,6 +154,10 @@ func (w *Whisper) MinPowTolerance() float64 { return val.(float64) } +// BloomFilter returns the aggregated bloom filter for all the topics of interest. +// The nodes are required to send only messages that match the advertised bloom filter. +// If a message does not match the bloom, it will tantamount to spam, and the peer will +// be disconnected. func (w *Whisper) BloomFilter() []byte { val, exist := w.settings.Load(bloomFilterIdx) if !exist || val == nil { @@ -153,6 +166,10 @@ func (w *Whisper) BloomFilter() []byte { return val.([]byte) } +// BloomFilterTolerance returns the bloom filter which is tolerated for a limited +// time after new bloom was advertised to the peers. If sufficient time have elapsed +// or no change of bloom filter have ever occurred, the return value will be the same +// as return value of BloomFilter(). func (w *Whisper) BloomFilterTolerance() []byte { val, exist := w.settings.Load(bloomFilterToleranceIdx) if !exist || val == nil { @@ -1035,7 +1052,7 @@ func bloomFilterMatch(filter, sample []byte) bool { for i := 0; i < bloomFilterSize; i++ { f := filter[i] s := sample[i] - if ((f | s) ^ f) != 0 { + if (f | s) != f { return false } } @@ -1050,3 +1067,12 @@ func addBloom(a, b []byte) []byte { } return c } + +func isBloomFilterEqual(a, b []byte) bool { + for i := 0; i < bloomFilterSize; i++ { + if a[i] != b[i] { + return false + } + } + return true +}