View Source
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
	RoundStepCommit        = RoundStepType(0x08) // Entered commit state machine




    View Source
    var (
    	ErrGotVoteFromUnwantedRound = errors.New(
    		"peer has sent a vote that does not match our round for more than one round",


    This section is empty.


    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 LastCommit round, and another for the official commit round.

      func NewHeightVoteSet

      func NewHeightVoteSet(chainID string, height int64, valSet *types.ValidatorSet) *HeightVoteSet

      func (*HeightVoteSet) AddVote

      func (hvs *HeightVoteSet) AddVote(vote *types.Vote, peerID p2p.ID) (added bool, err error)

        Duplicate votes return added=false, err=nil. By convention, peerID is "" if origin is self.

        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) Prevotes

          func (hvs *HeightVoteSet) Prevotes(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(
          	round int32,
          	voteType tmproto.SignedMsgType,
          	peerID p2p.ID,
          	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 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.
              	LastCommit      *bits.BitArray `json:"last_commit"`       // All commit precommits of commit for last height.
              	// 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) 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 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"`
                    	Proposal           *types.Proposal     `json:"proposal"`
                    	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"`
                    	// 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.
                    	// 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.VoteSet      `json:"last_commit"`  // Last precommits at Height-1
                    	LastValidators            *types.ValidatorSet `json:"last_validators"`
                    	TriggeredTimeoutPrecommit bool                `json:"triggered_timeout_precommit"`

                      RoundState defines the internal consensus state. NOTE: Not thread safe. Should only be manipulated by functions downstream of the cs.receiveRoutine

                      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) 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

                              Compress the RoundState to RoundStateSimple

                              func (*RoundState) String

                              func (rs *RoundState) String() string

                                String returns a string

                                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"`

                                      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.

                                          func (RoundStepType) String

                                          func (rs RoundStepType) String() string

                                            String returns a string

                                            type RoundVoteSet

                                            type RoundVoteSet struct {
                                            	Prevotes   *types.VoteSet
                                            	Precommits *types.VoteSet