core

package
v0.1.1 Latest Latest
Warning

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

Go to latest
Published: Jan 30, 2024 License: Apache-2.0 Imports: 10 Imported by: 0

Documentation

Overview

Package core implements METABFT consensus backend.go defines interfaces of backend, that performs detailed procedure rather than consensus

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func SetMeasurementTime

func SetMeasurementTime(prefix string, startTime time.Time)

SetMeasurementTime function set duration to gauge

Types

type Backend

type Backend interface {
	MessageConstructor
	Verifier
	ValidatorBackend

	// BuildProposal builds a new proposal for the given view (height and round)
	BuildProposal(view *proto.View) []byte

	// InsertProposal inserts a proposal with the specified committed seals
	// the reason why we are including round here is because a single committedSeal
	// has signed the tuple of (rawProposal, round)
	InsertProposal(proposal *proto.Proposal, committedSeals []*messages.CommittedSeal)

	// ID returns the validator's ID
	ID() []byte
}

Backend defines an interface all backend implementations need to implement

type Logger

type Logger interface {
	Info(msg string, args ...any)
	Debug(msg string, args ...any)
	Error(msg string, args ...any)
}

Logger represents the logger behaviour

type METABFT

type METABFT struct {
	// contains filtered or unexported fields
}

METABFT represents a single instance of the METABFT state machine

func NewMETABFT

func NewMETABFT(
	log Logger,
	backend Backend,
	transport Transport,
) *METABFT

NewMETABFT creates a new instance of the METABFT consensus protocol

func (*METABFT) AddMessage

func (i *METABFT) AddMessage(message *proto.Message)

AddMessage adds a new message to the METABFT message system

func (*METABFT) ExtendRoundTimeout

func (i *METABFT) ExtendRoundTimeout(amount time.Duration)

ExtendRoundTimeout extends each round's timer by the specified amount.

func (*METABFT) RunSequence

func (i *METABFT) RunSequence(ctx context.Context, h uint64)

RunSequence runs the METABFT sequence for the specified height

type MessageConstructor

type MessageConstructor interface {
	// BuildPrePrepareMessage builds a PREPREPARE message based on the passed in view and proposal
	BuildPrePrepareMessage(
		rawProposal []byte,
		certificate *proto.RoundChangeCertificate,
		view *proto.View,
	) *proto.Message

	// BuildPrepareMessage builds a PREPARE message based on the passed in view and proposal hash
	BuildPrepareMessage(proposalHash []byte, view *proto.View) *proto.Message

	// BuildCommitMessage builds a COMMIT message based on the passed in view and proposal hash
	// Must create a committed seal for proposal hash and include it into the message
	BuildCommitMessage(proposalHash []byte, view *proto.View) *proto.Message

	// BuildRoundChangeMessage builds a ROUND_CHANGE message based on the passed in view,
	// latest prepared proposal, and latest prepared certificate
	BuildRoundChangeMessage(
		proposal *proto.Proposal,
		certificate *proto.PreparedCertificate,
		view *proto.View,
	) *proto.Message
}

MessageConstructor defines a message constructor interface All constructed messages must be signed by a validator for the whole message

type Messages

type Messages interface {
	// Messages modifiers //
	AddMessage(message *proto.Message)
	PruneByHeight(height uint64)

	SignalEvent(messageType proto.MessageType, view *proto.View)

	// Messages fetchers //
	GetValidMessages(
		view *proto.View,
		messageType proto.MessageType,
		isValid func(*proto.Message) bool,
	) []*proto.Message
	GetExtendedRCC(
		height uint64,
		isValidMessage func(message *proto.Message) bool,
		isValidRCC func(round uint64, msgs []*proto.Message) bool,
	) []*proto.Message
	GetMostRoundChangeMessages(minRound, height uint64) []*proto.Message

	// Messages subscription handlers //
	Subscribe(details messages.SubscriptionDetails) *messages.Subscription
	Unsubscribe(id messages.SubscriptionID)
}

Messages represents the message managing behaviour

type Transport

type Transport interface {
	// Multicast multicasts the message to other peers
	Multicast(message *proto.Message)
}

Transport defines an interface the node uses to communicate with other peers

type ValidatorBackend

type ValidatorBackend interface {
	// GetVotingPowers returns map of validators addresses and their voting powers for the specified height.
	GetVotingPowers(height uint64) (map[string]*big.Int, error)
}

ValidatorBackend defines interface that has GetVotingPower

type ValidatorManager

type ValidatorManager struct {
	// contains filtered or unexported fields
}

ValidatorManager keeps voting power and other information about validators

func NewValidatorManager

func NewValidatorManager(backend ValidatorBackend, log Logger) *ValidatorManager

NewValidatorManager creates new ValidatorManager

func (*ValidatorManager) HasPrepareQuorum

func (vm *ValidatorManager) HasPrepareQuorum(stateName stateType, proposalMessage *proto.Message,
	msgs []*proto.Message) bool

HasPrepareQuorum provides information on whether prepared messages have reached the quorum

func (*ValidatorManager) HasQuorum

func (vm *ValidatorManager) HasQuorum(sendersAddrs map[string]struct{}) bool

HasQuorum provides information on whether messages have reached the quorum

func (*ValidatorManager) Init

func (vm *ValidatorManager) Init(height uint64) error

Init sets voting power and quorum size

type Verifier

type Verifier interface {
	// IsValidProposal checks if the proposal is valid
	IsValidProposal(rawProposal []byte) bool

	// IsValidValidator checks if a signature in message is signed by sender
	// Must check the following things:
	// (1) recover the signature and the signer matches from address in message
	// (2) the signer address is one of the validators at the height in message
	IsValidValidator(msg *proto.Message) bool

	// IsProposer checks if the passed in ID is the Proposer for current view (sequence, round)
	IsProposer(id []byte, height, round uint64) bool

	// IsValidProposalHash checks if the hash matches the proposal
	IsValidProposalHash(proposal *proto.Proposal, hash []byte) bool

	// IsValidCommittedSeal checks
	// if signature for proposal hash in committed seal is signed by a validator
	IsValidCommittedSeal(proposalHash []byte, committedSeal *messages.CommittedSeal) bool
}

Verifier defines the verifier interface

Jump to

Keyboard shortcuts

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