types

package
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 15, 2024 License: Apache-2.0 Imports: 16 Imported by: 0

Documentation

Index

Constants

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

)

RoundStepType

Variables

View Source
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) *HeightVoteSet

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) 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) 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(
	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 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(proposal *types.Proposal, receivedAt time.Time, rs *RoundState) error
}

ProposalSetter updates a proposal for the round if all conditions are met

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

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.

func (RoundStepType) String

func (rs RoundStepType) String() string

String returns a string

type RoundVoteSet

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

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL