consensus

package
v0.0.0 Latest Latest
Warning

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

Go to latest
Published: Dec 3, 2024 License: Apache-2.0, UNKNOWN not legal advice Imports: 0 Imported by: 0

README

See the consensus spec and the reactor consensus spec for more information.

Documentation

Index

Constants

View Source
const (
	StateChannel       = byte(0x20)
	DataChannel        = byte(0x21)
	VoteChannel        = byte(0x22)
	VoteSetBitsChannel = byte(0x23)
)

Variables

View Source
var (
	ErrPeerStateHeightRegression = errors.New("Error peer state height regression")
	ErrPeerStateInvalidStartTime = errors.New("Error peer state invalid startTime")
)
View Source
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")
)
View Source
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

type BlockPartMessage struct {
	Height int64
	Round  int
	Part   *types.Part
}

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

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

AddVote inputs a vote.

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

func (cs *ConsensusState) SetProposal(proposal *types.Proposal, peerID p2p.ID) error

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

func (cs *ConsensusState) String() string

String returns a string.

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

func NewPeerState(peer p2p.Peer) *PeerState

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

func (ps *PeerState) BlockPartsSent() int

BlockPartsSent returns the number of useful block parts the peer has sent us.

func (*PeerState) EnsureVoteBitArrays

func (ps *PeerState) EnsureVoteBitArrays(height int64, numValidators int)

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

func (ps *PeerState) GetHeight() int64

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

func (ps *PeerState) PickVoteToSend(votes types.VoteSetReader) (vote *types.Vote, ok bool)

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

func (ps *PeerState) RecordBlockPart() int

RecordBlockPart increments internal block part related statistics for this peer. It returns the total number of added block parts.

func (*PeerState) RecordVote

func (ps *PeerState) RecordVote() int

RecordVote increments internal votes related statistics for this peer. It returns the total number of added votes.

func (*PeerState) SetHasProposal

func (ps *PeerState) SetHasProposal(proposal *types.Proposal)

SetHasProposal sets the given proposal as known for the peer.

func (*PeerState) SetHasProposalBlockPart

func (ps *PeerState) SetHasProposalBlockPart(height int64, round int, index int)

SetHasProposalBlockPart sets the given block part index as known for the peer.

func (*PeerState) SetHasVote

func (ps *PeerState) SetHasVote(vote *types.Vote)

SetHasVote sets the given vote as known by the peer

func (*PeerState) SetLogger

func (ps *PeerState) SetLogger(logger *slog.Logger) *PeerState

SetLogger allows to set a logger on the peer state. Returns the peer state itself.

func (*PeerState) String

func (ps *PeerState) String() string

String returns a string representation of the PeerState

func (*PeerState) StringIndented

func (ps *PeerState) StringIndented(indent string) string

StringIndented returns a string representation of the PeerState

func (*PeerState) VotesSent

func (ps *PeerState) VotesSent() int

VotesSent returns the number of blocks for which peer has been sending us votes.

type ProposalMessage

type ProposalMessage struct {
	Proposal *types.Proposal
}

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

type ProposalPOLMessage struct {
	Height           int64
	ProposalPOLRound int
	ProposalPOL      *bitarray.BitArray
}

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

type VoteMessage struct {
	Vote *types.Vote
}

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.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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