Documentation ¶
Index ¶
- Constants
- Variables
- func CompareHRS(h1 int64, r1 int, s1 cstypes.RoundStepType, h2 int64, r2 int, ...) int
- type BlockPartMessage
- type ConsensusMessage
- type ConsensusReactor
- func (conR *ConsensusReactor) AddPeer(peer p2p.Peer)
- func (conR *ConsensusReactor) FastSync() bool
- func (conR *ConsensusReactor) GetChannels() []*p2p.ChannelDescriptor
- func (conR *ConsensusReactor) InitPeer(peer p2p.Peer) p2p.Peer
- func (conR *ConsensusReactor) OnStart() error
- func (conR *ConsensusReactor) OnStop()
- func (conR *ConsensusReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte)
- func (conR *ConsensusReactor) RemovePeer(peer p2p.Peer, reason interface{})
- func (conR *ConsensusReactor) SetEventSwitch(evsw events.EventSwitch)
- func (conR *ConsensusReactor) String() string
- func (conR *ConsensusReactor) StringIndented(indent string) string
- func (conR *ConsensusReactor) SwitchToConsensus(state sm.State, blocksSynced int)
- type ConsensusState
- func (cs *ConsensusState) AddProposalBlockPart(height int64, round int, part *types.Part, peerID p2p.ID) error
- func (cs *ConsensusState) AddVote(vote *types.Vote, peerID p2p.ID) (added bool, err error)
- func (cs *ConsensusState) GetConfigDeepCopy() *cnscfg.ConsensusConfig
- func (cs *ConsensusState) GetHRS() cstypes.HRS
- func (cs *ConsensusState) GetLastHeight() int64
- func (cs *ConsensusState) GetRoundState() *cstypes.RoundState
- func (cs *ConsensusState) GetRoundStateDeepCopy() *cstypes.RoundState
- func (cs *ConsensusState) GetRoundStateSimple() cstypes.RoundStateSimple
- func (cs *ConsensusState) GetState() sm.State
- func (cs *ConsensusState) GetValidators() (int64, []*types.Validator)
- func (cs *ConsensusState) LoadCommit(height int64) *types.Commit
- func (cs *ConsensusState) OnStart() error
- func (cs *ConsensusState) OnStop()
- func (cs *ConsensusState) OpenWAL(walFile string) (walm.WAL, error)
- func (cs *ConsensusState) ReplayFile(file string, console bool) error
- func (cs *ConsensusState) SetEventSwitch(evsw events.EventSwitch)
- func (cs *ConsensusState) SetLogger(l *slog.Logger)
- func (cs *ConsensusState) SetPrivValidator(priv types.PrivValidator)
- func (cs *ConsensusState) SetProposal(proposal *types.Proposal, peerID p2p.ID) error
- func (cs *ConsensusState) SetProposalAndBlock(proposal *types.Proposal, block *types.Block, parts *types.PartSet, ...) error
- func (cs *ConsensusState) SetTimeoutTicker(timeoutTicker TimeoutTicker)
- func (cs *ConsensusState) StartWithoutWALCatchup()
- func (cs *ConsensusState) String() string
- func (cs *ConsensusState) Wait()
- type Handshaker
- func (h *Handshaker) Handshake(proxyApp appconn.AppConns) error
- func (h *Handshaker) NBlocks() int
- func (h *Handshaker) ReplayBlocks(state sm.State, appHash []byte, appBlockHeight int64, ...) ([]byte, error)
- func (h *Handshaker) SetEventSwitch(evsw events.EventSwitch)
- func (h *Handshaker) SetLogger(l *slog.Logger)
- type HasVoteMessage
- type NewRoundStepMessage
- type NewValidBlockMessage
- type PeerState
- func (ps *PeerState) ApplyHasVoteMessage(msg *HasVoteMessage)
- func (ps *PeerState) ApplyNewRoundStepMessage(msg *NewRoundStepMessage)
- func (ps *PeerState) ApplyNewValidBlockMessage(msg *NewValidBlockMessage)
- func (ps *PeerState) ApplyProposalPOLMessage(msg *ProposalPOLMessage)
- func (ps *PeerState) ApplyVoteSetBitsMessage(msg *VoteSetBitsMessage, ourVotes *bitarray.BitArray)
- func (ps *PeerState) BlockPartsSent() int
- func (ps *PeerState) EnsureVoteBitArrays(height int64, numValidators int)
- func (ps *PeerState) GetExposed() cstypes.PeerStateExposed
- func (ps *PeerState) GetHeight() int64
- func (ps *PeerState) GetRoundState() *cstypes.PeerRoundState
- func (ps *PeerState) InitProposalBlockParts(partsHeader types.PartSetHeader)
- func (ps *PeerState) PickSendVote(votes types.VoteSetReader) bool
- func (ps *PeerState) PickVoteToSend(votes types.VoteSetReader) (vote *types.Vote, ok bool)
- func (ps *PeerState) RecordBlockPart() int
- func (ps *PeerState) RecordVote() int
- func (ps *PeerState) SetHasProposal(proposal *types.Proposal)
- func (ps *PeerState) SetHasProposalBlockPart(height int64, round int, index int)
- func (ps *PeerState) SetHasVote(vote *types.Vote)
- func (ps *PeerState) SetLogger(logger *slog.Logger) *PeerState
- func (ps *PeerState) String() string
- func (ps *PeerState) StringIndented(indent string) string
- func (ps *PeerState) VotesSent() int
- type ProposalMessage
- type ProposalPOLMessage
- type ReactorOption
- type StateOption
- type TimeoutTicker
- type VoteMessage
- type VoteSetBitsMessage
- type VoteSetMaj23Message
Constants ¶
const ( StateChannel = byte(0x20) DataChannel = byte(0x21) VoteChannel = byte(0x22) VoteSetBitsChannel = byte(0x23) )
Variables ¶
var ( ErrPeerStateHeightRegression = errors.New("Error peer state height regression") ErrPeerStateInvalidStartTime = errors.New("Error peer state invalid startTime") )
var ( ErrInvalidProposalSignature = errors.New("Error invalid proposal signature") ErrInvalidProposalPOLRound = errors.New("Error invalid proposal POL round") ErrAddingVote = errors.New("Error adding vote") ErrVoteHeightMismatch = errors.New("Error vote height mismatch") )
var Package = amino.RegisterPackage(amino.NewPackage( "github.com/gnolang/gno/tm2/pkg/bft/consensus", "tm", amino.GetCallersDirname(), ). WithDependencies( cstypes.Package, types.Package, ). WithTypes( &NewRoundStepMessage{}, &NewValidBlockMessage{}, &ProposalMessage{}, &ProposalPOLMessage{}, &BlockPartMessage{}, &VoteMessage{}, &HasVoteMessage{}, &VoteSetMaj23Message{}, &VoteSetBitsMessage{}, newRoundStepInfo{}, msgInfo{}, timeoutInfo{}, ))
Functions ¶
func CompareHRS ¶
func CompareHRS(h1 int64, r1 int, s1 cstypes.RoundStepType, h2 int64, r2 int, s2 cstypes.RoundStepType) int
Types ¶
type BlockPartMessage ¶
BlockPartMessage is sent when gossipping a piece of the proposed block.
func (*BlockPartMessage) String ¶
func (m *BlockPartMessage) String() string
String returns a string representation.
func (*BlockPartMessage) ValidateBasic ¶
func (m *BlockPartMessage) ValidateBasic() error
ValidateBasic performs basic validation.
type ConsensusMessage ¶
type ConsensusMessage interface {
ValidateBasic() error
}
ConsensusMessage is a message that can be sent and received on the ConsensusReactor
type ConsensusReactor ¶
type ConsensusReactor struct { p2p.BaseReactor // BaseService + p2p.Switch // contains filtered or unexported fields }
ConsensusReactor defines a reactor for the consensus service.
func NewConsensusReactor ¶
func NewConsensusReactor(consensusState *ConsensusState, fastSync bool, options ...ReactorOption) *ConsensusReactor
NewConsensusReactor returns a new ConsensusReactor with the given consensusState.
func (*ConsensusReactor) AddPeer ¶
func (conR *ConsensusReactor) AddPeer(peer p2p.Peer)
AddPeer implements Reactor by spawning multiple gossiping goroutines for the peer.
func (*ConsensusReactor) FastSync ¶
func (conR *ConsensusReactor) FastSync() bool
FastSync returns whether the consensus reactor is in fast-sync mode.
func (*ConsensusReactor) GetChannels ¶
func (conR *ConsensusReactor) GetChannels() []*p2p.ChannelDescriptor
GetChannels implements Reactor
func (*ConsensusReactor) InitPeer ¶
func (conR *ConsensusReactor) InitPeer(peer p2p.Peer) p2p.Peer
InitPeer implements Reactor by creating a state for the peer.
func (*ConsensusReactor) OnStart ¶
func (conR *ConsensusReactor) OnStart() error
OnStart implements BaseService by subscribing to events, which later will be broadcasted to other peers and starting state if we're not in fast sync.
func (*ConsensusReactor) OnStop ¶
func (conR *ConsensusReactor) OnStop()
OnStop implements BaseService by unsubscribing from events and stopping state.
func (*ConsensusReactor) Receive ¶
func (conR *ConsensusReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte)
Receive implements Reactor NOTE: We process these messages even when we're fast_syncing. Messages affect either a peer state or the consensus state. Peer state updates can happen in parallel, but processing of proposals, block parts, and votes are ordered by the receiveRoutine NOTE: blocks on consensus state for proposals, block parts, and votes
func (*ConsensusReactor) RemovePeer ¶
func (conR *ConsensusReactor) RemovePeer(peer p2p.Peer, reason interface{})
RemovePeer is a noop.
func (*ConsensusReactor) SetEventSwitch ¶
func (conR *ConsensusReactor) SetEventSwitch(evsw events.EventSwitch)
SetEventSwitch sets event bus.
func (*ConsensusReactor) String ¶
func (conR *ConsensusReactor) String() string
String returns a string representation of the ConsensusReactor. NOTE: For now, it is just a hard-coded string to avoid accessing unprotected shared variables. TODO: improve!
func (*ConsensusReactor) StringIndented ¶
func (conR *ConsensusReactor) StringIndented(indent string) string
StringIndented returns an indented string representation of the ConsensusReactor
func (*ConsensusReactor) SwitchToConsensus ¶
func (conR *ConsensusReactor) SwitchToConsensus(state sm.State, blocksSynced int)
SwitchToConsensus switches from fast_sync mode to consensus mode. It resets the state, turns off fast_sync, and starts the consensus state-machine
type ConsensusState ¶
type ConsensusState struct { service.BaseService cstypes.RoundState // contains filtered or unexported fields }
ConsensusState handles execution of the consensus algorithm. It processes votes and proposals, and upon reaching agreement, commits blocks to the chain and executes them against the application. The internal state machine receives input from peers, the internal validator, and from a timer.
func NewConsensusState ¶
func NewConsensusState( config *cnscfg.ConsensusConfig, state sm.State, blockExec *sm.BlockExecutor, blockStore sm.BlockStore, txNotifier txNotifier, options ...StateOption, ) *ConsensusState
NewConsensusState returns a new ConsensusState.
func (*ConsensusState) AddProposalBlockPart ¶
func (cs *ConsensusState) AddProposalBlockPart(height int64, round int, part *types.Part, peerID p2p.ID) error
AddProposalBlockPart inputs a part of the proposal block.
func (*ConsensusState) GetConfigDeepCopy ¶
func (cs *ConsensusState) GetConfigDeepCopy() *cnscfg.ConsensusConfig
GetConfig returns a copy of the chain state.
func (*ConsensusState) GetHRS ¶
func (cs *ConsensusState) GetHRS() cstypes.HRS
func (*ConsensusState) GetLastHeight ¶
func (cs *ConsensusState) GetLastHeight() int64
GetLastHeight returns the last height committed. If there were no blocks, returns 0.
func (*ConsensusState) GetRoundState ¶
func (cs *ConsensusState) GetRoundState() *cstypes.RoundState
GetRoundState returns a shallow copy of the internal consensus state.
func (*ConsensusState) GetRoundStateDeepCopy ¶
func (cs *ConsensusState) GetRoundStateDeepCopy() *cstypes.RoundState
GetRoundStateDeepCopy returns a deep copy of the internal consensus state.
func (*ConsensusState) GetRoundStateSimple ¶
func (cs *ConsensusState) GetRoundStateSimple() cstypes.RoundStateSimple
GetRoundStateSimple returns a simplified representation, RoundStateSimple.
func (*ConsensusState) GetState ¶
func (cs *ConsensusState) GetState() sm.State
GetState returns a copy of the chain state.
func (*ConsensusState) GetValidators ¶
func (cs *ConsensusState) GetValidators() (int64, []*types.Validator)
GetValidators returns a copy of the current validators.
func (*ConsensusState) LoadCommit ¶
func (cs *ConsensusState) LoadCommit(height int64) *types.Commit
LoadCommit loads the commit for a given height.
func (*ConsensusState) OnStart ¶
func (cs *ConsensusState) OnStart() error
OnStart implements service.Service. It loads the latest state via the WAL, and starts the timeout and receive routines.
func (*ConsensusState) OnStop ¶
func (cs *ConsensusState) OnStop()
OnStop implements service.Service.
func (*ConsensusState) OpenWAL ¶
func (cs *ConsensusState) OpenWAL(walFile string) (walm.WAL, error)
OpenWAL opens a file to log all consensus messages and timeouts for deterministic accountability
func (*ConsensusState) ReplayFile ¶
func (cs *ConsensusState) ReplayFile(file string, console bool) error
Replay msgs in file or start the console
func (*ConsensusState) SetEventSwitch ¶
func (cs *ConsensusState) SetEventSwitch(evsw events.EventSwitch)
SetEventSwitch sets event bus.
func (*ConsensusState) SetLogger ¶
func (cs *ConsensusState) SetLogger(l *slog.Logger)
SetLogger implements Service.
func (*ConsensusState) SetPrivValidator ¶
func (cs *ConsensusState) SetPrivValidator(priv types.PrivValidator)
SetPrivValidator sets the private validator account for signing votes.
func (*ConsensusState) SetProposal ¶
SetProposal inputs a proposal.
func (*ConsensusState) SetProposalAndBlock ¶
func (cs *ConsensusState) SetProposalAndBlock(proposal *types.Proposal, block *types.Block, parts *types.PartSet, peerID p2p.ID) error
SetProposalAndBlock inputs the proposal and all block parts.
func (*ConsensusState) SetTimeoutTicker ¶
func (cs *ConsensusState) SetTimeoutTicker(timeoutTicker TimeoutTicker)
SetTimeoutTicker sets the local timer. It may be useful to overwrite for testing.
func (*ConsensusState) StartWithoutWALCatchup ¶
func (cs *ConsensusState) StartWithoutWALCatchup()
Useful for testing.
func (*ConsensusState) Wait ¶
func (cs *ConsensusState) Wait()
Wait waits for the the main routine to return. NOTE: be sure to Stop() the event switch and drain any event listeners or this may deadlock
type Handshaker ¶
type Handshaker struct {
// contains filtered or unexported fields
}
func NewHandshaker ¶
func NewHandshaker(stateDB dbm.DB, state sm.State, store sm.BlockStore, genDoc *types.GenesisDoc, ) *Handshaker
func (*Handshaker) Handshake ¶
func (h *Handshaker) Handshake(proxyApp appconn.AppConns) error
TODO: retry the handshake/replay if it fails ?
func (*Handshaker) NBlocks ¶
func (h *Handshaker) NBlocks() int
NBlocks returns the number of blocks applied to the state.
func (*Handshaker) ReplayBlocks ¶
func (h *Handshaker) ReplayBlocks( state sm.State, appHash []byte, appBlockHeight int64, proxyApp appconn.AppConns, ) ([]byte, error)
ReplayBlocks replays all blocks since appBlockHeight and ensures the result matches the current state. Returns the final AppHash or an error.
func (*Handshaker) SetEventSwitch ¶
func (h *Handshaker) SetEventSwitch(evsw events.EventSwitch)
SetEventSwitch - sets the event bus for publishing block related events. If not called, it defaults to types.NopEventSwitch.
func (*Handshaker) SetLogger ¶
func (h *Handshaker) SetLogger(l *slog.Logger)
type HasVoteMessage ¶
type HasVoteMessage struct { Height int64 Round int Type types.SignedMsgType Index int }
HasVoteMessage is sent to indicate that a particular vote has been received.
func (*HasVoteMessage) String ¶
func (m *HasVoteMessage) String() string
String returns a string representation.
func (*HasVoteMessage) ValidateBasic ¶
func (m *HasVoteMessage) ValidateBasic() error
ValidateBasic performs basic validation.
type NewRoundStepMessage ¶
type NewRoundStepMessage struct { Height int64 Round int Step cstypes.RoundStepType SecondsSinceStartTime int LastCommitRound int }
NewRoundStepMessage is sent for every step taken in the ConsensusState. For every height/round/step transition
func (*NewRoundStepMessage) String ¶
func (m *NewRoundStepMessage) String() string
String returns a string representation.
func (*NewRoundStepMessage) ValidateBasic ¶
func (m *NewRoundStepMessage) ValidateBasic() error
ValidateBasic performs basic validation.
type NewValidBlockMessage ¶
type NewValidBlockMessage struct { Height int64 Round int BlockPartsHeader types.PartSetHeader BlockParts *bitarray.BitArray IsCommit bool }
NewValidBlockMessage is sent when a validator observes a valid block B in some round r, i.e., there is a Proposal for block B and 2/3+ prevotes for the block B in the round r. In case the block is also committed, then IsCommit flag is set to true.
func (*NewValidBlockMessage) String ¶
func (m *NewValidBlockMessage) String() string
String returns a string representation.
func (*NewValidBlockMessage) ValidateBasic ¶
func (m *NewValidBlockMessage) ValidateBasic() error
ValidateBasic performs basic validation.
type PeerState ¶
type PeerState struct { cstypes.PeerStateExposed // contains filtered or unexported fields }
PeerState contains the known state of a peer, including its connection and threadsafe access to its PeerRoundState. NOTE: PeerStateExposed gets dumped with rpc/core/consensus.go. Be mindful of what you Expose.
func NewPeerState ¶
NewPeerState returns a new PeerState for the given Peer
func (*PeerState) ApplyHasVoteMessage ¶
func (ps *PeerState) ApplyHasVoteMessage(msg *HasVoteMessage)
ApplyHasVoteMessage updates the peer state for the new vote.
func (*PeerState) ApplyNewRoundStepMessage ¶
func (ps *PeerState) ApplyNewRoundStepMessage(msg *NewRoundStepMessage)
ApplyNewRoundStepMessage updates the peer state for the new round.
func (*PeerState) ApplyNewValidBlockMessage ¶
func (ps *PeerState) ApplyNewValidBlockMessage(msg *NewValidBlockMessage)
ApplyNewValidBlockMessage updates the peer state for the new valid block.
func (*PeerState) ApplyProposalPOLMessage ¶
func (ps *PeerState) ApplyProposalPOLMessage(msg *ProposalPOLMessage)
ApplyProposalPOLMessage updates the peer state for the new proposal POL.
func (*PeerState) ApplyVoteSetBitsMessage ¶
func (ps *PeerState) ApplyVoteSetBitsMessage(msg *VoteSetBitsMessage, ourVotes *bitarray.BitArray)
ApplyVoteSetBitsMessage updates the peer state for the bit-array of votes it claims to have for the corresponding BlockID. `ourVotes` is a BitArray of votes we have for msg.BlockID NOTE: if ourVotes is nil (e.g. msg.Height < rs.Height), we conservatively overwrite ps's votes w/ msg.Votes.
func (*PeerState) BlockPartsSent ¶
BlockPartsSent returns the number of useful block parts the peer has sent us.
func (*PeerState) EnsureVoteBitArrays ¶
EnsureVoteBitArrays ensures the bit-arrays have been allocated for tracking what votes this peer has received. NOTE: It's important to make sure that numValidators actually matches what the node sees as the number of validators for height.
func (*PeerState) GetExposed ¶
func (ps *PeerState) GetExposed() cstypes.PeerStateExposed
GetExposed returns the PeerStateExposed. This method is type-asserted for working with rpc/core.go without an import. The returned value is read-only.
func (*PeerState) GetHeight ¶
GetHeight returns an atomic snapshot of the PeerRoundState's height used by the mempool to ensure peers are caught up before broadcasting new txs
func (*PeerState) GetRoundState ¶
func (ps *PeerState) GetRoundState() *cstypes.PeerRoundState
GetRoundState returns an shallow copy of the PeerRoundState. There's no point in mutating it since it won't change PeerState.
func (*PeerState) InitProposalBlockParts ¶
func (ps *PeerState) InitProposalBlockParts(partsHeader types.PartSetHeader)
InitProposalBlockParts initializes the peer's proposal block parts header and bit array.
func (*PeerState) PickSendVote ¶
func (ps *PeerState) PickSendVote(votes types.VoteSetReader) bool
PickSendVote picks a vote and sends it to the peer. Returns true if vote was sent.
func (*PeerState) PickVoteToSend ¶
PickVoteToSend picks a vote to send to the peer. Returns true if a vote was picked. NOTE: `votes` must be the correct Size() for the Height().
func (*PeerState) RecordBlockPart ¶
RecordBlockPart increments internal block part related statistics for this peer. It returns the total number of added block parts.
func (*PeerState) RecordVote ¶
RecordVote increments internal votes related statistics for this peer. It returns the total number of added votes.
func (*PeerState) SetHasProposal ¶
SetHasProposal sets the given proposal as known for the peer.
func (*PeerState) SetHasProposalBlockPart ¶
SetHasProposalBlockPart sets the given block part index as known for the peer.
func (*PeerState) SetHasVote ¶
SetHasVote sets the given vote as known by the peer
func (*PeerState) SetLogger ¶
SetLogger allows to set a logger on the peer state. Returns the peer state itself.
func (*PeerState) StringIndented ¶
StringIndented returns a string representation of the PeerState
type ProposalMessage ¶
ProposalMessage is sent when a new block is proposed.
func (*ProposalMessage) String ¶
func (m *ProposalMessage) String() string
String returns a string representation.
func (*ProposalMessage) ValidateBasic ¶
func (m *ProposalMessage) ValidateBasic() error
ValidateBasic performs basic validation.
type ProposalPOLMessage ¶
ProposalPOLMessage is sent when a previous proposal is re-proposed.
func (*ProposalPOLMessage) String ¶
func (m *ProposalPOLMessage) String() string
String returns a string representation.
func (*ProposalPOLMessage) ValidateBasic ¶
func (m *ProposalPOLMessage) ValidateBasic() error
ValidateBasic performs basic validation.
type ReactorOption ¶
type ReactorOption func(*ConsensusReactor)
type StateOption ¶
type StateOption func(*ConsensusState)
StateOption sets an optional parameter on the ConsensusState.
type TimeoutTicker ¶
type TimeoutTicker interface { Start() error Stop() error Chan() <-chan timeoutInfo // on which to receive a timeout ScheduleTimeout(ti timeoutInfo) // reset the timer SetLogger(*slog.Logger) }
TimeoutTicker is a timer that schedules timeouts conditional on the height/round/step in the timeoutInfo. The timeoutInfo.Duration may be non-positive.
func NewTimeoutTicker ¶
func NewTimeoutTicker() TimeoutTicker
NewTimeoutTicker returns a new TimeoutTicker.
type VoteMessage ¶
VoteMessage is sent when voting for a proposal (or lack thereof).
func (*VoteMessage) String ¶
func (m *VoteMessage) String() string
String returns a string representation.
func (*VoteMessage) ValidateBasic ¶
func (m *VoteMessage) ValidateBasic() error
ValidateBasic performs basic validation.
type VoteSetBitsMessage ¶
type VoteSetBitsMessage struct { Height int64 Round int Type types.SignedMsgType BlockID types.BlockID Votes *bitarray.BitArray }
VoteSetBitsMessage is sent to communicate the bit-array of votes seen for the BlockID.
func (*VoteSetBitsMessage) String ¶
func (m *VoteSetBitsMessage) String() string
String returns a string representation.
func (*VoteSetBitsMessage) ValidateBasic ¶
func (m *VoteSetBitsMessage) ValidateBasic() error
ValidateBasic performs basic validation.
type VoteSetMaj23Message ¶
type VoteSetMaj23Message struct { Height int64 Round int Type types.SignedMsgType BlockID types.BlockID }
VoteSetMaj23Message is sent to indicate that a given BlockID has seen +2/3 votes.
func (*VoteSetMaj23Message) String ¶
func (m *VoteSetMaj23Message) String() string
String returns a string representation.
func (*VoteSetMaj23Message) ValidateBasic ¶
func (m *VoteSetMaj23Message) ValidateBasic() error
ValidateBasic performs basic validation.