Documentation
¶
Index ¶
- Constants
- Variables
- func BloomFilterMatch(filter, sample []byte) bool
- func BytesToUintBigEndian(b []byte) (res uint64)
- func CreateMailServerRequestCompletedPayload(requestID, lastEnvelopeHash common.Hash, cursor []byte) []byte
- func CreateMailServerRequestFailedPayload(requestID common.Hash, err error) []byte
- func GenerateRandomID() (id string, err error)
- func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool
- func MakeFullNodeBloom() []byte
- func NewSentMessage(params *MessageParams) (*sentMessage, error)
- func TopicToBloom(topic TopicType) []byte
- func ValidatePublicKey(k *ecdsa.PublicKey) bool
- type Bridge
- type Config
- type Criteria
- type DropPeerRateLimiterHandler
- type Envelope
- func (e *Envelope) Bloom() []byte
- func (e *Envelope) DecodeRLP(s *rlp.Stream) error
- func (e *Envelope) Hash() common.Hash
- 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
- type EnvelopeError
- type EnvelopeEvent
- type EventType
- type Filter
- type Filters
- type Info
- type MailServer
- type MailServerResponse
- type MemoryMessageStore
- type Message
- type MessageParams
- type MessageStore
- type MessagesRequest
- type MessagesResponse
- type MetricsRateLimiterHandler
- type MultiVersionResponse
- type NewMessage
- type Peer
- type PeerRateLimiter
- type PeerRateLimiterConfig
- type PublicWakuAPI
- func (api *PublicWakuAPI) AddPrivateKey(ctx context.Context, privateKey hexutil.Bytes) (string, error)
- func (api *PublicWakuAPI) AddSymKey(ctx context.Context, key hexutil.Bytes) (string, error)
- func (api *PublicWakuAPI) CancelLightClient(ctx context.Context) bool
- func (api *PublicWakuAPI) DeleteKeyPair(ctx context.Context, key string) (bool, error)
- func (api *PublicWakuAPI) DeleteMessageFilter(id string) (bool, error)
- func (api *PublicWakuAPI) DeleteSymKey(ctx context.Context, id string) bool
- func (api *PublicWakuAPI) GenerateSymKeyFromPassword(ctx context.Context, passwd string) (string, error)
- func (api *PublicWakuAPI) GetFilterMessages(id string) ([]*Message, error)
- func (api *PublicWakuAPI) GetPrivateKey(ctx context.Context, id string) (hexutil.Bytes, error)
- func (api *PublicWakuAPI) GetPublicKey(ctx context.Context, id string) (hexutil.Bytes, error)
- func (api *PublicWakuAPI) GetSymKey(ctx context.Context, id string) (hexutil.Bytes, error)
- func (api *PublicWakuAPI) HasKeyPair(ctx context.Context, id string) bool
- func (api *PublicWakuAPI) HasSymKey(ctx context.Context, id string) bool
- func (api *PublicWakuAPI) Info(ctx context.Context) Info
- func (api *PublicWakuAPI) MakeLightClient(ctx context.Context) bool
- func (api *PublicWakuAPI) MarkTrustedPeer(ctx context.Context, url string) (bool, error)
- func (api *PublicWakuAPI) Messages(ctx context.Context, crit Criteria) (*rpc.Subscription, error)
- func (api *PublicWakuAPI) NewKeyPair(ctx context.Context) (string, error)
- func (api *PublicWakuAPI) NewMessageFilter(req Criteria) (string, error)
- func (api *PublicWakuAPI) NewSymKey(ctx context.Context) (string, error)
- func (api *PublicWakuAPI) Post(ctx context.Context, req NewMessage) (hexutil.Bytes, error)
- func (api *PublicWakuAPI) SetBloomFilter(ctx context.Context, bloom hexutil.Bytes) (bool, error)
- func (api *PublicWakuAPI) SetMaxMessageSize(ctx context.Context, size uint32) (bool, error)
- func (api *PublicWakuAPI) SetMinPoW(ctx context.Context, pow float64) (bool, error)
- func (api *PublicWakuAPI) UninstallFilter(id string)
- func (api *PublicWakuAPI) Unsubscribe(id string)
- func (api *PublicWakuAPI) Version(ctx context.Context) string
- type RateLimiterHandler
- type RateLimits
- type ReceivedMessage
- type TimeSyncError
- type TopicType
- type Version1MessageResponse
- type Waku
- func (w *Waku) APIs() []rpc.API
- func (w *Waku) AddKeyPair(key *ecdsa.PrivateKey) (string, error)
- func (w *Waku) AddSymKey(id string, key []byte) (string, error)
- func (w *Waku) AddSymKeyDirect(key []byte) (string, error)
- func (w *Waku) AddSymKeyFromPassword(password string) (string, error)
- func (w *Waku) AllowP2PMessagesFromPeer(peerID []byte) error
- func (w *Waku) BloomFilter() []byte
- func (w *Waku) BloomFilterMode() bool
- func (w *Waku) BloomFilterTolerance() []byte
- func (w *Waku) ConfirmationsEnabled() bool
- func (w *Waku) CurrentTime() time.Time
- func (w *Waku) DeleteKeyPair(key string) bool
- func (w *Waku) DeleteKeyPairs() error
- func (w *Waku) DeleteSymKey(id string) bool
- func (w *Waku) Envelopes() []*Envelope
- func (w *Waku) GenerateSymKey() (string, error)
- func (w *Waku) GetEnvelope(hash common.Hash) *Envelope
- func (w *Waku) GetFilter(id string) *Filter
- func (w *Waku) GetPrivateKey(id string) (*ecdsa.PrivateKey, error)
- func (w *Waku) GetSymKey(id string) ([]byte, error)
- func (w *Waku) HandlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error
- func (w *Waku) HasKeyPair(id string) bool
- func (w *Waku) HasSymKey(id string) bool
- func (w *Waku) LightClientMode() bool
- func (w *Waku) LightClientModeConnectionRestricted() bool
- func (w *Waku) MaxMessageSize() uint32
- func (w *Waku) MinPow() float64
- func (w *Waku) MinPowTolerance() float64
- func (w *Waku) NewKeyPair() (string, error)
- func (w *Waku) Protocols() []p2p.Protocol
- func (w *Waku) RateLimits() RateLimits
- func (w *Waku) RegisterBridge(b Bridge)
- func (w *Waku) RegisterMailServer(server MailServer)
- func (w *Waku) RegisterRateLimiter(r *PeerRateLimiter)
- func (w *Waku) RequestHistoricMessages(peerID []byte, envelope *Envelope) error
- func (w *Waku) RequestHistoricMessagesWithTimeout(peerID []byte, envelope *Envelope, timeout time.Duration) error
- func (w *Waku) SelectKeyPair(key *ecdsa.PrivateKey) error
- func (w *Waku) Send(envelope *Envelope) error
- func (w *Waku) SendHistoricMessageResponse(peerID []byte, payload []byte) error
- func (w *Waku) SendMessagesRequest(peerID []byte, request MessagesRequest) error
- func (w *Waku) SendP2PDirect(peerID []byte, envelopes ...*Envelope) error
- func (w *Waku) SendP2PMessages(peerID []byte, envelopes ...*Envelope) error
- func (w *Waku) SendRawP2PDirect(peerID []byte, envelopes ...rlp.RawValue) error
- func (w *Waku) SetBloomFilter(bloom []byte) error
- func (w *Waku) SetBloomFilterMode(mode bool)
- func (w *Waku) SetLightClientMode(v bool)
- func (w *Waku) SetMaxMessageSize(size uint32) error
- func (w *Waku) SetMinimumPoW(val float64, tolerate bool) error
- func (w *Waku) SetTimeSource(timesource func() time.Time)
- func (w *Waku) SetTopicInterest(topicInterest []TopicType) error
- func (w *Waku) Start(*p2p.Server) error
- func (w *Waku) Stop() error
- func (w *Waku) Subscribe(f *Filter) (string, error)
- func (w *Waku) SubscribeEnvelopeEvents(events chan<- EnvelopeEvent) event.Subscription
- func (w *Waku) TopicInterest() []TopicType
- func (w *Waku) Unsubscribe(id string) error
- func (w *Waku) Version() uint
Constants ¶
const ( ProtocolVersion = uint64(0) // Protocol version number ProtocolVersionStr = "0" // The same, as a string ProtocolName = "waku" // Nickname of the protocol NumberOfMessageCodes = 128 SizeMask = byte(3) // mask used to extract the size of payload size field from the flags TopicLength = 4 // in bytes BloomFilterSize = 64 // in bytes MaxTopicInterest = 10000 EnvelopeHeaderLength = 20 MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message. DefaultMaxMessageSize = uint32(1024 * 1024) DefaultMinimumPoW = 0.2 DefaultTTL = 50 // seconds DefaultSyncAllowance = 10 // seconds MaxLimitInSyncMailRequest = 1000 EnvelopeTimeNotSynced uint = iota + 1 EnvelopeOtherError MaxLimitInMessagesRequest = 1000 )
Waku protocol parameters
Variables ¶
var ( ErrSymAsym = errors.New("specify either a symmetric or an asymmetric key") ErrInvalidSymmetricKey = errors.New("invalid symmetric key") ErrInvalidPublicKey = errors.New("invalid public key") ErrInvalidSigningPubKey = errors.New("invalid signing public key") ErrTooLowPoW = errors.New("message rejected, PoW too low") ErrNoTopics = errors.New("missing topic(s)") )
List of errors
var DefaultConfig = Config{ MaxMessageSize: DefaultMaxMessageSize, MinimumAcceptedPoW: DefaultMinimumPoW, RestrictLightClientsConn: true, }
var ErrRateLimitExceeded = errors.New("rate limit has been exceeded")
Functions ¶
func BloomFilterMatch ¶
func BytesToUintBigEndian ¶
BytesToUintBigEndian converts the slice to 64-bit unsigned integer.
func CreateMailServerRequestCompletedPayload ¶
func CreateMailServerRequestCompletedPayload(requestID, lastEnvelopeHash common.Hash, cursor []byte) []byte
CreateMailServerRequestCompletedPayload creates a payload representing a successful request to mailserver
func CreateMailServerRequestFailedPayload ¶
CreateMailServerRequestFailedPayload creates a payload representing a failed request to a mailserver
func GenerateRandomID ¶
GenerateRandomID generates a random string, which is then returned to be used as a key id
func IsPubKeyEqual ¶
IsPubKeyEqual checks that two public keys are equal
func MakeFullNodeBloom ¶
func MakeFullNodeBloom() []byte
func NewSentMessage ¶
func NewSentMessage(params *MessageParams) (*sentMessage, error)
NewSentMessage creates and initializes a non-signed, non-encrypted Waku message.
func TopicToBloom ¶
TopicToBloom converts the topic (4 bytes) to the bloom filter (64 bytes)
func ValidatePublicKey ¶
ValidatePublicKey checks the format of the given public key.
Types ¶
type Config ¶
type Config struct { MaxMessageSize uint32 `toml:",omitempty"` MinimumAcceptedPoW float64 `toml:",omitempty"` BloomFilterMode bool `toml:",omitempty"` // when true, we only match against bloom filter LightClient bool `toml:",omitempty"` // when true, it does not forward messages FullNode bool `toml:",omitempty"` // when true, it forwards all messages RestrictLightClientsConn bool `toml:",omitempty"` // when true, do not accept light client as peers if it is a light client itself EnableConfirmations bool `toml:",omitempty"` // when true, sends message confirmations }
Config represents the configuration state of a waku node.
type Criteria ¶
type Criteria struct { SymKeyID string `json:"symKeyID"` PrivateKeyID string `json:"privateKeyID"` Sig []byte `json:"sig"` MinPow float64 `json:"minPow"` Topics []TopicType `json:"topics"` AllowP2P bool `json:"allowP2P"` }
Criteria holds various filter options for inbound messages.
type DropPeerRateLimiterHandler ¶
type DropPeerRateLimiterHandler struct { // Tolerance is a number of how many a limit must be exceeded // in order to drop a peer. Tolerance int64 // contains filtered or unexported fields }
func (*DropPeerRateLimiterHandler) ExceedIPLimit ¶
func (h *DropPeerRateLimiterHandler) ExceedIPLimit() error
func (*DropPeerRateLimiterHandler) ExceedPeerLimit ¶
func (h *DropPeerRateLimiterHandler) ExceedPeerLimit() error
type Envelope ¶
type Envelope struct { Expiry uint32 TTL uint32 Topic TopicType Data []byte Nonce uint64 // contains filtered or unexported fields }
Envelope represents a clear-text data packet to transmit through the Waku network. Its contents may or may not be encrypted and signed.
func NewEnvelope ¶
NewEnvelope wraps a Waku message with expiration and destination data included into an envelope for network forwarding.
func (*Envelope) Bloom ¶
Bloom maps 4-bytes Topic into 64-byte bloom filter with 3 bits set (at most).
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) PoW ¶
PoW computes (if necessary) and returns the proof of work target of the envelope.
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 EnvelopeError ¶
EnvelopeError code and optional description of the error.
func ErrorToEnvelopeError ¶
func ErrorToEnvelopeError(hash common.Hash, err error) EnvelopeError
ErrorToEnvelopeError converts common golang error into EnvelopeError with a code.
type EnvelopeEvent ¶
type EnvelopeEvent struct { Event EventType Topic TopicType Hash common.Hash Batch common.Hash Peer enode.ID Data interface{} }
EnvelopeEvent used for envelopes events.
func CreateMailServerEvent ¶
func CreateMailServerEvent(nodeID enode.ID, payload []byte) (*EnvelopeEvent, error)
CreateMailServerEvent returns EnvelopeEvent with correct data if payload corresponds to any of the know mailserver events: * request completed successfully * request failed If the payload is unknown/unparseable, it returns `nil`
type EventType ¶
type EventType string
EventType used to define known envelope events.
const ( // EventEnvelopeSent fires when envelope was sent to a peer. EventEnvelopeSent EventType = "envelope.sent" // EventEnvelopeExpired fires when envelop expired EventEnvelopeExpired EventType = "envelope.expired" // EventEnvelopeReceived is sent once envelope was received from a peer. // EventEnvelopeReceived must be sent to the feed even if envelope was previously in the cache. // And event, ideally, should contain information about peer that sent envelope to us. EventEnvelopeReceived EventType = "envelope.received" // EventBatchAcknowledged is sent when batch of envelopes was acknowledged by a peer. EventBatchAcknowledged EventType = "batch.acknowledged" // EventEnvelopeAvailable fires when envelop is available for filters EventEnvelopeAvailable EventType = "envelope.available" // EventMailServerRequestSent fires when such request is sent. EventMailServerRequestSent EventType = "mailserver.request.sent" // EventMailServerRequestCompleted fires after mailserver sends all the requested messages EventMailServerRequestCompleted EventType = "mailserver.request.completed" // EventMailServerRequestExpired fires after mailserver the request TTL ends. // This event is independent and concurrent to EventMailServerRequestCompleted. // Request should be considered as expired only if expiry event was received first. EventMailServerRequestExpired EventType = "mailserver.request.expired" // EventMailServerEnvelopeArchived fires after an envelope has been archived EventMailServerEnvelopeArchived EventType = "mailserver.envelope.archived" // EventMailServerSyncFinished fires when the sync of messages is finished. EventMailServerSyncFinished EventType = "mailserver.sync.finished" )
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 Waku 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 MessageStore // contains filtered or unexported fields }
Filter represents a Waku message filter
func (*Filter) MatchEnvelope ¶
MatchEnvelope checks if it's worth decrypting the message. If it returns `true`, client code is expected to attempt decrypting the message and subsequently call MatchMessage. Topics are not checked here, since this is done by topic matchers.
func (*Filter) MatchMessage ¶
func (f *Filter) MatchMessage(msg *ReceivedMessage) bool
MatchMessage checks if the filter matches an already decrypted message (i.e. a Message that has already been handled by MatchEnvelope when checked by a previous filter). Topics are not checked here, since this is done by topic matchers.
func (*Filter) Retrieve ¶
func (f *Filter) Retrieve() []*ReceivedMessage
Retrieve will return the list of all received messages associated to a filter.
func (*Filter) Trigger ¶
func (f *Filter) Trigger(msg *ReceivedMessage)
Trigger adds a yet-unknown message to the filter's list of received messages.
type Filters ¶
type Filters struct {
// contains filtered or unexported fields
}
Filters represents a collection of filters
func NewFilters ¶
NewFilters returns a newly created filter collection
func (*Filters) NotifyWatchers ¶
NotifyWatchers notifies any filter that has declared interest for the envelope's topic.
type Info ¶
type Info struct { Messages int `json:"messages"` // Number of floating messages. MinPow float64 `json:"minPow"` // Minimal accepted PoW MaxMessageSize uint32 `json:"maxMessageSize"` // Maximum accepted message size }
Info contains diagnostic information.
type MailServer ¶
type MailServer interface { Archive(env *Envelope) DeliverMail(peerID []byte, request *Envelope) // DEPRECATED; use Deliver() Deliver(peerID []byte, request MessagesRequest) }
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 p2pMessageCode for delivery, in order to bypass the expiry checks.
type MailServerResponse ¶
MailServerResponse is the response payload sent by the mailserver.
type MemoryMessageStore ¶
type MemoryMessageStore struct {
// contains filtered or unexported fields
}
MemoryMessageStore stores massages in memory hash table.
func NewMemoryMessageStore ¶
func NewMemoryMessageStore() *MemoryMessageStore
NewMemoryMessageStore returns pointer to an instance of the MemoryMessageStore.
func (*MemoryMessageStore) Add ¶
func (store *MemoryMessageStore) Add(msg *ReceivedMessage) error
Add adds message to store.
func (*MemoryMessageStore) Pop ¶
func (store *MemoryMessageStore) Pop() ([]*ReceivedMessage, error)
Pop returns all available messages and cleans the store.
type Message ¶
type Message struct { Sig []byte `json:"sig,omitempty"` TTL uint32 `json:"ttl"` Timestamp uint32 `json:"timestamp"` Topic TopicType `json:"topic"` Payload []byte `json:"payload"` Padding []byte `json:"padding"` PoW float64 `json:"pow"` Hash []byte `json:"hash"` Dst []byte `json:"recipientPublicKey,omitempty"` P2P bool `json:"bool,omitempty"` }
Message is the RPC representation of a waku message.
func ToWakuMessage ¶
func ToWakuMessage(message *ReceivedMessage) *Message
ToWakuMessage converts an internal message into an API version.
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 }
MessageParams specifies the exact way a message should be wrapped into an Envelope.
type MessageStore ¶
type MessageStore interface { Add(*ReceivedMessage) error Pop() ([]*ReceivedMessage, error) }
MessageStore defines interface for temporary message store.
type MessagesRequest ¶
type MessagesRequest struct { // ID of the request. The current implementation requires ID to be 32-byte array, // however, it's not enforced for future implementation. ID []byte `json:"id"` // From is a lower bound of time range. From uint32 `json:"from"` // To is a upper bound of time range. To uint32 `json:"to"` // Limit determines the number of messages sent by the mail server // for the current paginated request. Limit uint32 `json:"limit"` // Cursor is used as starting point for paginated requests. Cursor []byte `json:"cursor"` // Bloom is a filter to match requested messages. Bloom []byte `json:"bloom"` // Topics is a list of topics. A returned message should // belong to one of the topics from the list. Topics [][]byte `json:"topics"` }
MessagesRequest contains details of a request of historic messages.
func (MessagesRequest) Validate ¶
func (r MessagesRequest) Validate() error
type MessagesResponse ¶
type MessagesResponse struct { // Hash is a hash of all envelopes sent in the single batch. Hash common.Hash // Per envelope error. Errors []EnvelopeError }
MessagesResponse sent as a response after processing batch of envelopes.
type MetricsRateLimiterHandler ¶
type MetricsRateLimiterHandler struct{}
func (MetricsRateLimiterHandler) ExceedIPLimit ¶
func (MetricsRateLimiterHandler) ExceedIPLimit() error
func (MetricsRateLimiterHandler) ExceedPeerLimit ¶
func (MetricsRateLimiterHandler) ExceedPeerLimit() error
type MultiVersionResponse ¶
MultiVersionResponse allows to decode response into chosen version.
func (MultiVersionResponse) DecodeResponse1 ¶
func (m MultiVersionResponse) DecodeResponse1() (resp MessagesResponse, err error)
DecodeResponse1 decodes response into first version of the messages response.
type NewMessage ¶
type NewMessage struct { SymKeyID string `json:"symKeyID"` PublicKey []byte `json:"pubKey"` Sig string `json:"sig"` TTL uint32 `json:"ttl"` Topic TopicType `json:"topic"` Payload []byte `json:"payload"` Padding []byte `json:"padding"` PowTime uint32 `json:"powTime"` PowTarget float64 `json:"powTarget"` TargetPeer string `json:"targetPeer"` }
NewMessage represents a new waku message that is posted through the RPC.
type Peer ¶
type Peer struct {
// contains filtered or unexported fields
}
Peer represents a waku protocol peer connection.
type PeerRateLimiter ¶
type PeerRateLimiter struct {
// contains filtered or unexported fields
}
func NewPeerRateLimiter ¶
func NewPeerRateLimiter(cfg *PeerRateLimiterConfig, handlers ...RateLimiterHandler) *PeerRateLimiter
type PeerRateLimiterConfig ¶
type PublicWakuAPI ¶
type PublicWakuAPI struct {
// contains filtered or unexported fields
}
PublicWakuAPI provides the waku RPC service that can be use publicly without security implications.
func NewPublicWakuAPI ¶
func NewPublicWakuAPI(w *Waku) *PublicWakuAPI
NewPublicWakuAPI create a new RPC waku service.
func (*PublicWakuAPI) AddPrivateKey ¶
func (api *PublicWakuAPI) AddPrivateKey(ctx context.Context, privateKey hexutil.Bytes) (string, error)
AddPrivateKey imports the given private key.
func (*PublicWakuAPI) AddSymKey ¶
AddSymKey import a symmetric key. It returns an ID that can be used to refer to the key. Can be used encrypting and decrypting messages where the key is known to both parties.
func (*PublicWakuAPI) CancelLightClient ¶
func (api *PublicWakuAPI) CancelLightClient(ctx context.Context) bool
CancelLightClient cancels light client mode.
func (*PublicWakuAPI) DeleteKeyPair ¶
DeleteKeyPair removes the key with the given key if it exists.
func (*PublicWakuAPI) DeleteMessageFilter ¶
func (api *PublicWakuAPI) DeleteMessageFilter(id string) (bool, error)
DeleteMessageFilter deletes a filter.
func (*PublicWakuAPI) DeleteSymKey ¶
func (api *PublicWakuAPI) DeleteSymKey(ctx context.Context, id string) bool
DeleteSymKey deletes the symmetric key that is associated with the given id.
func (*PublicWakuAPI) GenerateSymKeyFromPassword ¶
func (api *PublicWakuAPI) GenerateSymKeyFromPassword(ctx context.Context, passwd string) (string, error)
GenerateSymKeyFromPassword derive a key from the given password, stores it, and returns its ID.
func (*PublicWakuAPI) GetFilterMessages ¶
func (api *PublicWakuAPI) GetFilterMessages(id string) ([]*Message, error)
GetFilterMessages returns the messages that match the filter criteria and are received between the last poll and now.
func (*PublicWakuAPI) GetPrivateKey ¶
GetPrivateKey returns the private key associated with the given key. The key is the hex encoded representation of a key in the form specified in section 4.3.6 of ANSI X9.62.
func (*PublicWakuAPI) GetPublicKey ¶
GetPublicKey returns the public key associated with the given key. The key is the hex encoded representation of a key in the form specified in section 4.3.6 of ANSI X9.62.
func (*PublicWakuAPI) HasKeyPair ¶
func (api *PublicWakuAPI) HasKeyPair(ctx context.Context, id string) bool
HasKeyPair returns an indication if the node has a key pair that is associated with the given id.
func (*PublicWakuAPI) HasSymKey ¶
func (api *PublicWakuAPI) HasSymKey(ctx context.Context, id string) bool
HasSymKey returns an indication if the node has a symmetric key associated with the given key.
func (*PublicWakuAPI) Info ¶
func (api *PublicWakuAPI) Info(ctx context.Context) Info
Info returns diagnostic information about the waku node.
func (*PublicWakuAPI) MakeLightClient ¶
func (api *PublicWakuAPI) MakeLightClient(ctx context.Context) bool
MakeLightClient turns the node into light client, which does not forward any incoming messages, and sends only messages originated in this node.
func (*PublicWakuAPI) MarkTrustedPeer ¶
MarkTrustedPeer marks a peer trusted, which will allow it to send historic (expired) messages. Note: This function is not adding new nodes, the node needs to exists as a peer.
func (*PublicWakuAPI) Messages ¶
func (api *PublicWakuAPI) Messages(ctx context.Context, crit Criteria) (*rpc.Subscription, error)
Messages set up a subscription that fires events when messages arrive that match the given set of criteria.
func (*PublicWakuAPI) NewKeyPair ¶
func (api *PublicWakuAPI) NewKeyPair(ctx context.Context) (string, error)
NewKeyPair generates a new public and private key pair for message decryption and encryption. It returns an ID that can be used to refer to the keypair.
func (*PublicWakuAPI) NewMessageFilter ¶
func (api *PublicWakuAPI) NewMessageFilter(req Criteria) (string, error)
NewMessageFilter creates a new filter that can be used to poll for (new) messages that satisfy the given criteria.
func (*PublicWakuAPI) NewSymKey ¶
func (api *PublicWakuAPI) NewSymKey(ctx context.Context) (string, error)
NewSymKey generate a random symmetric key. It returns an ID that can be used to refer to the key. Can be used encrypting and decrypting messages where the key is known to both parties.
func (*PublicWakuAPI) Post ¶
func (api *PublicWakuAPI) Post(ctx context.Context, req NewMessage) (hexutil.Bytes, error)
Post posts a message on the Waku network. returns the hash of the message in case of success.
func (*PublicWakuAPI) SetBloomFilter ¶
SetBloomFilter sets the new value of bloom filter, and notifies the peers.
func (*PublicWakuAPI) SetMaxMessageSize ¶
SetMaxMessageSize sets the maximum message size that is accepted. Upper limit is defined by MaxMessageSize.
func (*PublicWakuAPI) UninstallFilter ¶
func (api *PublicWakuAPI) UninstallFilter(id string)
UninstallFilter is alias for Unsubscribe
func (*PublicWakuAPI) Unsubscribe ¶
func (api *PublicWakuAPI) Unsubscribe(id string)
Unsubscribe disables and removes an existing filter.
type RateLimiterHandler ¶
type RateLimits ¶
type RateLimits struct { IPLimits uint64 // messages per second from a single IP (default 0, no limits) PeerIDLimits uint64 // messages per second from a single peer ID (default 0, no limits) TopicLimits uint64 // messages per second from a single topic (default 0, no limits) }
RateLimits contains information about rate limit settings. It is exchanged using rateLimitingCode packet or in the handshake.
func (RateLimits) IsZero ¶
func (r RateLimits) IsZero() bool
type ReceivedMessage ¶
type ReceivedMessage struct { Raw []byte Payload []byte Padding []byte Signature []byte Salt []byte PoW float64 // Proof of work as described in the Waku 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 EnvelopeHash common.Hash // Message envelope hash to act as a unique id P2P bool // is set to true if this message was received from mail server. }
ReceivedMessage represents a data packet to be received through the Waku protocol and successfully decrypted.
func (*ReceivedMessage) SigToPubKey ¶
func (msg *ReceivedMessage) SigToPubKey() *ecdsa.PublicKey
SigToPubKey returns the public key associated to the message's signature.
func (*ReceivedMessage) ValidateAndParse ¶
func (msg *ReceivedMessage) ValidateAndParse() bool
ValidateAndParse checks the message validity and extracts the fields in case of success.
type TopicType ¶
type TopicType [TopicLength]byte
TopicType 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 ¶
BytesToTopic converts from the byte array representation of a topic into the TopicType type.
func (TopicType) MarshalText ¶
MarshalText returns the hex representation of t.
func (*TopicType) UnmarshalText ¶
UnmarshalText parses a hex representation to a topic.
type Version1MessageResponse ¶
type Version1MessageResponse struct { Version uint Response MessagesResponse }
Version1MessageResponse first version of the message response.
func NewMessagesResponse ¶
func NewMessagesResponse(batch common.Hash, errors []EnvelopeError) Version1MessageResponse
NewMessagesResponse returns instance of the version messages response.
type Waku ¶
type Waku struct {
// contains filtered or unexported fields
}
Waku represents a dark communication interface through the Ethereum network, using its very own P2P communication layer.
func (*Waku) AddKeyPair ¶
func (w *Waku) AddKeyPair(key *ecdsa.PrivateKey) (string, error)
AddKeyPair imports a asymmetric private key and returns it identifier.
func (*Waku) AddSymKeyDirect ¶
AddSymKeyDirect stores the key, and returns its id.
func (*Waku) AddSymKeyFromPassword ¶
AddSymKeyFromPassword generates the key from password, stores it, and returns its id.
func (*Waku) AllowP2PMessagesFromPeer ¶
AllowP2PMessagesFromPeer marks specific peer trusted, which will allow it to send historic (expired) messages.
func (*Waku) BloomFilter ¶
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 (*Waku) BloomFilterMode ¶
BloomFilterMode returns whether the node is running in bloom filter mode
func (*Waku) BloomFilterTolerance ¶
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 (*Waku) ConfirmationsEnabled ¶
ConfirmationsEnabled returns true if message confirmations are enabled.
func (*Waku) DeleteKeyPair ¶
DeleteKeyPair deletes the specified key if it exists.
func (*Waku) DeleteKeyPairs ¶
DeleteKeyPairs removes all cryptographic identities known to the node
func (*Waku) DeleteSymKey ¶
DeleteSymKey deletes the key associated with the name string if it exists.
func (*Waku) 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 (*Waku) GetEnvelope ¶
GetEnvelope retrieves an envelope from the message queue by its hash. It returns nil if the envelope can not be found.
func (*Waku) GetPrivateKey ¶
func (w *Waku) GetPrivateKey(id string) (*ecdsa.PrivateKey, error)
GetPrivateKey retrieves the private key of the specified identity.
func (*Waku) HandlePeer ¶
HandlePeer is called by the underlying P2P layer when the waku sub-protocol connection is negotiated.
func (*Waku) HasKeyPair ¶
HasKeyPair checks if the waku node is configured with the private key of the specified public pair.
func (*Waku) HasSymKey ¶
HasSymKey returns true if there is a key associated with the given id. Otherwise returns false.
func (*Waku) LightClientMode ¶
LightClientMode indicates is this node is light client (does not forward any messages)
func (*Waku) LightClientModeConnectionRestricted ¶
LightClientModeConnectionRestricted indicates that connection to light client in light client mode not allowed
func (*Waku) MaxMessageSize ¶
MaxMessageSize returns the maximum accepted message size.
func (*Waku) MinPowTolerance ¶
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 (*Waku) 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 (*Waku) RateLimits ¶
func (w *Waku) RateLimits() RateLimits
RateLimiting returns RateLimits information.
func (*Waku) RegisterBridge ¶
RegisterBridge registers a new Bridge that moves envelopes between different subprotocols. It's important that a bridge is registered before the service is started, otherwise, it won't read and propagate envelopes.
func (*Waku) RegisterMailServer ¶
func (w *Waku) RegisterMailServer(server MailServer)
RegisterMailServer registers MailServer interface. MailServer will process all the incoming messages with p2pRequestCode.
func (*Waku) RegisterRateLimiter ¶
func (w *Waku) RegisterRateLimiter(r *PeerRateLimiter)
SetRateLimiter registers a rate limiter.
func (*Waku) 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 waku protocol is agnostic of the format and contents of envelope.
func (*Waku) RequestHistoricMessagesWithTimeout ¶
func (w *Waku) RequestHistoricMessagesWithTimeout(peerID []byte, envelope *Envelope, timeout time.Duration) error
RequestHistoricMessagesWithTimeout acts as RequestHistoricMessages but requires to pass a timeout. It sends an event EventMailServerRequestExpired after the timeout.
func (*Waku) SelectKeyPair ¶
func (w *Waku) SelectKeyPair(key *ecdsa.PrivateKey) error
SelectKeyPair adds cryptographic identity, and makes sure that it is the only private key known to the node.
func (*Waku) Send ¶
Send injects a message into the waku send queue, to be distributed in the network in the coming cycles.
func (*Waku) SendHistoricMessageResponse ¶
func (*Waku) SendMessagesRequest ¶
func (w *Waku) SendMessagesRequest(peerID []byte, request MessagesRequest) error
func (*Waku) SendP2PDirect ¶
SendP2PDirect sends a peer-to-peer message to a specific peer. It sends one or more envelopes in a single batch.
func (*Waku) SendP2PMessages ¶
SendP2PMessage sends a peer-to-peer message to a specific peer. It sends one or more envelopes in a single batch.
func (*Waku) SendRawP2PDirect ¶
SendRawP2PDirect sends a peer-to-peer message to a specific peer. It sends one or more envelopes in a single batch.
func (*Waku) SetBloomFilter ¶
SetBloomFilter sets the new bloom filter
func (*Waku) SetBloomFilterMode ¶
func (*Waku) SetLightClientMode ¶
SetLightClientMode makes node light client (does not forward any messages)
func (*Waku) SetMaxMessageSize ¶
SetMaxMessageSize sets the maximal message size allowed by this node
func (*Waku) SetMinimumPoW ¶
SetMinimumPoW sets the minimal PoW required by this node
func (*Waku) SetTimeSource ¶
SetTimeSource assigns a particular source of time to a waku object.
func (*Waku) SetTopicInterest ¶
SetTopicInterest sets the new topicInterest
func (*Waku) Start ¶
Start implements node.Service, starting the background data propagation thread of the Waku protocol.
func (*Waku) Stop ¶
Stop implements node.Service, stopping the background data propagation thread of the Waku protocol.
func (*Waku) Subscribe ¶
Subscribe installs a new message handler used for filtering, decrypting and subsequent storing of incoming messages.
func (*Waku) SubscribeEnvelopeEvents ¶
func (w *Waku) SubscribeEnvelopeEvents(events chan<- EnvelopeEvent) event.Subscription
SubscribeEnvelopeEvents subscribes to envelopes feed. In order to prevent blocking waku producers events must be amply buffered.
func (*Waku) TopicInterest ¶
TopicInterest returns the all the topics of interest. The nodes are required to send only messages that match the advertised topics. If a message does not match the topic-interest, it will tantamount to spam, and the peer will be disconnected.
func (*Waku) Unsubscribe ¶
Unsubscribe removes an installed message handler. TODO: This does not seem to update the bloom filter, nor topic-interest Note that the filter/topic-interest needs to take into account that there might be filters with duplicated topics, so it's not just a matter of removing from the map, in the topic-interest case, while the bloom filter might need to be rebuilt from scratch