Documentation ¶
Index ¶
- Constants
- Variables
- func BytesToUintBigEndian(b []byte) (res uint64)
- func BytesToUintLittleEndian(b []byte) (res uint64)
- func ContainsOnlyZeros(data []byte) bool
- func GenerateRandomID() (id string, err error)
- func GenerateSecureRandomData(length int) ([]byte, error)
- func IsPubKeyEqual(a, b *ecdsa.PublicKey) bool
- func ValidateDataIntegrity(k []byte, expectedSize int) bool
- func ValidatePublicKey(k *ecdsa.PublicKey) bool
- type EnvelopeError
- type EnvelopeEvent
- type EventType
- type Filter
- type Filters
- func (fs *Filters) AllTopics() []TopicType
- func (fs *Filters) Get(id string) *Filter
- func (fs *Filters) GetWatchersByTopic(topic TopicType) []*Filter
- func (fs *Filters) Install(watcher *Filter) (string, error)
- func (fs *Filters) NotifyWatchers(recvMessage *ReceivedMessage)
- func (fs *Filters) Uninstall(id string) bool
- type MemoryMessageStore
- type MessageParams
- type MessageStore
- type MessagesRequest
- type MessagesResponse
- type ReceivedMessage
- type TimeSyncError
- type TopicType
Constants ¶
const ( SizeMask = byte(3) // mask used to extract the size of payload size field from the flags TopicLength = 4 // in bytes AESKeyLength = 32 // in bytes KeyIDSize = 32 // in bytes BloomFilterSize = 64 // in bytes MaxTopicInterest = 10000 EnvelopeHeaderLength = 20 MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message. DefaultMaxMessageSize = uint32(1 << 20) // DefaultMaximumMessageSize is 1mb. ExpirationCycle = time.Second TransmissionCycle = 300 * time.Millisecond DefaultTTL = 50 // seconds DefaultSyncAllowance = 10 // seconds MaxLimitInSyncMailRequest = 1000 EnvelopeTimeNotSynced uint = iota + 1 EnvelopeOtherError MaxLimitInMessagesRequest = 1000 )
Waku protocol parameters
Variables ¶
var ( EnvelopesReceivedCounter = prom.NewCounter(prom.CounterOpts{ Name: "waku2_envelopes_received_total", Help: "Number of envelopes received.", }) EnvelopesValidatedCounter = prom.NewCounter(prom.CounterOpts{ Name: "waku2_envelopes_validated_total", Help: "Number of envelopes processed successfully.", }) EnvelopesRejectedCounter = prom.NewCounterVec(prom.CounterOpts{ Name: "waku2_envelopes_rejected_total", Help: "Number of envelopes rejected.", }, []string{"reason"}) EnvelopesCacheFailedCounter = prom.NewCounterVec(prom.CounterOpts{ Name: "waku2_envelopes_cache_failures_total", Help: "Number of envelopes which failed to be cached.", }, []string{"type"}) EnvelopesCachedCounter = prom.NewCounterVec(prom.CounterOpts{ Name: "waku2_envelopes_cached_total", Help: "Number of envelopes cached.", }, []string{"cache"}) EnvelopesSizeMeter = prom.NewHistogram(prom.HistogramOpts{ Name: "waku2_envelopes_size_bytes", Help: "Size of processed Waku envelopes in bytes.", Buckets: prom.ExponentialBuckets(256, 4, 10), }) RateLimitsProcessed = prom.NewCounter(prom.CounterOpts{ Name: "waku2_rate_limits_processed_total", Help: "Number of packets Waku rate limiter processed.", }) RateLimitsExceeded = prom.NewCounterVec(prom.CounterOpts{ Name: "waku2_rate_limits_exceeded_total", Help: "Number of times the Waku rate limits were exceeded", }, []string{"type"}) BridgeSent = prom.NewCounter(prom.CounterOpts{ Name: "waku2_bridge_sent_total", Help: "Number of envelopes bridged from Waku", }) BridgeReceivedSucceed = prom.NewCounter(prom.CounterOpts{ Name: "waku2_bridge_received_success_total", Help: "Number of envelopes bridged to Waku and successfully added", }) BridgeReceivedFailed = prom.NewCounter(prom.CounterOpts{ Name: "waku2_bridge_received_failure_total", Help: "Number of envelopes bridged to Waku and failed to be added", }) )
Functions ¶
func BytesToUintBigEndian ¶
BytesToUintBigEndian converts the slice to 64-bit unsigned integer.
func BytesToUintLittleEndian ¶
BytesToUintLittleEndian converts the slice to 64-bit unsigned integer.
func ContainsOnlyZeros ¶
ContainsOnlyZeros checks if the data contain only zeros.
func GenerateRandomID ¶
GenerateRandomID generates a random string, which is then returned to be used as a key id
func GenerateSecureRandomData ¶
GenerateSecureRandomData generates random data where extra security is required. The purpose of this function is to prevent some bugs in software or in hardware from delivering not-very-random data. This is especially useful for AES nonce, where true randomness does not really matter, but it is very important to have a unique nonce for every message.
func IsPubKeyEqual ¶
IsPubKeyEqual checks that two public keys are equal
func ValidateDataIntegrity ¶
ValidateDataIntegrity returns false if the data have the wrong or contains all zeros, which is the simplest and the most common bug.
func ValidatePublicKey ¶
ValidatePublicKey checks the format of the given public key.
Types ¶
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 represents an envelope event.
type EventType ¶
type EventType string
EventType used to define known waku 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 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) 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 (*Filters) GetWatchersByTopic ¶
GetWatchersByTopic returns a slice containing the filters that match a specific topic
func (*Filters) NotifyWatchers ¶
func (fs *Filters) NotifyWatchers(recvMessage *ReceivedMessage)
NotifyWatchers notifies any filter that has declared interest for the envelope's topic.
type MemoryMessageStore ¶
type MemoryMessageStore struct {
// contains filtered or unexported fields
}
MemoryMessageStore represents messages stored in a 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 MessageParams ¶
type MessageParams struct { Src *ecdsa.PrivateKey Dst *ecdsa.PublicKey KeySym []byte Topic TopicType 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"` // 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 for 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 ReceivedMessage ¶
type ReceivedMessage struct { Envelope *protocol.Envelope // Wrapped Waku Message Data []byte Padding []byte Signature []byte Sent uint32 // Time when the message was posted into the network 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 // contains filtered or unexported fields }
ReceivedMessage represents a data packet to be received through the WakuV2 protocol and successfully decrypted.
func NewReceivedMessage ¶
func NewReceivedMessage(env *protocol.Envelope) *ReceivedMessage
func (*ReceivedMessage) Hash ¶
func (msg *ReceivedMessage) Hash() common.Hash
Hash returns the SHA3 hash of the envelope, calculating it if not yet done.
func (*ReceivedMessage) Open ¶
func (msg *ReceivedMessage) Open(watcher *Filter) (result *ReceivedMessage)
Open tries to decrypt an message, and populates the message 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 (leftmost) 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 StringToTopic ¶
func (TopicType) MarshalText ¶
MarshalText returns the hex representation of t.
func (*TopicType) UnmarshalText ¶
UnmarshalText parses a hex representation to a topic.