Documentation
¶
Index ¶
- Constants
- Variables
- func ParseMessage(msg []byte) (uint64, []byte, bool)
- func PrefixMessage(prefix, msg []byte) []byte
- func ProtocolPrefix(handlerID uint64) []byte
- type Client
- func (c *Client) Gossip(ctx context.Context, config SendConfig, gossipBytes []byte) error
- func (c *Client) Request(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestBytes []byte, ...) error
- func (c *Client) RequestAny(ctx context.Context, requestBytes []byte, onResponse ResponseCallback) error
- type ClientOption
- type Clock
- type Error
- type Handler
- type Network
- func (n *Network) AddHandler(handlerID uint64, handler Handler) error
- func (n *Network) Connected(_ context.Context, nodeID ids.NodeID, _ *consensusversion.Application) error
- func (n *Network) Disconnected(_ context.Context, nodeID ids.NodeID) error
- func (n *Network) Gossip(ctx context.Context, nodeID ids.NodeID, msg []byte) error
- func (n *Network) NewClient(handlerID uint64, options ...ClientOption) *Client
- func (n *Network) Request(ctx context.Context, nodeID ids.NodeID, requestID uint32, deadline time.Time, ...) ([]byte, *Error)
- func (n *Network) RequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32, appErr *Error) error
- func (n *Network) Response(ctx context.Context, nodeID ids.NodeID, requestID uint32, response []byte) error
- type NoOpHandler
- type NodeSampler
- type PeerSampler
- type PeerTracker
- func (p *PeerTracker) Connected(nodeID ids.NodeID, nodeVersion *consensusversion.Application)
- func (p *PeerTracker) Disconnected(nodeID ids.NodeID)
- func (p *PeerTracker) RegisterFailure(nodeID ids.NodeID)
- func (p *PeerTracker) RegisterRequest(nodeID ids.NodeID)
- func (p *PeerTracker) RegisterResponse(nodeID ids.NodeID, bandwidth float64)
- func (p *PeerTracker) SelectPeer() (ids.NodeID, bool)
- func (p *PeerTracker) Size() int
- type Peers
- type ResponseCallback
- type SendConfig
- type Sender
- type SlidingWindowThrottler
- type TestHandler
- type Throttler
- type ThrottlerHandler
- type ValidatorHandler
- type ValidatorSet
- type ValidatorSubset
- type Validators
Constants ¶
const ( TxGossipHandlerID = iota AtomicTxGossipHandlerID // SignatureRequestHandlerID is specified in LP-118 SignatureRequestHandlerID )
Standardized identifiers for application protocol handlers
Variables ¶
var ( ErrRequestPending = errors.New("request pending") ErrNoPeers = errors.New("no peers") )
var ( // ErrUnexpected should be used to indicate that a request failed due to a // generic error ErrUnexpected = &Error{ Code: -1, Message: "unexpected error", } // ErrUnregisteredHandler should be used to indicate that a request failed // due to it not matching a registered handler ErrUnregisteredHandler = &Error{ Code: -2, Message: "unregistered handler", } // ErrNotValidator should be used to indicate that a request failed due to // the requesting peer not being a validator ErrNotValidator = &Error{ Code: -3, Message: "not a validator", } // ErrThrottled should be used to indicate that a request failed due to the // requesting peer exceeding a rate limit ErrThrottled = &Error{ Code: -4, Message: "throttled", } )
var ( ErrExistingAppProtocol = errors.New("existing app protocol") ErrUnrequestedResponse = errors.New("unrequested response") )
Functions ¶
func ParseMessage ¶
Parse a gossip or request message.
Returns: - The protocol ID. - The unprefixed protocol message. - A boolean indicating that parsing succeeded.
func PrefixMessage ¶
PrefixMessage prefixes the original message with the protocol identifier.
Only gossip and request messages need to be prefixed. Response messages don't need to be prefixed because request ids are tracked which map to the expected response handler.
func ProtocolPrefix ¶
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
func (*Client) Request ¶
func (c *Client) Request( ctx context.Context, nodeIDs set.Set[ids.NodeID], requestBytes []byte, onResponse ResponseCallback, ) error
Request issues an arbitrary request to a node. [onResponse] is invoked upon an error or a response.
func (*Client) RequestAny ¶
func (c *Client) RequestAny( ctx context.Context, requestBytes []byte, onResponse ResponseCallback, ) error
RequestAny issues a request to an arbitrary node decided by Client. If a specific node needs to be requested, use Request instead. See Request for more docs.
type ClientOption ¶
type ClientOption interface {
// contains filtered or unexported methods
}
ClientOption configures Client
func WithValidatorSampling ¶
func WithValidatorSampling(validators *Validators) ClientOption
WithValidatorSampling configures Client.RequestAny to sample validators. If validators is nil, the default PeerSampler is kept.
type Handler ¶
type Handler interface {
// Gossip is called when handling a gossip message.
Gossip(
ctx context.Context,
nodeID ids.NodeID,
gossipBytes []byte,
)
// Request is called when handling a request message.
// Sends a response with the response corresponding to requestBytes or
// an application-defined error.
Request(
ctx context.Context,
nodeID ids.NodeID,
deadline time.Time,
requestBytes []byte,
) ([]byte, *Error)
}
Handler is the server-side logic for virtual machine application protocols.
type Network ¶
type Network struct {
Peers *Peers
// contains filtered or unexported fields
}
Network exposes networking state and supports building p2p application protocols
func NewNetwork ¶
func NewNetwork( log log.Logger, sender Sender, registerer metric.Registerer, namespace string, ) (*Network, error)
NewNetwork returns an instance of Network
func (*Network) AddHandler ¶
AddHandler reserves an identifier for an application protocol
func (*Network) Connected ¶
func (n *Network) Connected(_ context.Context, nodeID ids.NodeID, _ *consensusversion.Application) error
func (*Network) Disconnected ¶
func (*Network) NewClient ¶
func (n *Network) NewClient(handlerID uint64, options ...ClientOption) *Client
NewClient returns a Client that can be used to send messages for the corresponding protocol.
func (*Network) RequestFailed ¶
type NodeSampler ¶
type NodeSampler interface {
// Sample returns at most [limit] nodes. This may return fewer nodes if
// fewer than [limit] are available.
Sample(ctx context.Context, limit int) []ids.NodeID
}
NodeSampler samples nodes in network
type PeerTracker ¶
type PeerTracker struct {
// contains filtered or unexported fields
}
Tracks the bandwidth of responses coming from peers, preferring to contact peers with known good bandwidth, connecting to new peers with an exponentially decaying probability.
func NewPeerTracker ¶
func NewPeerTracker( log log.Logger, metricsNamespace string, registerer metric.Registerer, ignoredNodes set.Set[ids.NodeID], minVersion *consensusversion.Application, ) (*PeerTracker, error)
func (*PeerTracker) Connected ¶
func (p *PeerTracker) Connected(nodeID ids.NodeID, nodeVersion *consensusversion.Application)
Connected should be called when [nodeID] connects to this node.
func (*PeerTracker) Disconnected ¶
func (p *PeerTracker) Disconnected(nodeID ids.NodeID)
Disconnected should be called when [nodeID] disconnects from this node.
func (*PeerTracker) RegisterFailure ¶
func (p *PeerTracker) RegisterFailure(nodeID ids.NodeID)
Record that a request failed to [nodeID].
func (*PeerTracker) RegisterRequest ¶
func (p *PeerTracker) RegisterRequest(nodeID ids.NodeID)
Record that we sent a request to [nodeID].
func (*PeerTracker) RegisterResponse ¶
func (p *PeerTracker) RegisterResponse(nodeID ids.NodeID, bandwidth float64)
Record that we observed that [nodeID]'s bandwidth is [bandwidth].
func (*PeerTracker) SelectPeer ¶
func (p *PeerTracker) SelectPeer() (ids.NodeID, bool)
SelectPeer that we could send a request to.
func (*PeerTracker) Size ¶
func (p *PeerTracker) Size() int
Returns the number of peers the node is connected to.
type Peers ¶
type Peers struct {
// contains filtered or unexported fields
}
Peers contains metadata about the current set of connected peers
type ResponseCallback ¶
type ResponseCallback func( ctx context.Context, nodeID ids.NodeID, responseBytes []byte, err error, )
ResponseCallback is called upon receiving a response for a request issued by Client. Callers should check [err] to see whether the request failed or not.
type SendConfig ¶
type SendConfig struct {
// NodeIDs specifies specific nodes to send to
NodeIDs set.Set[ids.NodeID]
// Validators is the number of validators to sample and send to
Validators int
// NonValidators is the number of non-validators to sample and send to
NonValidators int
// Peers is the number of peers to sample and send to
Peers int
}
SendConfig configures how a gossip message is sent
type Sender ¶
type Sender interface {
// SendRequest sends a request to the specified nodes
SendRequest(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestID uint32, request []byte) error
// SendResponse sends a response to a previous request
SendResponse(ctx context.Context, nodeID ids.NodeID, requestID uint32, response []byte) error
// SendError sends an error response to a previous request
SendError(ctx context.Context, nodeID ids.NodeID, requestID uint32, errorCode int32, errorMessage string) error
// SendGossip sends a gossip message
SendGossip(ctx context.Context, config SendConfig, msg []byte) error
}
Sender sends messages to other nodes
type SlidingWindowThrottler ¶
type SlidingWindowThrottler struct {
// contains filtered or unexported fields
}
SlidingWindowThrottler is an implementation of the sliding window throttling algorithm.
func NewSlidingWindowThrottler ¶
func NewSlidingWindowThrottler(period time.Duration, limit int) *SlidingWindowThrottler
NewSlidingWindowThrottler returns a new instance of SlidingWindowThrottler. Nodes are throttled if they exceed [limit] messages during an interval of time over [period]. [period] and [limit] should both be > 0.
func (*SlidingWindowThrottler) Handle ¶
func (s *SlidingWindowThrottler) Handle(nodeID ids.NodeID) bool
Handle returns true if the amount of calls received in the last [s.period] time is less than [s.limit]
This is calculated by adding the current period's count to a weighted count of the previous period.
type TestHandler ¶
type TestHandler struct {
GossipF func(ctx context.Context, nodeID ids.NodeID, gossipBytes []byte)
RequestF func(ctx context.Context, nodeID ids.NodeID, deadline time.Time, requestBytes []byte) ([]byte, *Error)
}
type ThrottlerHandler ¶
type ThrottlerHandler struct {
// contains filtered or unexported fields
}
func NewThrottlerHandler ¶
func NewThrottlerHandler(handler Handler, throttler Throttler, log log.Logger) *ThrottlerHandler
type ValidatorHandler ¶
type ValidatorHandler struct {
// contains filtered or unexported fields
}
ValidatorHandler drops messages from non-validators
func NewValidatorHandler ¶
func NewValidatorHandler( handler Handler, validatorSet ValidatorSet, log log.Logger, ) *ValidatorHandler
type ValidatorSet ¶
type ValidatorSubset ¶
type Validators ¶
type Validators struct {
// contains filtered or unexported fields
}
Validators contains a set of nodes that are staking.
func NewValidators ¶
func NewValidators( peers *Peers, log log.Logger, netID ids.ID, validators validators.State, maxValidatorSetStaleness time.Duration, ) *Validators
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package lp118 implements the Lux Protocol 118 (LP118) for warp message handling.
|
Package lp118 implements the Lux Protocol 118 (LP118) for warp message handling. |
|
Package message is a generated GoMock package.
|
Package message is a generated GoMock package. |
|
messagemock
Package messagemock is a generated GoMock package.
|
Package messagemock is a generated GoMock package. |
|
Package peer is a generated GoMock package.
|
Package peer is a generated GoMock package. |
|
proto
|
|
|
p2p
Package p2p re-exports ZAP types for default builds.
|
Package p2p re-exports ZAP types for default builds. |
|
pb/p2p
Package p2p re-exports ZAP types for default builds.
|
Package p2p re-exports ZAP types for default builds. |
|
zap/p2p
Package p2p provides ZAP-encoded p2p message types.
|
Package p2p provides ZAP-encoded p2p message types. |
|
trackermock
Package trackermock provides mock implementations for testing
|
Package trackermock provides mock implementations for testing |