Documentation ¶
Index ¶
- Constants
- type AcceptedHandler
- type AcceptedSender
- type Bootstrapable
- type BootstrapableTest
- type Bootstrapper
- func (b *Bootstrapper) Accepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
- func (b *Bootstrapper) AcceptedFrontier(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
- func (b *Bootstrapper) Connected(validatorID ids.ShortID) error
- func (b *Bootstrapper) Disconnected(validatorID ids.ShortID) error
- func (b *Bootstrapper) GetAccepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
- func (b *Bootstrapper) GetAcceptedFailed(validatorID ids.ShortID, requestID uint32) error
- func (b *Bootstrapper) GetAcceptedFrontier(validatorID ids.ShortID, requestID uint32) error
- func (b *Bootstrapper) GetAcceptedFrontierFailed(validatorID ids.ShortID, requestID uint32) error
- func (b *Bootstrapper) Initialize(config Config) error
- func (b *Bootstrapper) Startup() error
- type Config
- type Engine
- type EngineTest
- func (e *EngineTest) Accepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
- func (e *EngineTest) AcceptedFrontier(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
- func (e *EngineTest) Chits(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
- func (e *EngineTest) Connected(validatorID ids.ShortID) error
- func (e *EngineTest) Context() *snow.Context
- func (e *EngineTest) Default(cant bool)
- func (e *EngineTest) Disconnected(validatorID ids.ShortID) error
- func (e *EngineTest) Get(validatorID ids.ShortID, requestID uint32, containerID ids.ID) error
- func (e *EngineTest) GetAccepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
- func (e *EngineTest) GetAcceptedFailed(validatorID ids.ShortID, requestID uint32) error
- func (e *EngineTest) GetAcceptedFrontier(validatorID ids.ShortID, requestID uint32) error
- func (e *EngineTest) GetAcceptedFrontierFailed(validatorID ids.ShortID, requestID uint32) error
- func (e *EngineTest) GetAncestors(validatorID ids.ShortID, requestID uint32, containerID ids.ID) error
- func (e *EngineTest) GetAncestorsFailed(validatorID ids.ShortID, requestID uint32) error
- func (e *EngineTest) GetFailed(validatorID ids.ShortID, requestID uint32) error
- func (e *EngineTest) Gossip() error
- func (e *EngineTest) Health() (interface{}, error)
- func (e *EngineTest) IsBootstrapped() bool
- func (e *EngineTest) MultiPut(validatorID ids.ShortID, requestID uint32, containers [][]byte) error
- func (e *EngineTest) Notify(msg Message) error
- func (e *EngineTest) PullQuery(validatorID ids.ShortID, requestID uint32, containerID ids.ID) error
- func (e *EngineTest) PushQuery(validatorID ids.ShortID, requestID uint32, containerID ids.ID, ...) error
- func (e *EngineTest) Put(validatorID ids.ShortID, requestID uint32, containerID ids.ID, ...) error
- func (e *EngineTest) QueryFailed(validatorID ids.ShortID, requestID uint32) error
- func (e *EngineTest) Shutdown() error
- func (e *EngineTest) Startup() error
- type ExternalHandler
- type FetchHandler
- type FetchSender
- type Fetcher
- type FrontierHandler
- type FrontierSender
- type Fx
- type Gossiper
- type HTTPHandler
- type Handler
- type InternalHandler
- type LockOption
- type Message
- type QueryHandler
- type QuerySender
- type Requests
- type Sender
- type SenderTest
- func (s *SenderTest) Accepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID)
- func (s *SenderTest) AcceptedFrontier(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID)
- func (s *SenderTest) Chits(vdr ids.ShortID, requestID uint32, votes []ids.ID)
- func (s *SenderTest) Default(cant bool)
- func (s *SenderTest) Get(vdr ids.ShortID, requestID uint32, vtxID ids.ID)
- func (s *SenderTest) GetAccepted(validatorIDs ids.ShortSet, requestID uint32, containerIDs []ids.ID)
- func (s *SenderTest) GetAcceptedFrontier(validatorIDs ids.ShortSet, requestID uint32)
- func (s *SenderTest) GetAncestors(validatorID ids.ShortID, requestID uint32, vtxID ids.ID)
- func (s *SenderTest) Gossip(containerID ids.ID, container []byte)
- func (s *SenderTest) MultiPut(vdr ids.ShortID, requestID uint32, vtxs [][]byte)
- func (s *SenderTest) PullQuery(vdrs ids.ShortSet, requestID uint32, vtxID ids.ID)
- func (s *SenderTest) PushQuery(vdrs ids.ShortSet, requestID uint32, vtxID ids.ID, vtx []byte)
- func (s *SenderTest) Put(vdr ids.ShortID, requestID uint32, vtxID ids.ID, vtx []byte)
- type StaticVM
- type TestVM
- func (vm *TestVM) Bootstrapped() error
- func (vm *TestVM) Bootstrapping() error
- func (vm *TestVM) CreateHandlers() map[string]*HTTPHandler
- func (vm *TestVM) CreateStaticHandlers() map[string]*HTTPHandler
- func (vm *TestVM) Default(cant bool)
- func (vm *TestVM) Health() (interface{}, error)
- func (vm *TestVM) Initialize(ctx *snow.Context, db database.Database, initState []byte, ...) error
- func (vm *TestVM) Shutdown() error
- type VM
Constants ¶
const ( // MaxContainersPerMultiPut is the maximum number of containers that can be // sent in a MultiPut message MaxContainersPerMultiPut = 2000 // StatusUpdateFrequency is how many containers should be processed between // logs StatusUpdateFrequency = 2500 // MaxOutstandingRequests is the maximum number of GetAncestors sent but not // responded to/failed MaxOutstandingRequests = 8 // MaxTimeFetchingAncestors is the maximum amount of time to spend fetching // vertices during a call to GetAncestors MaxTimeFetchingAncestors = 50 * time.Millisecond )
const ( WriteLock = iota ReadLock NoLock )
List of all allowed options
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AcceptedHandler ¶
type AcceptedHandler interface { // Notify this engine of a request to filter non-accepted vertices. // // This function can be called by any validator. It is not safe to assume // this message is utilizing a unique requestID. However, the validatorID is // assumed to be authenticated. // // This engine should respond with an Accepted message with the same // requestID, and the subset of the containerIDs that this node has decided // are accepted. GetAccepted( validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID, ) error // Notify this engine of a set of accepted vertices. // // This function can be called by any validator. It is not safe to assume // this message is in response to a GetAccepted message, is utilizing a // unique requestID, or that the containerIDs are a subset of the // containerIDs from a GetAccepted message. However, the validatorID is // assumed to be authenticated. Accepted( validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID, ) error // Notify this engine that a get accepted request it issued has failed. // // This function will be called if the engine sent a GetAccepted message // that is not anticipated to be responded to. This could be because the // recipient of the message is unknown or if the message request has timed // out. // // The validatorID, and requestID, are assumed to be the same as those sent // in the GetAccepted message. GetAcceptedFailed(validatorID ids.ShortID, requestID uint32) error }
AcceptedHandler defines how a consensus engine reacts to messages pertaining to accepted containers from other validators. Functions only return fatal errors if they occur.
type AcceptedSender ¶
type AcceptedSender interface { // GetAccepted requests that every validator in [validatorIDs] sends an // Accepted message with all the IDs in [containerIDs] that the validator // thinks is accepted. GetAccepted(validatorIDs ids.ShortSet, requestID uint32, containerIDs []ids.ID) // Accepted responds to a GetAccepted message with a set of IDs of // containers that are accepted. Accepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) }
AcceptedSender defines how a consensus engine sends messages pertaining to accepted containers
type Bootstrapable ¶
type Bootstrapable interface { // Returns the set of containerIDs that are accepted, but have no accepted // children. CurrentAcceptedFrontier() []ids.ID // Returns the subset of containerIDs that are accepted by this chain. FilterAccepted(containerIDs []ids.ID) (acceptedContainerIDs []ids.ID) // Force the provided containers to be accepted. Only returns fatal errors // if they occur. ForceAccepted(acceptedContainerIDs []ids.ID) error }
Bootstrapable defines the functionality required to support bootstrapping
type BootstrapableTest ¶
type BootstrapableTest struct { T *testing.T CantCurrentAcceptedFrontier, CantFilterAccepted, CantForceAccepted bool CurrentAcceptedFrontierF func() (acceptedContainerIDs []ids.ID) FilterAcceptedF func(containerIDs []ids.ID) (acceptedContainerIDs []ids.ID) ForceAcceptedF func(acceptedContainerIDs []ids.ID) error }
BootstrapableTest is a test engine that supports bootstrapping
func (*BootstrapableTest) CurrentAcceptedFrontier ¶
func (b *BootstrapableTest) CurrentAcceptedFrontier() []ids.ID
CurrentAcceptedFrontier implements the Bootstrapable interface
func (*BootstrapableTest) Default ¶
func (b *BootstrapableTest) Default(cant bool)
Default sets the default on call handling
func (*BootstrapableTest) FilterAccepted ¶
func (b *BootstrapableTest) FilterAccepted(containerIDs []ids.ID) []ids.ID
FilterAccepted implements the Bootstrapable interface
func (*BootstrapableTest) ForceAccepted ¶
func (b *BootstrapableTest) ForceAccepted(containerIDs []ids.ID) error
ForceAccepted implements the Bootstrapable interface
type Bootstrapper ¶
Bootstrapper implements the Engine interface.
func (*Bootstrapper) Accepted ¶
func (b *Bootstrapper) Accepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
Accepted implements the Engine interface.
func (*Bootstrapper) AcceptedFrontier ¶
func (b *Bootstrapper) AcceptedFrontier(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
AcceptedFrontier implements the Engine interface.
func (*Bootstrapper) Connected ¶
func (b *Bootstrapper) Connected(validatorID ids.ShortID) error
Connected implements the Engine interface.
func (*Bootstrapper) Disconnected ¶
func (b *Bootstrapper) Disconnected(validatorID ids.ShortID) error
Disconnected implements the Engine interface.
func (*Bootstrapper) GetAccepted ¶
func (b *Bootstrapper) GetAccepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
GetAccepted implements the Engine interface.
func (*Bootstrapper) GetAcceptedFailed ¶
func (b *Bootstrapper) GetAcceptedFailed(validatorID ids.ShortID, requestID uint32) error
GetAcceptedFailed implements the Engine interface.
func (*Bootstrapper) GetAcceptedFrontier ¶
func (b *Bootstrapper) GetAcceptedFrontier(validatorID ids.ShortID, requestID uint32) error
GetAcceptedFrontier implements the Engine interface.
func (*Bootstrapper) GetAcceptedFrontierFailed ¶
func (b *Bootstrapper) GetAcceptedFrontierFailed(validatorID ids.ShortID, requestID uint32) error
GetAcceptedFrontierFailed implements the Engine interface.
func (*Bootstrapper) Initialize ¶
func (b *Bootstrapper) Initialize(config Config) error
Initialize implements the Engine interface.
func (*Bootstrapper) Startup ¶
func (b *Bootstrapper) Startup() error
Startup implements the Engine interface.
type Config ¶
type Config struct { Ctx *snow.Context Validators validators.Set Beacons validators.Set SampleK int StartupAlpha uint64 Alpha uint64 Sender Sender Bootstrapable Bootstrapable }
Config wraps the common configurations that are needed by a Snow consensus engine
func DefaultConfigTest ¶
func DefaultConfigTest() Config
DefaultConfigTest returns a test configuration
func (*Config) IsBootstrapped ¶
IsBootstrapped returns true iff this chain is done bootstrapping
type Engine ¶
type Engine interface { Handler // Return the context of the chain this engine is working on Context() *snow.Context // Returns true iff the chain is done bootstrapping IsBootstrapped() bool // Returns nil if the engine is healthy. // Periodically called and reported through the health API Health() (interface{}, error) }
Engine describes the standard interface of a consensus engine
type EngineTest ¶
type EngineTest struct { T *testing.T CantIsBootstrapped, CantStartup, CantGossip, CantShutdown, CantContext, CantNotify, CantGetAcceptedFrontier, CantGetAcceptedFrontierFailed, CantAcceptedFrontier, CantGetAccepted, CantGetAcceptedFailed, CantAccepted, CantGet, CantGetAncestors, CantGetFailed, CantGetAncestorsFailed, CantPut, CantMultiPut, CantPushQuery, CantPullQuery, CantQueryFailed, CantChits, CantConnected, CantDisconnected, CantHealth bool IsBootstrappedF func() bool ContextF func() *snow.Context StartupF, GossipF, ShutdownF func() error NotifyF func(Message) error GetF, GetAncestorsF, PullQueryF func(validatorID ids.ShortID, requestID uint32, containerID ids.ID) error PutF, PushQueryF func(validatorID ids.ShortID, requestID uint32, containerID ids.ID, container []byte) error MultiPutF func(validatorID ids.ShortID, requestID uint32, containers [][]byte) error AcceptedFrontierF, GetAcceptedF, AcceptedF, ChitsF func(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error GetAcceptedFrontierF, GetFailedF, GetAncestorsFailedF, QueryFailedF, GetAcceptedFrontierFailedF, GetAcceptedFailedF func(validatorID ids.ShortID, requestID uint32) error ConnectedF, DisconnectedF func(validatorID ids.ShortID) error HealthF func() (interface{}, error) }
EngineTest is a test engine
func (*EngineTest) Accepted ¶
func (e *EngineTest) Accepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
Accepted ...
func (*EngineTest) AcceptedFrontier ¶
func (e *EngineTest) AcceptedFrontier(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
AcceptedFrontier ...
func (*EngineTest) Connected ¶
func (e *EngineTest) Connected(validatorID ids.ShortID) error
Connected ...
func (*EngineTest) Disconnected ¶
func (e *EngineTest) Disconnected(validatorID ids.ShortID) error
Disconnected ...
func (*EngineTest) GetAccepted ¶
func (e *EngineTest) GetAccepted(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error
GetAccepted ...
func (*EngineTest) GetAcceptedFailed ¶
func (e *EngineTest) GetAcceptedFailed(validatorID ids.ShortID, requestID uint32) error
GetAcceptedFailed ...
func (*EngineTest) GetAcceptedFrontier ¶
func (e *EngineTest) GetAcceptedFrontier(validatorID ids.ShortID, requestID uint32) error
GetAcceptedFrontier ...
func (*EngineTest) GetAcceptedFrontierFailed ¶
func (e *EngineTest) GetAcceptedFrontierFailed(validatorID ids.ShortID, requestID uint32) error
GetAcceptedFrontierFailed ...
func (*EngineTest) GetAncestors ¶
func (e *EngineTest) GetAncestors(validatorID ids.ShortID, requestID uint32, containerID ids.ID) error
GetAncestors ...
func (*EngineTest) GetAncestorsFailed ¶
func (e *EngineTest) GetAncestorsFailed(validatorID ids.ShortID, requestID uint32) error
GetAncestorsFailed ...
func (*EngineTest) GetFailed ¶
func (e *EngineTest) GetFailed(validatorID ids.ShortID, requestID uint32) error
GetFailed ...
func (*EngineTest) PushQuery ¶
func (e *EngineTest) PushQuery(validatorID ids.ShortID, requestID uint32, containerID ids.ID, container []byte) error
PushQuery ...
func (*EngineTest) Put ¶
func (e *EngineTest) Put(validatorID ids.ShortID, requestID uint32, containerID ids.ID, container []byte) error
Put ...
func (*EngineTest) QueryFailed ¶
func (e *EngineTest) QueryFailed(validatorID ids.ShortID, requestID uint32) error
QueryFailed ...
type ExternalHandler ¶
type ExternalHandler interface { FrontierHandler AcceptedHandler FetchHandler QueryHandler }
ExternalHandler defines how a consensus engine reacts to messages and requests from other validators
type FetchHandler ¶
type FetchHandler interface { // Notify this engine of a request for a container. // // This function can be called by any validator. It is not safe to assume // this message is utilizing a unique requestID. It is also not safe to // assume the requested containerID exists. However, the validatorID is // assumed to be authenticated. // // There should never be a situation where a virtuous node sends a Get // request to another virtuous node that does not have the requested // container. Unless that container was pruned from the active set. // // This engine should respond with a Put message with the same requestID if // the container was locally available. Otherwise, the message can be safely // dropped. Get(validatorID ids.ShortID, requestID uint32, containerID ids.ID) error // Notify this engine of a request for a container and its ancestors. // The request is from validator [validatorID]. The requested container is [containerID]. // // This function can be called by any validator. It is not safe to assume // this message is utilizing a unique requestID. It is also not safe to // assume the requested containerID exists. However, the validatorID is // assumed to be authenticated. // // This engine should respond with a MultiPut message with the same requestID, // which contains [containerID] as well as its ancestors. See MultiPut's documentation. // // If this engine doesn't have some ancestors, it should reply with its best effort attempt at getting them. // If this engine doesn't have [containerID] it can ignore this message. GetAncestors(validatorID ids.ShortID, requestID uint32, containerID ids.ID) error // Notify this engine of a container. // // This function can be called by any validator. It is not safe to assume // this message is utilizing a unique requestID or even that the containerID // matches the ID of the container bytes. However, the validatorID is // assumed to be authenticated. // // This engine needs to request and receive missing ancestors of the // container before adding the container to consensus. Once all ancestor // containers are added, pushes the container into the consensus. Put( validatorID ids.ShortID, requestID uint32, containerID ids.ID, container []byte, ) error // Notify this engine of multiple containers. // Each element of [containers] is the byte representation of a container. // // This should only be called during bootstrapping, and in response to a GetAncestors message to // [validatorID] with request ID [requestID]. This call should contain the container requested in // that message, along with ancestors. // The containers should be in BFS order (ie the first container must be the container // requested in the GetAncestors message and further back ancestors are later in [containers] // // It is not safe to assume this message is in response to a GetAncestor message, that this // message has a unique requestID or that any of the containers in [containers] are valid. // However, the validatorID is assumed to be authenticated. MultiPut( validatorID ids.ShortID, requestID uint32, containers [][]byte, ) error // Notify this engine that a get request it issued has failed. // // This function will be called if the engine sent a Get message that is not // anticipated to be responded to. This could be because the recipient of // the message is unknown or if the message request has timed out. // // The validatorID and requestID are assumed to be the same as those sent in // the Get message. GetFailed(validatorID ids.ShortID, requestID uint32) error // Notify this engine that a GetAncestors request it issued has failed. // // This function will be called if the engine sent a GetAncestors message that is not // anticipated to be responded to. This could be because the recipient of // the message is unknown or if the message request has timed out. // // The validatorID and requestID are assumed to be the same as those sent in // the GetAncestors message. GetAncestorsFailed(validatorID ids.ShortID, requestID uint32) error }
FetchHandler defines how a consensus engine reacts to retrieval messages from other validators. Functions only return fatal errors if they occur.
type FetchSender ¶
type FetchSender interface { // Request a container from a validator. // Request that the specified validator send the specified container // to this validator Get(validatorID ids.ShortID, requestID uint32, containerID ids.ID) // GetAncestors requests that the validator with ID [validatorID] send container [containerID] and its // ancestors. The maximum number of ancestors to send in response is defined in snow/engine/common/bootstrapper.go GetAncestors(validatorID ids.ShortID, requestID uint32, containerID ids.ID) // Tell the specified validator that the container whose ID is <containerID> // has body <container> Put(validatorID ids.ShortID, requestID uint32, containerID ids.ID, container []byte) // Give the specified validator several containers at once // Should be in response to a GetAncestors message with request ID [requestID] from the validator MultiPut(validatorID ids.ShortID, requestID uint32, containers [][]byte) }
FetchSender defines how a consensus engine sends retrieval messages to other validators
type Fetcher ¶
type Fetcher struct { // number of containers fetched so far NumFetched uint32 // tracks which validators were asked for which containers in which requests OutstandingRequests Requests // Called when bootstrapping is done OnFinished func() error }
Fetcher ...
type FrontierHandler ¶
type FrontierHandler interface { // Notify this engine of a request for the accepted frontier of vertices. // // The accepted frontier is the set of accepted vertices that do not have // any accepted descendants. // // This function can be called by any validator. It is not safe to assume // this message is utilizing a unique requestID. However, the validatorID is // assumed to be authenticated. // // This engine should respond with an AcceptedFrontier message with the same // requestID, and the engine's current accepted frontier. GetAcceptedFrontier(validatorID ids.ShortID, requestID uint32) error // Notify this engine of an accepted frontier. // // This function can be called by any validator. It is not safe to assume // this message is in response to a GetAcceptedFrontier message, is // utilizing a unique requestID, or that the containerIDs from a valid // frontier. However, the validatorID is assumed to be authenticated. AcceptedFrontier( validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID, ) error // Notify this engine that a get accepted frontier request it issued has // failed. // // This function will be called if the engine sent a GetAcceptedFrontier // message that is not anticipated to be responded to. This could be because // the recipient of the message is unknown or if the message request has // timed out. // // The validatorID, and requestID, are assumed to be the same as those sent // in the GetAcceptedFrontier message. GetAcceptedFrontierFailed(validatorID ids.ShortID, requestID uint32) error }
FrontierHandler defines how a consensus engine reacts to frontier messages from other validators. Returned errors should be treated as fatal and require the chain to shutdown.
type FrontierSender ¶
type FrontierSender interface { // GetAcceptedFrontier requests that every validator in [validatorIDs] sends // an AcceptedFrontier message. GetAcceptedFrontier(validatorIDs ids.ShortSet, requestID uint32) // AcceptedFrontier responds to a AcceptedFrontier message with this // engine's current accepted frontier. AcceptedFrontier(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) }
FrontierSender defines how a consensus engine sends frontier messages to other validators
type Gossiper ¶
type Gossiper interface { // Gossip gossips the provided container throughout the network Gossip(containerID ids.ID, container []byte) }
Gossiper defines how a consensus engine gossips a container on the accepted frontier to other validators
type HTTPHandler ¶
type HTTPHandler struct { LockOptions LockOption Handler http.Handler }
HTTPHandler ...
type Handler ¶
type Handler interface { ExternalHandler InternalHandler }
Handler defines the functions that are acted on the node
type InternalHandler ¶
type InternalHandler interface { // Startup this engine. // // This function will be called once the environment is configured to be // able to run the engine. Startup() error // Gossip to the network a container on the accepted frontier Gossip() error // Shutdown this engine. // // This function will be called when the environment is exiting. Shutdown() error // Notify this engine of a message from the virtual machine. Notify(Message) error // Notify this engine of a new peer. Connected(validatorID ids.ShortID) error // Notify this engine of a removed peer. Disconnected(validatorID ids.ShortID) error }
InternalHandler defines how this consensus engine reacts to messages from other components of this validator. Functions only return fatal errors if they occur.
type LockOption ¶
type LockOption uint32
LockOption allows the vm to specify their lock option based on their endpoint
type Message ¶
type Message uint32
Message is an enum of the message types that vms can send to consensus
type QueryHandler ¶
type QueryHandler interface { // Notify this engine of a request for our preferences. // // This function can be called by any validator. It is not safe to assume // this message is utilizing a unique requestID. However, the validatorID is // assumed to be authenticated. // // If the container or its ancestry is incomplete, this engine is expected // to request the missing containers from the validator. Once the ancestry // is complete, this engine should send this validator the current // preferences in a Chits message. The Chits message should have the same // requestID that was passed in here. PullQuery( validatorID ids.ShortID, requestID uint32, containerID ids.ID, ) error // Notify this engine of a request for our preferences. // // This function can be called by any validator. It is not safe to assume // this message is utilizing a unique requestID or even that the containerID // matches the ID of the container bytes. However, the validatorID is // assumed to be authenticated. // // This function is meant to behave the same way as PullQuery, except the // container is optimistically provided to potentially remove the need for // a series of Get/Put messages. // // If the ancestry of the container is incomplete, this engine is expected // to request the ancestry from the validator. Once the ancestry is // complete, this engine should send this validator the current preferences // in a Chits message. The Chits message should have the same requestID that // was passed in here. PushQuery( validatorID ids.ShortID, requestID uint32, containerID ids.ID, container []byte, ) error // Notify this engine of the specified validators preferences. // // This function can be called by any validator. It is not safe to assume // this message is in response to a PullQuery or a PushQuery message. // However, the validatorID is assumed to be authenticated. Chits(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID) error // Notify this engine that a query it issued has failed. // // This function will be called if the engine sent a PullQuery or PushQuery // message that is not anticipated to be responded to. This could be because // the recipient of the message is unknown or if the message request has // timed out. // // The validatorID and the requestID are assumed to be the same as those // sent in the Query message. QueryFailed(validatorID ids.ShortID, requestID uint32) error }
QueryHandler defines how a consensus engine reacts to query messages from other validators. Functions only return fatal errors if they occur.
type QuerySender ¶
type QuerySender interface { // Request from the specified validators their preferred frontier, given the // existence of the specified container. // This is the same as PullQuery, except that this message includes not only // the ID of the container but also its body. PushQuery(validatorIDs ids.ShortSet, requestID uint32, containerID ids.ID, container []byte) // Request from the specified validators their preferred frontier, given the // existence of the specified container. PullQuery(validatorIDs ids.ShortSet, requestID uint32, containerID ids.ID) // Chits sends chits to the specified validator Chits(validatorID ids.ShortID, requestID uint32, votes []ids.ID) }
QuerySender defines how a consensus engine sends query messages to other validators
type Requests ¶
type Requests struct {
// contains filtered or unexported fields
}
Requests tracks pending container messages from a peer.
func (*Requests) Add ¶
Add a request. Assumes that requestIDs are unique. Assumes that containerIDs are only in one request at a time.
func (*Requests) Contains ¶
Contains returns true if there is an outstanding request for the container ID.
type Sender ¶
type Sender interface { FrontierSender AcceptedSender FetchSender QuerySender Gossiper }
Sender defines how a consensus engine sends messages and requests to other validators
type SenderTest ¶
type SenderTest struct { T *testing.T CantGetAcceptedFrontier, CantAcceptedFrontier, CantGetAccepted, CantAccepted, CantGet, CantGetAncestors, CantPut, CantMultiPut, CantPullQuery, CantPushQuery, CantChits, CantGossip bool GetAcceptedFrontierF func(ids.ShortSet, uint32) AcceptedFrontierF func(ids.ShortID, uint32, []ids.ID) GetAcceptedF func(ids.ShortSet, uint32, []ids.ID) AcceptedF func(ids.ShortID, uint32, []ids.ID) GetF func(ids.ShortID, uint32, ids.ID) GetAncestorsF func(ids.ShortID, uint32, ids.ID) PutF func(ids.ShortID, uint32, ids.ID, []byte) MultiPutF func(ids.ShortID, uint32, [][]byte) PushQueryF func(ids.ShortSet, uint32, ids.ID, []byte) PullQueryF func(ids.ShortSet, uint32, ids.ID) ChitsF func(ids.ShortID, uint32, []ids.ID) GossipF func(ids.ID, []byte) }
SenderTest is a test sender
func (*SenderTest) Accepted ¶
Accepted calls AcceptedF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) AcceptedFrontier ¶
func (s *SenderTest) AcceptedFrontier(validatorID ids.ShortID, requestID uint32, containerIDs []ids.ID)
AcceptedFrontier calls AcceptedFrontierF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) Chits ¶
Chits calls ChitsF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) Default ¶
func (s *SenderTest) Default(cant bool)
Default set the default callable value to [cant]
func (*SenderTest) Get ¶
Get calls GetF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) GetAccepted ¶
func (s *SenderTest) GetAccepted(validatorIDs ids.ShortSet, requestID uint32, containerIDs []ids.ID)
GetAccepted calls GetAcceptedF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) GetAcceptedFrontier ¶
func (s *SenderTest) GetAcceptedFrontier(validatorIDs ids.ShortSet, requestID uint32)
GetAcceptedFrontier calls GetAcceptedFrontierF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) GetAncestors ¶
GetAncestors calls GetAncestorsF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) Gossip ¶
func (s *SenderTest) Gossip(containerID ids.ID, container []byte)
Gossip calls GossipF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) MultiPut ¶
func (s *SenderTest) MultiPut(vdr ids.ShortID, requestID uint32, vtxs [][]byte)
MultiPut calls MultiPutF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
func (*SenderTest) PullQuery ¶
PullQuery calls PullQueryF if it was initialized. If it wasn't initialized and this function shouldn't be called and testing was initialized, then testing will fail.
type StaticVM ¶
type StaticVM interface { // Creates the HTTP handlers for custom VM network calls. // // This exposes handlers that the outside world can use to communicate with // a static reference to the VM. Each handler has the path: // [Address of node]/ext/VM/[VM ID]/[extension] // // Returns a mapping from [extension]s to HTTP handlers. // // Each extension can specify how locking is managed for convenience. // // For example, it might make sense to have an extension for creating // genesis bytes this VM can interpret. CreateStaticHandlers() map[string]*HTTPHandler }
StaticVM describes the functionality that allows a user to interact with a VM statically.
type TestVM ¶
type TestVM struct { T *testing.T CantInitialize, CantBootstrapping, CantBootstrapped, CantShutdown, CantCreateHandlers, CantCreateStaticHandlers, CantHealth bool InitializeF func(*snow.Context, database.Database, []byte, chan<- Message, []*Fx) error BootstrappingF, BootstrappedF, ShutdownF func() error CreateHandlersF func() map[string]*HTTPHandler CreateStaticHandlersF func() map[string]*HTTPHandler HealthF func() (interface{}, error) }
TestVM is a test vm
func (*TestVM) CreateHandlers ¶
func (vm *TestVM) CreateHandlers() map[string]*HTTPHandler
CreateHandlers ...
func (*TestVM) CreateStaticHandlers ¶
func (vm *TestVM) CreateStaticHandlers() map[string]*HTTPHandler
CreateStaticHandlers ...
type VM ¶
type VM interface { // Initialize this VM. // [ctx]: Metadata about this VM. // [ctx.networkID]: The ID of the network this VM's chain is running on. // [ctx.chainID]: The unique ID of the chain this VM is running on. // [ctx.Log]: Used to log messages // [ctx.NodeID]: The unique staker ID of this node. // [ctx.Lock]: A Read/Write lock shared by this VM and the consensus // engine that manages this VM. The write lock is held // whenever code in the consensus engine calls the VM. // [db]: The database this VM will persist data to. // [genesisBytes]: The byte-encoding of the genesis information of this // VM. The VM uses it to initialize its state. For // example, if this VM were an account-based payments // system, `genesisBytes` would probably contain a genesis // transaction that gives coins to some accounts, and this // transaction would be in the genesis block. // [toEngine]: The channel used to send messages to the consensus engine. // [fxs]: Feature extensions that attach to this VM. Initialize( ctx *snow.Context, db database.Database, genesisBytes []byte, toEngine chan<- Message, fxs []*Fx, ) error // Bootstrapping is called when the node is starting to bootstrap this chain. Bootstrapping() error // Bootstrapped is called when the node is done bootstrapping this chain. Bootstrapped() error // Shutdown is called when the node is shutting down. Shutdown() error // Creates the HTTP handlers for custom chain network calls. // // This exposes handlers that the outside world can use to communicate with // the chain. Each handler has the path: // [Address of node]/ext/bc/[chain ID]/[extension] // // Returns a mapping from [extension]s to HTTP handlers. // // Each extension can specify how locking is managed for convenience. // // For example, if this VM implements an account-based payments system, // it have an extension called `accounts`, where clients could get // information about their accounts. CreateHandlers() map[string]*HTTPHandler // Returns nil if the VM is healthy. // Periodically called and reported via the node's Health API. Health() (interface{}, error) }
VM describes the interface that all consensus VMs must implement