mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 02:12:23 +00:00
Merge 82d8b40bda into 8c4a7fa8d3
This commit is contained in:
commit
5b49323e3e
17 changed files with 61 additions and 21 deletions
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Version components of the current release.
|
||||||
const (
|
const (
|
||||||
VersionMajor = 1 // Major version component of the current release
|
VersionMajor = 1 // Major version component of the current release
|
||||||
VersionMinor = 8 // Minor version component of the current release
|
VersionMinor = 8 // Minor version component of the current release
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@ import (
|
||||||
"github.com/syndtr/goleveldb/leveldb/util"
|
"github.com/syndtr/goleveldb/leveldb/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// WMailServer stores the leveldb instance containing an archive of messages
|
||||||
|
// as well as the whisper instance.
|
||||||
type WMailServer struct {
|
type WMailServer struct {
|
||||||
db *leveldb.DB
|
db *leveldb.DB
|
||||||
w *whisper.Whisper
|
w *whisper.Whisper
|
||||||
|
|
@ -42,6 +44,7 @@ type DBKey struct {
|
||||||
raw []byte
|
raw []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewDbKey creates a new DBKey with a new raw hash based on the current time.
|
||||||
func NewDbKey(t uint32, h common.Hash) *DBKey {
|
func NewDbKey(t uint32, h common.Hash) *DBKey {
|
||||||
const sz = common.HashLength + 4
|
const sz = common.HashLength + 4
|
||||||
var k DBKey
|
var k DBKey
|
||||||
|
|
@ -53,6 +56,7 @@ func NewDbKey(t uint32, h common.Hash) *DBKey {
|
||||||
return &k
|
return &k
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Init assigns initial values for the WMailServer.
|
||||||
func (s *WMailServer) Init(shh *whisper.Whisper, path string, password string, pow float64) error {
|
func (s *WMailServer) Init(shh *whisper.Whisper, path string, password string, pow float64) error {
|
||||||
var err error
|
var err error
|
||||||
if len(path) == 0 {
|
if len(path) == 0 {
|
||||||
|
|
@ -82,12 +86,14 @@ func (s *WMailServer) Init(shh *whisper.Whisper, path string, password string, p
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close shutdowns the connection to the levelDB instance of s
|
||||||
func (s *WMailServer) Close() {
|
func (s *WMailServer) Close() {
|
||||||
if s.db != nil {
|
if s.db != nil {
|
||||||
s.db.Close()
|
s.db.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Archive maps the message in bytes to a new raw key hash.
|
||||||
func (s *WMailServer) Archive(env *whisper.Envelope) {
|
func (s *WMailServer) Archive(env *whisper.Envelope) {
|
||||||
key := NewDbKey(env.Expiry-env.TTL, env.Hash())
|
key := NewDbKey(env.Expiry-env.TTL, env.Hash())
|
||||||
rawEnvelope, err := rlp.EncodeToBytes(env)
|
rawEnvelope, err := rlp.EncodeToBytes(env)
|
||||||
|
|
@ -101,6 +107,7 @@ func (s *WMailServer) Archive(env *whisper.Envelope) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeliverMail will send a message via the p2p protocol.
|
||||||
func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope) {
|
func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope) {
|
||||||
if peer == nil {
|
if peer == nil {
|
||||||
log.Error("Whisper peer is nil")
|
log.Error("Whisper peer is nil")
|
||||||
|
|
@ -177,15 +184,16 @@ func (s *WMailServer) validateRequest(peerID []byte, request *whisper.Envelope)
|
||||||
|
|
||||||
var bloom []byte
|
var bloom []byte
|
||||||
payloadSize := len(decrypted.Payload)
|
payloadSize := len(decrypted.Payload)
|
||||||
if payloadSize < 8 {
|
switch {
|
||||||
|
case (payloadSize < 8):
|
||||||
log.Warn(fmt.Sprintf("Undersized p2p request"))
|
log.Warn(fmt.Sprintf("Undersized p2p request"))
|
||||||
return false, 0, 0, nil
|
return false, 0, 0, nil
|
||||||
} else if payloadSize == 8 {
|
case (payloadSize == 8):
|
||||||
bloom = whisper.MakeFullNodeBloom()
|
bloom = whisper.MakeFullNodeBloom()
|
||||||
} else if payloadSize < 8+whisper.BloomFilterSize {
|
case (payloadSize < 8+whisper.BloomFilterSize):
|
||||||
log.Warn(fmt.Sprintf("Undersized bloom filter in p2p request"))
|
log.Warn(fmt.Sprintf("Undersized bloom filter in p2p request"))
|
||||||
return false, 0, 0, nil
|
return false, 0, 0, nil
|
||||||
} else {
|
default:
|
||||||
bloom = decrypted.Payload[8 : 8+whisper.BloomFilterSize]
|
bloom = decrypted.Payload[8 : 8+whisper.BloomFilterSize]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Variables that specify custom error messages.
|
||||||
var (
|
var (
|
||||||
ErrSymAsym = errors.New("specify either a symmetric or an asymmetric key")
|
ErrSymAsym = errors.New("specify either a symmetric or an asymmetric key")
|
||||||
ErrInvalidSymmetricKey = errors.New("invalid symmetric key")
|
ErrInvalidSymmetricKey = errors.New("invalid symmetric key")
|
||||||
|
|
|
||||||
|
|
@ -16,11 +16,13 @@
|
||||||
|
|
||||||
package whisperv5
|
package whisperv5
|
||||||
|
|
||||||
|
// Config is used to map unambiguously to values in the doc.go file.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
MaxMessageSize uint32 `toml:",omitempty"`
|
MaxMessageSize uint32 `toml:",omitempty"`
|
||||||
MinimumAcceptedPOW float64 `toml:",omitempty"`
|
MinimumAcceptedPOW float64 `toml:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DefaultConfig values are set by the doc.go file within this package.
|
||||||
var DefaultConfig = Config{
|
var DefaultConfig = Config{
|
||||||
MaxMessageSize: DefaultMaxMessageSize,
|
MaxMessageSize: DefaultMaxMessageSize,
|
||||||
MinimumAcceptedPOW: DefaultMinimumPoW,
|
MinimumAcceptedPOW: DefaultMinimumPoW,
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Constants here define the configuration for the current release.
|
||||||
const (
|
const (
|
||||||
EnvelopeVersion = uint64(0)
|
EnvelopeVersion = uint64(0)
|
||||||
ProtocolVersion = uint64(5)
|
ProtocolVersion = uint64(5)
|
||||||
|
|
@ -53,7 +54,7 @@ const (
|
||||||
signatureLength = 65
|
signatureLength = 65
|
||||||
aesKeyLength = 32
|
aesKeyLength = 32
|
||||||
AESNonceLength = 12
|
AESNonceLength = 12
|
||||||
keyIdSize = 32
|
keyIDSize = 32
|
||||||
|
|
||||||
MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message.
|
MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message.
|
||||||
DefaultMaxMessageSize = uint32(1024 * 1024)
|
DefaultMaxMessageSize = uint32(1024 * 1024)
|
||||||
|
|
|
||||||
|
|
@ -82,14 +82,17 @@ func NewEnvelope(ttl uint32, topic TopicType, aesNonce []byte, msg *sentMessage)
|
||||||
return &env
|
return &env
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsSymmetric confirms the AESNonce has length greater than 0.
|
||||||
func (e *Envelope) IsSymmetric() bool {
|
func (e *Envelope) IsSymmetric() bool {
|
||||||
return len(e.AESNonce) > 0
|
return len(e.AESNonce) > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isAsymmetric confirms the AESNonce does not have a length greater than 0.
|
||||||
func (e *Envelope) isAsymmetric() bool {
|
func (e *Envelope) isAsymmetric() bool {
|
||||||
return !e.IsSymmetric()
|
return !e.IsSymmetric()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Ver converts the version to 64-bit unsigned integer.
|
||||||
func (e *Envelope) Ver() uint64 {
|
func (e *Envelope) Ver() uint64 {
|
||||||
return bytesToUintLittleEndian(e.Version)
|
return bytesToUintLittleEndian(e.Version)
|
||||||
}
|
}
|
||||||
|
|
@ -223,7 +226,7 @@ func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage) {
|
||||||
if msg != nil {
|
if msg != nil {
|
||||||
msg.Dst = &watcher.KeyAsym.PublicKey
|
msg.Dst = &watcher.KeyAsym.PublicKey
|
||||||
}
|
}
|
||||||
} else if e.IsSymmetric() {
|
} else {
|
||||||
msg, _ = e.OpenSymmetric(watcher.KeySym)
|
msg, _ = e.OpenSymmetric(watcher.KeySym)
|
||||||
if msg != nil {
|
if msg != nil {
|
||||||
msg.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym)
|
msg.SymKeyHash = crypto.Keccak256Hash(watcher.KeySym)
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ type Filters struct {
|
||||||
mutex sync.RWMutex
|
mutex sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewFilters initiliazes the Filterse struct with w.
|
||||||
func NewFilters(w *Whisper) *Filters {
|
func NewFilters(w *Whisper) *Filters {
|
||||||
return &Filters{
|
return &Filters{
|
||||||
watchers: make(map[string]*Filter),
|
watchers: make(map[string]*Filter),
|
||||||
|
|
@ -52,6 +53,8 @@ func NewFilters(w *Whisper) *Filters {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Install hashes the Topic's key and sets the watcher to a random ID
|
||||||
|
// inside fs.watchers.
|
||||||
func (fs *Filters) Install(watcher *Filter) (string, error) {
|
func (fs *Filters) Install(watcher *Filter) (string, error) {
|
||||||
if watcher.Messages == nil {
|
if watcher.Messages == nil {
|
||||||
watcher.Messages = make(map[common.Hash]*ReceivedMessage)
|
watcher.Messages = make(map[common.Hash]*ReceivedMessage)
|
||||||
|
|
@ -77,6 +80,7 @@ func (fs *Filters) Install(watcher *Filter) (string, error) {
|
||||||
return id, err
|
return id, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Uninstall deletes values associated with id from fs.watchers, if one exists.
|
||||||
func (fs *Filters) Uninstall(id string) bool {
|
func (fs *Filters) Uninstall(id string) bool {
|
||||||
fs.mutex.Lock()
|
fs.mutex.Lock()
|
||||||
defer fs.mutex.Unlock()
|
defer fs.mutex.Unlock()
|
||||||
|
|
@ -87,12 +91,15 @@ func (fs *Filters) Uninstall(id string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get returns the watcher with the associated id.
|
||||||
func (fs *Filters) Get(id string) *Filter {
|
func (fs *Filters) Get(id string) *Filter {
|
||||||
fs.mutex.RLock()
|
fs.mutex.RLock()
|
||||||
defer fs.mutex.RUnlock()
|
defer fs.mutex.RUnlock()
|
||||||
return fs.watchers[id]
|
return fs.watchers[id]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotifyWatchers validates that messages are allowed to be read before
|
||||||
|
// mapping the msg to fs Messages map.
|
||||||
func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
|
func (fs *Filters) NotifyWatchers(env *Envelope, p2pMessage bool) {
|
||||||
var msg *ReceivedMessage
|
var msg *ReceivedMessage
|
||||||
|
|
||||||
|
|
@ -136,9 +143,8 @@ func (f *Filter) processEnvelope(env *Envelope) *ReceivedMessage {
|
||||||
msg := env.Open(f)
|
msg := env.Open(f)
|
||||||
if msg != nil {
|
if msg != nil {
|
||||||
return msg
|
return msg
|
||||||
} else {
|
|
||||||
log.Trace("processing envelope: failed to open", "hash", env.Hash().Hex())
|
|
||||||
}
|
}
|
||||||
|
log.Trace("processing envelope: failed to open", "hash", env.Hash().Hex())
|
||||||
} else {
|
} else {
|
||||||
log.Trace("processing envelope: does not match", "hash", env.Hash().Hex())
|
log.Trace("processing envelope: does not match", "hash", env.Hash().Hex())
|
||||||
}
|
}
|
||||||
|
|
@ -153,6 +159,8 @@ func (f *Filter) expectsSymmetricEncryption() bool {
|
||||||
return f.KeySym != nil
|
return f.KeySym != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Trigger will assign the msg to Filter's Messages map if the
|
||||||
|
// EnvelopeHash has not already been used to set a msg.
|
||||||
func (f *Filter) Trigger(msg *ReceivedMessage) {
|
func (f *Filter) Trigger(msg *ReceivedMessage) {
|
||||||
f.mutex.Lock()
|
f.mutex.Lock()
|
||||||
defer f.mutex.Unlock()
|
defer f.mutex.Unlock()
|
||||||
|
|
@ -162,6 +170,7 @@ func (f *Filter) Trigger(msg *ReceivedMessage) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve will return a slice of all messages the Filter stores.
|
||||||
func (f *Filter) Retrieve() (all []*ReceivedMessage) {
|
func (f *Filter) Retrieve() (all []*ReceivedMessage) {
|
||||||
f.mutex.Lock()
|
f.mutex.Lock()
|
||||||
defer f.mutex.Unlock()
|
defer f.mutex.Unlock()
|
||||||
|
|
@ -201,6 +210,7 @@ func (f *Filter) MatchEnvelope(envelope *Envelope) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MatchTopic checks whether param topic exists in the f receiver.
|
||||||
func (f *Filter) MatchTopic(topic TopicType) bool {
|
func (f *Filter) MatchTopic(topic TopicType) bool {
|
||||||
if len(f.Topics) == 0 {
|
if len(f.Topics) == 0 {
|
||||||
// any topic matches
|
// any topic matches
|
||||||
|
|
@ -232,6 +242,8 @@ func matchSingleTopic(topic TopicType, bt []byte) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsPubKeyEqual checks the format of the given public keys a and b,
|
||||||
|
// and compares where each sits on an elliptical curve.
|
||||||
func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool {
|
func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool {
|
||||||
if !ValidatePublicKey(a) {
|
if !ValidatePublicKey(a) {
|
||||||
return false
|
return false
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ func TestInstallFilters(t *testing.T) {
|
||||||
t.Fatalf("seed %d: failed to install filter: %s", seed, err)
|
t.Fatalf("seed %d: failed to install filter: %s", seed, err)
|
||||||
}
|
}
|
||||||
tst[i].id = j
|
tst[i].id = j
|
||||||
if len(j) != keyIdSize*2 {
|
if len(j) != keyIDSize*2 {
|
||||||
t.Fatalf("seed %d: wrong filter id size [%d]", seed, len(j))
|
t.Fatalf("seed %d: wrong filter id size [%d]", seed, len(j))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
var _ = (*criteriaOverride)(nil)
|
var _ = (*criteriaOverride)(nil)
|
||||||
|
|
||||||
|
// MarshalJSON implements the json.Marshaller interface.
|
||||||
func (c Criteria) MarshalJSON() ([]byte, error) {
|
func (c Criteria) MarshalJSON() ([]byte, error) {
|
||||||
type Criteria struct {
|
type Criteria struct {
|
||||||
SymKeyID string `json:"symKeyID"`
|
SymKeyID string `json:"symKeyID"`
|
||||||
|
|
@ -29,6 +30,7 @@ func (c Criteria) MarshalJSON() ([]byte, error) {
|
||||||
return json.Marshal(&enc)
|
return json.Marshal(&enc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON implements json.Unmarshaler interface and maps input to C.
|
||||||
func (c *Criteria) UnmarshalJSON(input []byte) error {
|
func (c *Criteria) UnmarshalJSON(input []byte) error {
|
||||||
type Criteria struct {
|
type Criteria struct {
|
||||||
SymKeyID *string `json:"symKeyID"`
|
SymKeyID *string `json:"symKeyID"`
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
var _ = (*messageOverride)(nil)
|
var _ = (*messageOverride)(nil)
|
||||||
|
|
||||||
|
// MarshalJSON implements the json.Marshaller interface.
|
||||||
func (m Message) MarshalJSON() ([]byte, error) {
|
func (m Message) MarshalJSON() ([]byte, error) {
|
||||||
type Message struct {
|
type Message struct {
|
||||||
Sig hexutil.Bytes `json:"sig,omitempty"`
|
Sig hexutil.Bytes `json:"sig,omitempty"`
|
||||||
|
|
@ -35,6 +36,7 @@ func (m Message) MarshalJSON() ([]byte, error) {
|
||||||
return json.Marshal(&enc)
|
return json.Marshal(&enc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON implements json.Unmarshaler interface and maps input to m.
|
||||||
func (m *Message) UnmarshalJSON(input []byte) error {
|
func (m *Message) UnmarshalJSON(input []byte) error {
|
||||||
type Message struct {
|
type Message struct {
|
||||||
Sig *hexutil.Bytes `json:"sig,omitempty"`
|
Sig *hexutil.Bytes `json:"sig,omitempty"`
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
var _ = (*newMessageOverride)(nil)
|
var _ = (*newMessageOverride)(nil)
|
||||||
|
|
||||||
|
// MarshalJSON implements the json.Marshaller interface.
|
||||||
func (n NewMessage) MarshalJSON() ([]byte, error) {
|
func (n NewMessage) MarshalJSON() ([]byte, error) {
|
||||||
type NewMessage struct {
|
type NewMessage struct {
|
||||||
SymKeyID string `json:"symKeyID"`
|
SymKeyID string `json:"symKeyID"`
|
||||||
|
|
@ -37,6 +38,7 @@ func (n NewMessage) MarshalJSON() ([]byte, error) {
|
||||||
return json.Marshal(&enc)
|
return json.Marshal(&enc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON implements json.Unmarshaler interface and maps input to n.
|
||||||
func (n *NewMessage) UnmarshalJSON(input []byte) error {
|
func (n *NewMessage) UnmarshalJSON(input []byte) error {
|
||||||
type NewMessage struct {
|
type NewMessage struct {
|
||||||
SymKeyID *string `json:"symKeyID"`
|
SymKeyID *string `json:"symKeyID"`
|
||||||
|
|
|
||||||
|
|
@ -156,10 +156,9 @@ func (peer *Peer) broadcast() error {
|
||||||
err := p2p.Send(peer.ws, messagesCode, envelope)
|
err := p2p.Send(peer.ws, messagesCode, envelope)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
|
||||||
peer.mark(envelope)
|
|
||||||
cnt++
|
|
||||||
}
|
}
|
||||||
|
peer.mark(envelope)
|
||||||
|
cnt++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if cnt > 0 {
|
if cnt > 0 {
|
||||||
|
|
@ -168,6 +167,7 @@ func (peer *Peer) broadcast() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ID returns the peers peer.ID in a byte slice.
|
||||||
func (peer *Peer) ID() []byte {
|
func (peer *Peer) ID() []byte {
|
||||||
id := peer.peer.ID()
|
id := peer.peer.ID()
|
||||||
return id[:]
|
return id[:]
|
||||||
|
|
|
||||||
|
|
@ -79,13 +79,13 @@ type TestNode struct {
|
||||||
shh *Whisper
|
shh *Whisper
|
||||||
id *ecdsa.PrivateKey
|
id *ecdsa.PrivateKey
|
||||||
server *p2p.Server
|
server *p2p.Server
|
||||||
filerId string
|
filerID string
|
||||||
}
|
}
|
||||||
|
|
||||||
var result TestData
|
var result TestData
|
||||||
var nodes [NumNodes]*TestNode
|
var nodes [NumNodes]*TestNode
|
||||||
var sharedKey = []byte("some arbitrary data here")
|
var sharedKey = []byte("some arbitrary data here")
|
||||||
var sharedTopic TopicType = TopicType{0xF, 0x1, 0x2, 0}
|
var sharedTopic = TopicType{0xF, 0x1, 0x2, 0}
|
||||||
var expectedMessage = []byte("per rectum ad astra")
|
var expectedMessage = []byte("per rectum ad astra")
|
||||||
|
|
||||||
// This test does the following:
|
// This test does the following:
|
||||||
|
|
@ -120,7 +120,7 @@ func initialize(t *testing.T) {
|
||||||
topics = append(topics, sharedTopic)
|
topics = append(topics, sharedTopic)
|
||||||
f := Filter{KeySym: sharedKey}
|
f := Filter{KeySym: sharedKey}
|
||||||
f.Topics = [][]byte{topics[0][:]}
|
f.Topics = [][]byte{topics[0][:]}
|
||||||
node.filerId, err = node.shh.Subscribe(&f)
|
node.filerID, err = node.shh.Subscribe(&f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to install the filter: %s.", err)
|
t.Fatalf("failed to install the filter: %s.", err)
|
||||||
}
|
}
|
||||||
|
|
@ -133,9 +133,9 @@ func initialize(t *testing.T) {
|
||||||
name := common.MakeName("whisper-go", "2.0")
|
name := common.MakeName("whisper-go", "2.0")
|
||||||
var peers []*discover.Node
|
var peers []*discover.Node
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
peerNodeId := nodes[i-1].id
|
peerNodeID := nodes[i-1].id
|
||||||
peerPort := uint16(port - 1)
|
peerPort := uint16(port - 1)
|
||||||
peerNode := discover.PubkeyID(&peerNodeId.PublicKey)
|
peerNode := discover.PubkeyID(&peerNodeID.PublicKey)
|
||||||
peer := discover.NewNode(peerNode, ip, peerPort, peerPort)
|
peer := discover.NewNode(peerNode, ip, peerPort, peerPort)
|
||||||
peers = append(peers, peer)
|
peers = append(peers, peer)
|
||||||
}
|
}
|
||||||
|
|
@ -167,7 +167,7 @@ func stopServers() {
|
||||||
for i := 0; i < NumNodes; i++ {
|
for i := 0; i < NumNodes; i++ {
|
||||||
n := nodes[i]
|
n := nodes[i]
|
||||||
if n != nil {
|
if n != nil {
|
||||||
n.shh.Unsubscribe(n.filerId)
|
n.shh.Unsubscribe(n.filerID)
|
||||||
n.shh.Stop()
|
n.shh.Stop()
|
||||||
n.server.Stop()
|
n.server.Stop()
|
||||||
}
|
}
|
||||||
|
|
@ -186,9 +186,9 @@ func checkPropagation(t *testing.T) {
|
||||||
time.Sleep(cycle * time.Millisecond)
|
time.Sleep(cycle * time.Millisecond)
|
||||||
|
|
||||||
for i := 0; i < NumNodes; i++ {
|
for i := 0; i < NumNodes; i++ {
|
||||||
f := nodes[i].shh.GetFilter(nodes[i].filerId)
|
f := nodes[i].shh.GetFilter(nodes[i].filerID)
|
||||||
if f == nil {
|
if f == nil {
|
||||||
t.Fatalf("failed to get filterId %s from node %d.", nodes[i].filerId, i)
|
t.Fatalf("failed to get filterId %s from node %d.", nodes[i].filerID, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
mail := f.Retrieve()
|
mail := f.Retrieve()
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ import (
|
||||||
// SHA3 hash of some arbitrary data given by the original author of the message.
|
// SHA3 hash of some arbitrary data given by the original author of the message.
|
||||||
type TopicType [TopicLength]byte
|
type TopicType [TopicLength]byte
|
||||||
|
|
||||||
|
// BytesToTopic will return passed parameters as a TopicType.
|
||||||
func BytesToTopic(b []byte) (t TopicType) {
|
func BytesToTopic(b []byte) (t TopicType) {
|
||||||
sz := TopicLength
|
sz := TopicLength
|
||||||
if x := len(b); x < TopicLength {
|
if x := len(b); x < TopicLength {
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ import (
|
||||||
set "gopkg.in/fatih/set.v0"
|
set "gopkg.in/fatih/set.v0"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Statistics is used to store useful information regarding whisper node usage.
|
||||||
type Statistics struct {
|
type Statistics struct {
|
||||||
messagesCleared int
|
messagesCleared int
|
||||||
memoryCleared int
|
memoryCleared int
|
||||||
|
|
@ -121,6 +122,7 @@ func New(cfg *Config) *Whisper {
|
||||||
return whisper
|
return whisper
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MinPow returns the minimal PoW required by this node.
|
||||||
func (w *Whisper) MinPow() float64 {
|
func (w *Whisper) MinPow() float64 {
|
||||||
val, _ := w.settings.Load(minPowIdx)
|
val, _ := w.settings.Load(minPowIdx)
|
||||||
return val.(float64)
|
return val.(float64)
|
||||||
|
|
@ -842,7 +844,7 @@ func deriveKeyMaterial(key []byte, version uint64) (derivedKey []byte, err error
|
||||||
|
|
||||||
// GenerateRandomID generates a random string, which is then returned to be used as a key id
|
// GenerateRandomID generates a random string, which is then returned to be used as a key id
|
||||||
func GenerateRandomID() (id string, err error) {
|
func GenerateRandomID() (id string, err error) {
|
||||||
buf := make([]byte, keyIdSize)
|
buf := make([]byte, keyIDSize)
|
||||||
_, err = crand.Read(buf)
|
_, err = crand.Read(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|
|
||||||
|
|
@ -242,6 +242,8 @@ func (peer *Peer) setBloomFilter(bloom []byte) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MakeFullNodeBloom returns a bloom object with all entries
|
||||||
|
// representing a single byte with the value of 255.
|
||||||
func MakeFullNodeBloom() []byte {
|
func MakeFullNodeBloom() []byte {
|
||||||
bloom := make([]byte, BloomFilterSize)
|
bloom := make([]byte, BloomFilterSize)
|
||||||
for i := 0; i < BloomFilterSize; i++ {
|
for i := 0; i < BloomFilterSize; i++ {
|
||||||
|
|
|
||||||
|
|
@ -1025,6 +1025,7 @@ func isFullNode(bloom []byte) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BloomFilterMatch compares the values of filter and sample, returning a boolean.
|
||||||
func BloomFilterMatch(filter, sample []byte) bool {
|
func BloomFilterMatch(filter, sample []byte) bool {
|
||||||
if filter == nil {
|
if filter == nil {
|
||||||
return true
|
return true
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue