|
|
|
@ -49,12 +49,14 @@ type Statistics struct { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const ( |
|
|
|
|
maxMsgSizeIdx = iota // Maximal message length allowed by the whisper node
|
|
|
|
|
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
|
|
|
|
|
maxMsgSizeIdx = iota // Maximal message length allowed by the whisper node
|
|
|
|
|
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
|
|
|
|
|
lightClientModeIdx // Light client mode. (does not forward any messages)
|
|
|
|
|
restrictConnectionBetweenLightClientsIdx // Restrict connection between two light clients
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// Whisper represents a dark communication interface through the Ethereum
|
|
|
|
@ -82,8 +84,6 @@ type Whisper struct { |
|
|
|
|
|
|
|
|
|
syncAllowance int // maximum time in seconds allowed to process the whisper-related messages
|
|
|
|
|
|
|
|
|
|
lightClient bool // indicates is this node is pure light client (does not forward any messages)
|
|
|
|
|
|
|
|
|
|
statsMu sync.Mutex // guard stats
|
|
|
|
|
stats Statistics // Statistics of whisper node
|
|
|
|
|
|
|
|
|
@ -113,6 +113,7 @@ func New(cfg *Config) *Whisper { |
|
|
|
|
whisper.settings.Store(minPowIdx, cfg.MinimumAcceptedPOW) |
|
|
|
|
whisper.settings.Store(maxMsgSizeIdx, cfg.MaxMessageSize) |
|
|
|
|
whisper.settings.Store(overflowIdx, false) |
|
|
|
|
whisper.settings.Store(restrictConnectionBetweenLightClientsIdx, cfg.RestrictConnectionBetweenLightClients) |
|
|
|
|
|
|
|
|
|
// p2p whisper sub protocol handler
|
|
|
|
|
whisper.protocol = p2p.Protocol{ |
|
|
|
@ -276,6 +277,31 @@ func (whisper *Whisper) SetMinimumPowTest(val float64) { |
|
|
|
|
whisper.settings.Store(minPowToleranceIdx, val) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//SetLightClientMode makes node light client (does not forward any messages)
|
|
|
|
|
func (whisper *Whisper) SetLightClientMode(v bool) { |
|
|
|
|
whisper.settings.Store(lightClientModeIdx, v) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//LightClientMode indicates is this node is light client (does not forward any messages)
|
|
|
|
|
func (whisper *Whisper) LightClientMode() bool { |
|
|
|
|
val, exist := whisper.settings.Load(lightClientModeIdx) |
|
|
|
|
if !exist || val == nil { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
v, ok := val.(bool) |
|
|
|
|
return v && ok |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//LightClientModeConnectionRestricted indicates that connection to light client in light client mode not allowed
|
|
|
|
|
func (whisper *Whisper) LightClientModeConnectionRestricted() bool { |
|
|
|
|
val, exist := whisper.settings.Load(restrictConnectionBetweenLightClientsIdx) |
|
|
|
|
if !exist || val == nil { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
v, ok := val.(bool) |
|
|
|
|
return v && ok |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (whisper *Whisper) notifyPeersAboutPowRequirementChange(pow float64) { |
|
|
|
|
arr := whisper.getPeers() |
|
|
|
|
for _, p := range arr { |
|
|
|
@ -672,7 +698,7 @@ func (whisper *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error { |
|
|
|
|
|
|
|
|
|
trouble := false |
|
|
|
|
for _, env := range envelopes { |
|
|
|
|
cached, err := whisper.add(env, whisper.lightClient) |
|
|
|
|
cached, err := whisper.add(env, whisper.LightClientMode()) |
|
|
|
|
if err != nil { |
|
|
|
|
trouble = true |
|
|
|
|
log.Error("bad envelope received, peer will be disconnected", "peer", p.peer.ID(), "err", err) |
|
|
|
|