Documentation
¶
Index ¶
- Constants
- Variables
- type HeightVoteSet
- func (hvs *HeightVoteSet) AddVerifiedVote(vote *types.Vote, verified types.VoteVerification) (added bool, err error)
- func (hvs *HeightVoteSet) AddVote(vote *types.Vote) (added bool, err error)
- func (hvs *HeightVoteSet) AddVoteWithVerificationBudget(vote *types.Vote, budget types.VerificationBudget) (added bool, err error)
- func (hvs *HeightVoteSet) GetVoteSet(round int32, voteType tmproto.SignedMsgType) *types.VoteSet
- func (hvs *HeightVoteSet) Height() int64
- func (hvs *HeightVoteSet) MarshalJSON() ([]byte, error)
- func (hvs *HeightVoteSet) POLInfo() (polRound int32, polBlockID types.BlockID)
- func (hvs *HeightVoteSet) Precommits(round int32) *types.VoteSet
- func (hvs *HeightVoteSet) Prevotes(round int32) *types.VoteSet
- func (hvs *HeightVoteSet) Reset(height int64, valSet *types.ValidatorSet)
- func (hvs *HeightVoteSet) Round() int32
- func (hvs *HeightVoteSet) SetPeerMaj23(height int64, round int32, voteType tmproto.SignedMsgType, peerID types.NodeID, ...) error
- func (hvs *HeightVoteSet) SetRound(round int32)
- func (hvs *HeightVoteSet) String() string
- func (hvs *HeightVoteSet) StringIndented(indent string) string
- type HeightVoteSetOption
- type PeerRoundState
- type ProposalCreator
- type ProposalSetter
- type Proposaler
- type RoundState
- func (rs *RoundState) BlockID() types.BlockID
- func (rs *RoundState) CompleteProposalEvent() types.EventDataCompleteProposal
- func (rs *RoundState) NewRoundEvent() types.EventDataNewRound
- func (rs RoundState) NewRoundStepMessage() *tmcons.NewRoundStep
- func (rs RoundState) NewValidBlockMessage() *tmcons.NewValidBlock
- func (rs *RoundState) RoundStateEvent() types.EventDataRoundState
- func (rs *RoundState) RoundStateSimple() RoundStateSimple
- func (rs *RoundState) String() string
- func (rs *RoundState) StringIndented(indent string) string
- func (rs *RoundState) StringShort() string
- type RoundStateSimple
- type RoundStepType
- type RoundVoteSet
Constants ¶
const ( RoundStepNewHeight = RoundStepType(0x01) // Wait til CommitTime + timeoutCommit RoundStepNewRound = RoundStepType(0x02) // Setup new round and go to RoundStepPropose RoundStepPropose = RoundStepType(0x03) // Did propose, gossip proposal RoundStepPrevote = RoundStepType(0x04) // Did prevote, gossip prevotes RoundStepPrevoteWait = RoundStepType(0x05) // Did receive any +2/3 prevotes, start timeout RoundStepPrecommit = RoundStepType(0x06) // Did precommit, gossip precommits RoundStepPrecommitWait = RoundStepType(0x07) // Did receive any +2/3 precommits, start timeout RoundStepApplyCommit = RoundStepType(0x08) // Entered commit state machine )
RoundStepType
Variables ¶
var (
ErrGotVoteFromUnwantedRound = errors.New(
"peer has sent a vote that does not match our round for more than one round",
)
)
Functions ¶
This section is empty.
Types ¶
type HeightVoteSet ¶
type HeightVoteSet struct {
// contains filtered or unexported fields
}
Keeps track of all VoteSets from round 0 to round 'round'.
Also keeps track of up to one RoundVoteSet greater than 'round' from each peer, to facilitate catchup syncing of commits.
A commit is +2/3 precommits for a block at a round, but which round is not known in advance, so when a peer provides a precommit for a round greater than mtx.round, we create a new entry in roundVoteSets but also remember the peer to prevent abuse. We let each peer provide us with up to 2 unexpected "catchup" rounds. One for their LastPrecommits round, and another for the official commit round.
func NewHeightVoteSet ¶
func NewHeightVoteSet( chainID string, height int64, valSet *types.ValidatorSet, opts ...HeightVoteSetOption, ) *HeightVoteSet
func (*HeightVoteSet) AddVerifiedVote ¶ added in v1.7.0
func (hvs *HeightVoteSet) AddVerifiedVote( vote *types.Vote, verified types.VoteVerification, ) (added bool, err error)
AddVerifiedVote adds a vote whose signatures a caller has already verified, on the evidence of that verification. The round's vote set decides whether the evidence covers what it is about to store, and refuses the vote when it does not.
func (*HeightVoteSet) AddVote ¶
func (hvs *HeightVoteSet) AddVote(vote *types.Vote) (added bool, err error)
AddVote adds a vote of a specific type to the round Duplicate votes return added=false, err=nil.
func (*HeightVoteSet) AddVoteWithVerificationBudget ¶ added in v1.7.0
func (hvs *HeightVoteSet) AddVoteWithVerificationBudget( vote *types.Vote, budget types.VerificationBudget, ) (added bool, err error)
AddVoteWithVerificationBudget adds a vote while charging each signature verification to budget.
func (*HeightVoteSet) GetVoteSet ¶
func (hvs *HeightVoteSet) GetVoteSet(round int32, voteType tmproto.SignedMsgType) *types.VoteSet
GetVoteSet returns the vote-set for the round and the type of vote
func (*HeightVoteSet) Height ¶
func (hvs *HeightVoteSet) Height() int64
func (*HeightVoteSet) MarshalJSON ¶
func (hvs *HeightVoteSet) MarshalJSON() ([]byte, error)
func (*HeightVoteSet) POLInfo ¶
func (hvs *HeightVoteSet) POLInfo() (polRound int32, polBlockID types.BlockID)
Last round and blockID that has +2/3 prevotes for a particular block or nil. Returns -1 if no such round exists.
func (*HeightVoteSet) Precommits ¶
func (hvs *HeightVoteSet) Precommits(round int32) *types.VoteSet
func (*HeightVoteSet) Reset ¶
func (hvs *HeightVoteSet) Reset(height int64, valSet *types.ValidatorSet)
func (*HeightVoteSet) Round ¶
func (hvs *HeightVoteSet) Round() int32
func (*HeightVoteSet) SetPeerMaj23 ¶
func (hvs *HeightVoteSet) SetPeerMaj23( height int64, round int32, voteType tmproto.SignedMsgType, peerID types.NodeID, blockID types.BlockID) error
If a peer claims that it has 2/3 majority for given blockKey, call this. NOTE: if there are too many peers, or too much peer churn, this can cause memory issues. TODO: implement ability to remove peers too
func (*HeightVoteSet) SetRound ¶
func (hvs *HeightVoteSet) SetRound(round int32)
Create more RoundVoteSets up to round.
func (*HeightVoteSet) String ¶
func (hvs *HeightVoteSet) String() string
func (*HeightVoteSet) StringIndented ¶
func (hvs *HeightVoteSet) StringIndented(indent string) string
type HeightVoteSetOption ¶ added in v1.6.0
type HeightVoteSetOption func(*HeightVoteSet)
HeightVoteSetOption configures optional HeightVoteSet behavior.
func WithLogger ¶ added in v1.6.0
func WithLogger(logger log.Logger) HeightVoteSetOption
WithLogger sets the logger propagated into every VoteSet this HeightVoteSet constructs. When unset (or passed nil) a no-op logger is used.
type PeerRoundState ¶
type PeerRoundState struct {
Height int64 `json:"height"` // Height peer is at
Round int32 `json:"round"` // Round peer is at, -1 if unknown.
Step RoundStepType `json:"step"` // Step peer is at
// Estimated start of round 0 at this height
StartTime time.Time `json:"start_time"`
// True if peer has proposal for this round
Proposal bool `json:"proposal"`
ProposalBlockPartSetHeader types.PartSetHeader `json:"proposal_block_part_set_header"`
ProposalBlockParts *bits.BitArray `json:"proposal_block_parts"`
// Proposal's POL round. -1 if none.
ProposalPOLRound int32 `json:"proposal_pol_round"`
// nil until ProposalPOLMessage received.
ProposalPOL *bits.BitArray `json:"proposal_pol"`
Prevotes *bits.BitArray `json:"prevotes"` // All votes peer has for this round
Precommits *bits.BitArray `json:"precommits"` // All precommits peer has for this round
LastCommitRound int32 `json:"last_commit_round"` // Round of commit for last height. -1 if none.
HasCommit bool `json:"has_commit"`
// Round that we have commit for. Not necessarily unique. -1 if none.
CatchupCommitRound int32 `json:"catchup_commit_round"`
// All commit precommits peer has for this height & CatchupCommitRound
CatchupCommit *bits.BitArray `json:"catchup_commit"`
}
PeerRoundState contains the known state of a peer. NOTE: Read-only when returned by PeerState.GetRoundState().
func (PeerRoundState) Copy ¶
func (prs PeerRoundState) Copy() PeerRoundState
Copy provides a deep copy operation. Because many of the fields in the PeerRound struct are pointers, we need an explicit deep copy operation to avoid a non-obvious shared data situation.
func (PeerRoundState) MarshalZerologObject ¶
func (prs PeerRoundState) MarshalZerologObject(e *zerolog.Event)
MarshalZerologObject formats this object for logging purposes
func (PeerRoundState) String ¶
func (prs PeerRoundState) String() string
String returns a string representation of the PeerRoundState
func (PeerRoundState) StringIndented ¶
func (prs PeerRoundState) StringIndented(indent string) string
StringIndented returns a string representation of the PeerRoundState
type ProposalCreator ¶
type ProposalCreator interface {
Create(ctx context.Context, height int64, round int32, rs *RoundState) error
}
ProposalCreator creates and updates RoundState with a new proposal for a round if a validator is the proposer and the proposal wasn't created yet
type ProposalSetter ¶
type ProposalSetter interface {
Set(ctx context.Context, proposal *types.Proposal, receivedAt time.Time, rs *RoundState) error
}
ProposalSetter updates a proposal for the round if all conditions are met.
The context carries the permit the proposal's signature check is drawn against, so a caller that received the proposal from a peer can bound the verification work it forces.
type Proposaler ¶
type Proposaler interface {
ProposalCreator
ProposalSetter
}
Proposaler is the interface that groups the ProposalSetter and ProposalCreator interfaces
type RoundState ¶
type RoundState struct {
Height int64 `json:"height"` // Height we are working on
Round int32 `json:"round"`
Step RoundStepType `json:"step"`
StartTime time.Time `json:"start_time"`
// Subjective time when +2/3 precommits for Block at Round were found
CommitTime time.Time `json:"commit_time"`
Validators *types.ValidatorSet `json:"validators"`
ProposerSelector selectproposer.ProposerSelector
Proposal *types.Proposal `json:"proposal"`
ProposalReceiveTime time.Time `json:"proposal_receive_time"`
ProposalBlock *types.Block `json:"proposal_block"`
ProposalBlockParts *types.PartSet `json:"proposal_block_parts"`
LockedRound int32 `json:"locked_round"`
LockedBlock *types.Block `json:"locked_block"`
LockedBlockParts *types.PartSet `json:"locked_block_parts"`
Commit *types.Commit `json:"commit"`
// Last known round with POL for non-nil valid block.
ValidRound int32 `json:"valid_round"`
ValidBlock *types.Block `json:"valid_block"` // Last known block of POL mentioned above.
ValidBlockRecvTime time.Time `json:"valid_block_time"` // Receive time of last known block of POL mentioned above.
// Last known block parts of POL mentioned above.
ValidBlockParts *types.PartSet `json:"valid_block_parts"`
Votes *HeightVoteSet `json:"votes"`
CommitRound int32 `json:"commit_round"`
LastCommit *types.Commit `json:"last_commit"`
LastValidators *types.ValidatorSet `json:"last_validators"`
TriggeredTimeoutPrecommit bool `json:"triggered_timeout_precommit"`
sm.CurrentRoundState `json:"uncommitted_state"`
}
RoundState defines the internal consensus state. NOTE: Not thread safe. Should only be manipulated by functions downstream of the cs.receiveRoutine
func (*RoundState) BlockID ¶
func (rs *RoundState) BlockID() types.BlockID
BlockID returns block ID from proposal or constructs new block ID from ProposalBlock and ProposalBlockParts. cs.Proposal is not guaranteed to be set when this function is called
func (*RoundState) CompleteProposalEvent ¶
func (rs *RoundState) CompleteProposalEvent() types.EventDataCompleteProposal
CompleteProposalEvent returns information about a proposed block as an event.
func (*RoundState) NewRoundEvent ¶
func (rs *RoundState) NewRoundEvent() types.EventDataNewRound
NewRoundEvent returns the RoundState with proposer information as an event.
func (RoundState) NewRoundStepMessage ¶
func (rs RoundState) NewRoundStepMessage() *tmcons.NewRoundStep
NewRoundStepMessage generates tmcons.NewRoundStep message for the RoundState.
func (RoundState) NewValidBlockMessage ¶
func (rs RoundState) NewValidBlockMessage() *tmcons.NewValidBlock
NewValidBlockMessage generates tmcons.NewValidBlock message for the RoundState.
func (*RoundState) RoundStateEvent ¶
func (rs *RoundState) RoundStateEvent() types.EventDataRoundState
RoundStateEvent returns the H/R/S of the RoundState as an event.
func (*RoundState) RoundStateSimple ¶
func (rs *RoundState) RoundStateSimple() RoundStateSimple
RoundStateSimple compresses the RoundState to RoundStateSimple
func (*RoundState) StringIndented ¶
func (rs *RoundState) StringIndented(indent string) string
StringIndented returns a string
func (*RoundState) StringShort ¶
func (rs *RoundState) StringShort() string
StringShort returns a string
type RoundStateSimple ¶
type RoundStateSimple struct {
HeightRoundStep string `json:"height/round/step"`
StartTime time.Time `json:"start_time"`
ProposalBlockHash bytes.HexBytes `json:"proposal_block_hash"`
LockedBlockHash bytes.HexBytes `json:"locked_block_hash"`
ValidBlockHash bytes.HexBytes `json:"valid_block_hash"`
Votes json.RawMessage `json:"height_vote_set"`
Proposer types.ValidatorInfo `json:"proposer"`
}
RoundStateSimple is a compressed version of the RoundState for use in RPC
type RoundStepType ¶
type RoundStepType uint8 // These must be numeric, ordered.
RoundStepType enumerates the state of the consensus state machine
func (RoundStepType) IsValid ¶
func (rs RoundStepType) IsValid() bool
IsValid returns true if the step is valid, false if unknown/undefined.