Documentation ¶
Overview ¶
Package whisper implements the Whisper protocol (version 5).
Whisper combines aspects of both DHTs and datagram messaging systems (e.g. UDP). As such it may be likened and compared to both, not dissimilar to the matter/energy duality (apologies to physicists for the blatant abuse of a fundamental and beautiful natural principle).
Whisper is a pure identity-based messaging system. Whisper provides a low-level (non-application-specific) but easily-accessible API without being based upon or prejudiced by the low-level hardware attributes and characteristics, particularly the notion of singular endpoints.
Index ¶
- Constants
- func BytesToUintBigEndian(b []byte) (res uint64)
- func GenerateRandomID() (id string, err error)
- func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool
- func ValidateKeyID(id string) error
- func ValidatePublicKey(k *ecdsa.PublicKey) bool
- type Envelope
- func (e *Envelope) DecodeRLP(s *rlp.Stream) error
- func (e *Envelope) Hash() common.Hash
- func (e *Envelope) IsSymmetric() bool
- func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage)
- func (e *Envelope) OpenAsymmetric(key *ecdsa.PrivateKey) (*ReceivedMessage, error)
- func (e *Envelope) OpenSymmetric(key []byte) (msg *ReceivedMessage, err error)
- func (e *Envelope) PoW() float64
- func (e *Envelope) Seal(options *MessageParams) error
- func (e *Envelope) Ver() uint64
- type Filter
- type Filters
- type MailServer
- type MessageParams
- type Peer
- type PostArgs
- type PublicWhisperAPI
- func (api *PublicWhisperAPI) AddSymmetricKeyDirect(key hexutil.Bytes) (string, error)
- func (api *PublicWhisperAPI) AddSymmetricKeyFromPassword(password string) (string, error)
- func (api *PublicWhisperAPI) AllowP2PMessagesFromPeer(enode string) error
- func (api *PublicWhisperAPI) DeleteKeyPair(id string) (bool, error)
- func (api *PublicWhisperAPI) DeleteSymmetricKey(name string) (bool, error)
- func (api *PublicWhisperAPI) GenerateSymmetricKey() (string, error)
- func (api *PublicWhisperAPI) GetFloatingMessages(id string) []*WhisperMessage
- func (api *PublicWhisperAPI) GetNewSubscriptionMessages(id string) []*WhisperMessage
- func (api *PublicWhisperAPI) GetPrivateKey(id string) (string, error)
- func (api *PublicWhisperAPI) GetPublicKey(id string) (hexutil.Bytes, error)
- func (api *PublicWhisperAPI) GetSymmetricKey(name string) (hexutil.Bytes, error)
- func (api *PublicWhisperAPI) HasKeyPair(id string) (bool, error)
- func (api *PublicWhisperAPI) HasSymmetricKey(id string) (bool, error)
- func (api *PublicWhisperAPI) Info() (string, error)
- func (api *PublicWhisperAPI) NewKeyPair() (string, error)
- func (api *PublicWhisperAPI) Post(args PostArgs) error
- func (api *PublicWhisperAPI) SetMaxMessageLength(val int) error
- func (api *PublicWhisperAPI) SetMinimumPoW(val float64) error
- func (api *PublicWhisperAPI) Start() error
- func (api *PublicWhisperAPI) Stop() error
- func (api *PublicWhisperAPI) Subscribe(args WhisperFilterArgs) (string, error)
- func (api *PublicWhisperAPI) Unsubscribe(id string)
- func (api *PublicWhisperAPI) Version() (hexutil.Uint, error)
- type ReceivedMessage
- type SentMessage
- type Statistics
- type TopicType
- type Whisper
- func (w *Whisper) APIs() []rpc.API
- func (w *Whisper) AddSymKeyDirect(key []byte) (string, error)
- func (w *Whisper) AddSymKeyFromPassword(password string) (string, error)
- func (w *Whisper) AllowP2PMessagesFromPeer(peerID []byte) error
- func (w *Whisper) DeleteKeyPair(key string) bool
- func (w *Whisper) DeleteSymKey(id string) bool
- func (w *Whisper) Envelopes() []*Envelope
- func (w *Whisper) GenerateSymKey() (string, error)
- func (w *Whisper) GetFilter(id string) *Filter
- func (w *Whisper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error)
- func (w *Whisper) GetSymKey(id string) ([]byte, error)
- func (wh *Whisper) HandlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error
- func (w *Whisper) HasKeyPair(id string) bool
- func (w *Whisper) HasSymKey(id string) bool
- func (w *Whisper) Messages(id string) []*ReceivedMessage
- func (w *Whisper) NewKeyPair() (string, error)
- func (w *Whisper) Protocols() []p2p.Protocol
- func (w *Whisper) RegisterServer(server MailServer)
- func (w *Whisper) RequestHistoricMessages(peerID []byte, envelope *Envelope) error
- func (w *Whisper) Send(envelope *Envelope) error
- func (w *Whisper) SendP2PDirect(peer *Peer, envelope *Envelope) error
- func (w *Whisper) SendP2PMessage(peerID []byte, envelope *Envelope) error
- func (w *Whisper) SetMaxMessageLength(val int) error
- func (w *Whisper) SetMinimumPoW(val float64) error
- func (w *Whisper) Start(*p2p.Server) error
- func (w *Whisper) Stats() string
- func (w *Whisper) Stop() error
- func (w *Whisper) Subscribe(f *Filter) (string, error)
- func (w *Whisper) Unsubscribe(id string) error
- func (w *Whisper) Version() uint
- type WhisperFilterArgs
- type WhisperMessage
Constants ¶
const ( EnvelopeVersion = uint64(0) ProtocolVersion = uint64(5) ProtocolVersionStr = "5.0" ProtocolName = "shh" NumberOfMessageCodes = 64 TopicLength = 4 AESNonceLength = 12 DefaultMaxMessageLength = 1024 * 1024 DefaultMinimumPoW = 0.2 DefaultTTL = 50 // seconds SynchAllowance = 10 // seconds )
Variables ¶
This section is empty.
Functions ¶
func BytesToUintBigEndian ¶
BytesToUintBigEndian converts the slice to 64-bit unsigned integer.
func GenerateRandomID ¶
GenerateRandomID generates a random string, which is then returned to be used as a key id
func IsPubKeyEqual ¶
func ValidatePublicKey ¶
ValidatePublicKey checks the format of the given public key.
Types ¶
type Envelope ¶
type Envelope struct { Version []byte Expiry uint32 TTL uint32 Topic TopicType AESNonce []byte Data []byte EnvNonce uint64 // contains filtered or unexported fields }
Envelope represents a clear-text data packet to transmit through the Whisper network. Its contents may or may not be encrypted and signed.
func NewEnvelope ¶
func NewEnvelope(ttl uint32, topic TopicType, aesNonce []byte, msg *SentMessage) *Envelope
NewEnvelope wraps a Whisper message with expiration and destination data included into an envelope for network forwarding.
func (*Envelope) IsSymmetric ¶
func (*Envelope) Open ¶
func (e *Envelope) Open(watcher *Filter) (msg *ReceivedMessage)
Open tries to decrypt an envelope, and populates the message fields in case of success.
func (*Envelope) OpenAsymmetric ¶
func (e *Envelope) OpenAsymmetric(key *ecdsa.PrivateKey) (*ReceivedMessage, error)
OpenAsymmetric tries to decrypt an envelope, potentially encrypted with a particular key.
func (*Envelope) OpenSymmetric ¶
func (e *Envelope) OpenSymmetric(key []byte) (msg *ReceivedMessage, err error)
OpenSymmetric tries to decrypt an envelope, potentially encrypted with a particular key.
func (*Envelope) Seal ¶
func (e *Envelope) Seal(options *MessageParams) error
Seal closes the envelope by spending the requested amount of time as a proof of work on hashing the data.
type Filter ¶
type Filter struct { Src *ecdsa.PublicKey // Sender of the message KeyAsym *ecdsa.PrivateKey // Private Key of recipient KeySym []byte // Key associated with the Topic Topics [][]byte // Topics to filter messages with PoW float64 // Proof of work as described in the Whisper spec AllowP2P bool // Indicates whether this filter is interested in direct peer-to-peer messages SymKeyHash common.Hash // The Keccak256Hash of the symmetric key, needed for optimization Messages map[common.Hash]*ReceivedMessage // contains filtered or unexported fields }
func (*Filter) MatchEnvelope ¶
func (*Filter) MatchMessage ¶
func (f *Filter) MatchMessage(msg *ReceivedMessage) bool
func (*Filter) MatchTopic ¶
func (*Filter) Retrieve ¶
func (f *Filter) Retrieve() (all []*ReceivedMessage)
func (*Filter) Trigger ¶
func (f *Filter) Trigger(msg *ReceivedMessage)
type Filters ¶
type Filters struct {
// contains filtered or unexported fields
}
func NewFilters ¶
func (*Filters) NotifyWatchers ¶
type MailServer ¶
type MailServer interface { Archive(env *Envelope) DeliverMail(whisperPeer *Peer, request *Envelope) }
MailServer represents a mail server, capable of archiving the old messages for subsequent delivery to the peers. Any implementation must ensure that both functions are thread-safe. Also, they must return ASAP. DeliverMail should use directMessagesCode for delivery, in order to bypass the expiry checks.
type MessageParams ¶
type MessageParams struct { TTL uint32 Src *ecdsa.PrivateKey Dst *ecdsa.PublicKey KeySym []byte Topic TopicType WorkTime uint32 PoW float64 Payload []byte Padding []byte }
Options specifies the exact way a message should be wrapped into an Envelope.
type Peer ¶
type Peer struct {
// contains filtered or unexported fields
}
peer represents a whisper protocol peer connection.
type PostArgs ¶
type PostArgs struct { Type string `json:"type"` // "sym"/"asym" (symmetric or asymmetric) TTL uint32 `json:"ttl"` // time-to-live in seconds Sig string `json:"sig"` // id of the signing key Key string `json:"key"` // key id (in case of sym) or public key (in case of asym) Topic hexutil.Bytes `json:"topic"` // topic (4 bytes) Padding hexutil.Bytes `json:"padding"` // optional padding bytes Payload hexutil.Bytes `json:"payload"` // payload to be encrypted PowTime uint32 `json:"powTime"` // maximal time in seconds to be spent on PoW PowTarget float64 `json:"powTarget"` // minimal PoW required for this message TargetPeer string `json:"targetPeer"` // peer id (for p2p message only) }
type PublicWhisperAPI ¶
type PublicWhisperAPI struct {
// contains filtered or unexported fields
}
PublicWhisperAPI provides the whisper RPC service.
func NewPublicWhisperAPI ¶
func NewPublicWhisperAPI(w *Whisper) *PublicWhisperAPI
NewPublicWhisperAPI create a new RPC whisper service.
func (*PublicWhisperAPI) AddSymmetricKeyDirect ¶
func (api *PublicWhisperAPI) AddSymmetricKeyDirect(key hexutil.Bytes) (string, error)
AddSymmetricKeyDirect stores the key, and returns its id.
func (*PublicWhisperAPI) AddSymmetricKeyFromPassword ¶
func (api *PublicWhisperAPI) AddSymmetricKeyFromPassword(password string) (string, error)
AddSymmetricKeyFromPassword generates the key from password, stores it, and returns its id.
func (*PublicWhisperAPI) AllowP2PMessagesFromPeer ¶
func (api *PublicWhisperAPI) AllowP2PMessagesFromPeer(enode string) error
AllowP2PMessagesFromPeer marks specific peer trusted, which will allow it to send historic (expired) messages.
func (*PublicWhisperAPI) DeleteKeyPair ¶
func (api *PublicWhisperAPI) DeleteKeyPair(id string) (bool, error)
DeleteKeyPair deletes the specifies key if it exists.
func (*PublicWhisperAPI) DeleteSymmetricKey ¶
func (api *PublicWhisperAPI) DeleteSymmetricKey(name string) (bool, error)
DeleteSymmetricKey deletes the key associated with the name string if it exists.
func (*PublicWhisperAPI) GenerateSymmetricKey ¶
func (api *PublicWhisperAPI) GenerateSymmetricKey() (string, error)
GenerateSymmetricKey generates a random symmetric key and stores it under id, which is then returned. Will be used in the future for session key exchange.
func (*PublicWhisperAPI) GetFloatingMessages ¶
func (api *PublicWhisperAPI) GetFloatingMessages(id string) []*WhisperMessage
GetMessages retrieves all the floating messages that match a specific subscription filter. It is likely to be called once per session, right after Subscribe call.
func (*PublicWhisperAPI) GetNewSubscriptionMessages ¶
func (api *PublicWhisperAPI) GetNewSubscriptionMessages(id string) []*WhisperMessage
GetSubscriptionMessages retrieves all the new messages matched by the corresponding subscription filter since the last retrieval.
func (*PublicWhisperAPI) GetPrivateKey ¶
func (api *PublicWhisperAPI) GetPrivateKey(id string) (string, error)
GetPrivateKey returns the private key for identity id
func (*PublicWhisperAPI) GetPublicKey ¶
func (api *PublicWhisperAPI) GetPublicKey(id string) (hexutil.Bytes, error)
GetPublicKey returns the public key for identity id
func (*PublicWhisperAPI) GetSymmetricKey ¶
func (api *PublicWhisperAPI) GetSymmetricKey(name string) (hexutil.Bytes, error)
GetSymmetricKey returns the symmetric key associated with the given id.
func (*PublicWhisperAPI) HasKeyPair ¶
func (api *PublicWhisperAPI) HasKeyPair(id string) (bool, error)
HasKeyPair checks if the whisper node is configured with the private key of the specified public pair.
func (*PublicWhisperAPI) HasSymmetricKey ¶
func (api *PublicWhisperAPI) HasSymmetricKey(id string) (bool, error)
HasSymmetricKey returns true if there is a key associated with the given id. Otherwise returns false.
func (*PublicWhisperAPI) Info ¶
func (api *PublicWhisperAPI) Info() (string, error)
Info returns the Whisper statistics for diagnostics.
func (*PublicWhisperAPI) NewKeyPair ¶
func (api *PublicWhisperAPI) NewKeyPair() (string, error)
NewKeyPair generates a new cryptographic identity for the client, and injects it into the known identities for message decryption.
func (*PublicWhisperAPI) Post ¶
func (api *PublicWhisperAPI) Post(args PostArgs) error
Post creates a whisper message and injects it into the network for distribution.
func (*PublicWhisperAPI) SetMaxMessageLength ¶
func (api *PublicWhisperAPI) SetMaxMessageLength(val int) error
SetMaxMessageLength sets the maximal message length allowed by this node
func (*PublicWhisperAPI) SetMinimumPoW ¶
func (api *PublicWhisperAPI) SetMinimumPoW(val float64) error
SetMinimumPoW sets the minimal PoW required by this node
func (*PublicWhisperAPI) Start ¶
func (api *PublicWhisperAPI) Start() error
Start starts the Whisper worker threads.
func (*PublicWhisperAPI) Stop ¶
func (api *PublicWhisperAPI) Stop() error
Stop stops the Whisper worker threads.
func (*PublicWhisperAPI) Subscribe ¶
func (api *PublicWhisperAPI) Subscribe(args WhisperFilterArgs) (string, error)
Subscribe creates and registers a new filter to watch for inbound whisper messages. Returns the ID of the newly created filter.
func (*PublicWhisperAPI) Unsubscribe ¶
func (api *PublicWhisperAPI) Unsubscribe(id string)
Unsubscribe disables and removes an existing filter.
type ReceivedMessage ¶
type ReceivedMessage struct { Raw []byte Payload []byte Padding []byte Signature []byte PoW float64 // Proof of work as described in the Whisper spec Sent uint32 // Time when the message was posted into the network TTL uint32 // Maximum time to live allowed for the message Src *ecdsa.PublicKey // Message recipient (identity used to decode the message) Dst *ecdsa.PublicKey // Message recipient (identity used to decode the message) Topic TopicType SymKeyHash common.Hash // The Keccak256Hash of the key, associated with the Topic EnvelopeHash common.Hash // Message envelope hash to act as a unique id EnvelopeVersion uint64 }
ReceivedMessage represents a data packet to be received through the Whisper protocol.
func (*ReceivedMessage) SigToPubKey ¶
func (msg *ReceivedMessage) SigToPubKey() *ecdsa.PublicKey
Recover retrieves the public key of the message signer.
func (*ReceivedMessage) Validate ¶
func (msg *ReceivedMessage) Validate() bool
Validate checks the validity and extracts the fields in case of success
type SentMessage ¶
type SentMessage struct {
Raw []byte
}
SentMessage represents an end-user data packet to transmit through the Whisper protocol. These are wrapped into Envelopes that need not be understood by intermediate nodes, just forwarded.
func NewSentMessage ¶
func NewSentMessage(params *MessageParams) (*SentMessage, error)
NewMessage creates and initializes a non-signed, non-encrypted Whisper message.
func (*SentMessage) Wrap ¶
func (msg *SentMessage) Wrap(options *MessageParams) (envelope *Envelope, err error)
Wrap bundles the message into an Envelope to transmit over the network.
type Statistics ¶
type Statistics struct {
// contains filtered or unexported fields
}
type TopicType ¶
type TopicType [TopicLength]byte
Topic represents a cryptographically secure, probabilistic partial classifications of a message, determined as the first (left) 4 bytes of the SHA3 hash of some arbitrary data given by the original author of the message.
func BytesToTopic ¶
func (*TopicType) UnmarshalJSON ¶
UnmarshalJSON parses a hex representation to a topic.
type Whisper ¶
type Whisper struct {
// contains filtered or unexported fields
}
Whisper represents a dark communication interface through the Ethereum network, using its very own P2P communication layer.
func New ¶
func New() *Whisper
New creates a Whisper client ready to communicate through the Ethereum P2P network.
func (*Whisper) AddSymKeyDirect ¶
AddSymKeyDirect stores the key, and returns its id.
func (*Whisper) AddSymKeyFromPassword ¶
AddSymKeyFromPassword generates the key from password, stores it, and returns its id.
func (*Whisper) AllowP2PMessagesFromPeer ¶
AllowP2PMessagesFromPeer marks specific peer trusted, which will allow it to send historic (expired) messages.
func (*Whisper) DeleteKeyPair ¶
DeleteKeyPair deletes the specified key if it exists.
func (*Whisper) DeleteSymKey ¶
DeleteSymKey deletes the key associated with the name string if it exists.
func (*Whisper) GenerateSymKey ¶
GenerateSymKey generates a random symmetric key and stores it under id, which is then returned. Will be used in the future for session key exchange.
func (*Whisper) GetPrivateKey ¶
func (w *Whisper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error)
GetPrivateKey retrieves the private key of the specified identity.
func (*Whisper) HandlePeer ¶
HandlePeer is called by the underlying P2P layer when the whisper sub-protocol connection is negotiated.
func (*Whisper) HasKeyPair ¶
HasKeyPair checks if the the whisper node is configured with the private key of the specified public pair.
func (*Whisper) HasSymKey ¶
HasSymKey returns true if there is a key associated with the given id. Otherwise returns false.
func (*Whisper) Messages ¶
func (w *Whisper) Messages(id string) []*ReceivedMessage
Messages iterates through all currently floating envelopes and retrieves all the messages, that this filter could decrypt.
func (*Whisper) NewKeyPair ¶
NewKeyPair generates a new cryptographic identity for the client, and injects it into the known identities for message decryption. Returns ID of the new key pair.
func (*Whisper) Protocols ¶
Protocols returns the whisper sub-protocols ran by this particular client.
func (*Whisper) RegisterServer ¶
func (w *Whisper) RegisterServer(server MailServer)
RegisterServer registers MailServer interface. MailServer will process all the incoming messages with p2pRequestCode.
func (*Whisper) RequestHistoricMessages ¶
RequestHistoricMessages sends a message with p2pRequestCode to a specific peer, which is known to implement MailServer interface, and is supposed to process this request and respond with a number of peer-to-peer messages (possibly expired), which are not supposed to be forwarded any further. The whisper protocol is agnostic of the format and contents of envelope.
func (*Whisper) Send ¶
Send injects a message into the whisper send queue, to be distributed in the network in the coming cycles.
func (*Whisper) SendP2PDirect ¶
SendP2PDirect sends a peer-to-peer message to a specific peer.
func (*Whisper) SendP2PMessage ¶
SendP2PMessage sends a peer-to-peer message to a specific peer.
func (*Whisper) SetMaxMessageLength ¶
SetMaxMessageLength sets the maximal message length allowed by this node
func (*Whisper) SetMinimumPoW ¶
SetMinimumPoW sets the minimal PoW required by this node
func (*Whisper) Start ¶
Start implements node.Service, starting the background data propagation thread of the Whisper protocol.
func (*Whisper) Stop ¶
Stop implements node.Service, stopping the background data propagation thread of the Whisper protocol.
func (*Whisper) Subscribe ¶
Subscribe installs a new message handler used for filtering, decrypting and subsequent storing of incoming messages.
func (*Whisper) Unsubscribe ¶
Unsubscribe removes an installed message handler.
type WhisperFilterArgs ¶
type WhisperFilterArgs struct { Symmetric bool // encryption type Key string // id of the key to be used for decryption Sig string // public key of the sender to be verified MinPoW float64 // minimal PoW requirement Topics [][]byte // list of topics (up to 4 bytes each) to match AllowP2P bool // indicates wheather direct p2p messages are allowed for this filter }
func (*WhisperFilterArgs) UnmarshalJSON ¶
func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error)
UnmarshalJSON implements the json.Unmarshaler interface, invoked to convert a JSON message blob into a WhisperFilterArgs structure.
type WhisperMessage ¶
type WhisperMessage struct { Topic string `json:"topic"` Payload string `json:"payload"` Padding string `json:"padding"` Src string `json:"sig"` Dst string `json:"recipientPublicKey"` Timestamp uint32 `json:"timestamp"` TTL uint32 `json:"ttl"` PoW float64 `json:"pow"` Hash string `json:"hash"` }
WhisperMessage is the RPC representation of a whisper message.
func NewWhisperMessage ¶
func NewWhisperMessage(message *ReceivedMessage) *WhisperMessage
NewWhisperMessage converts an internal message into an API version.