ibft

package
v0.0.20 Latest Latest
Warning

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

Go to latest
Published: Sep 24, 2021 License: GPL-3.0 Imports: 38 Imported by: 0

README

SSV - IBFT



Blox IBFT implementation
Codebase Structure
How to start SSV environment locally?

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ReportDecided added in v0.0.20

func ReportDecided(pk string, msg *proto.SignedMessage)

ReportDecided reports on a decided message

Types

type IBFT

type IBFT interface {
	// Init should be called after creating an IBFT instance to init the instance, sync it, etc.
	Init()

	// StartInstance starts a new instance by the given options
	StartInstance(opts StartOptions) (*InstanceResult, error)

	// NextSeqNumber returns the previous decided instance seq number + 1
	// In case it's the first instance it returns 0
	NextSeqNumber() (uint64, error)

	// GetIBFTCommittee returns a map of the iBFT committee where the key is the member's id.
	GetIBFTCommittee() map[uint64]*proto.Node

	// GetIdentifier returns ibft identifier made of public key and role (type)
	GetIdentifier() []byte
}

IBFT represents behavior of the IBFT

func New

func New(role beacon.RoleType, identifier []byte, logger *zap.Logger, storage collections.Iibft, network network.Network, queue *msgqueue.MessageQueue, instanceConfig *proto.InstanceConfig, ValidatorShare *storage.Share) IBFT

New is the constructor of IBFT

type Instance

type Instance struct {
	ValidatorShare *storage.Share
	State          *proto.State

	ValueCheck     valcheck.ValueCheck
	LeaderSelector leader.Selector
	Config         *proto.InstanceConfig

	Logger *zap.Logger

	// messages
	MsgQueue            *msgqueue.MessageQueue
	PrePrepareMessages  msgcont.MessageContainer
	PrepareMessages     msgcont.MessageContainer
	CommitMessages      msgcont.MessageContainer
	ChangeRoundMessages msgcont.MessageContainer
	// contains filtered or unexported fields
}

Instance defines the instance attributes

func NewInstance

func NewInstance(opts *InstanceOptions) *Instance

NewInstance is the constructor of Instance

func (*Instance) BumpRound

func (i *Instance) BumpRound()

BumpRound is used to set bump round by 1

func (*Instance) CommittedAggregatedMsg

func (i *Instance) CommittedAggregatedMsg() (*proto.SignedMessage, error)

CommittedAggregatedMsg returns a signed message for the state's committed value with the max known signatures

func (*Instance) ForceDecide added in v0.0.6

func (i *Instance) ForceDecide(msg *proto.SignedMessage)

ForceDecide will attempt to decide the instance with provided decided signed msg.

func (*Instance) GetLastChangeRoundMsg added in v0.0.14

func (i *Instance) GetLastChangeRoundMsg() *proto.SignedMessage

GetLastChangeRoundMsg returns the latest broadcasted msg from the instance

func (*Instance) GetStageChan

func (i *Instance) GetStageChan() chan proto.RoundState

GetStageChan returns a RoundState channel added to the stateChangesChans array

func (*Instance) Init added in v0.0.5

func (i *Instance) Init()

Init must be called before start can be

func (*Instance) IsLeader

func (i *Instance) IsLeader() bool

IsLeader checks and return true for round leader, false otherwise

func (*Instance) JustifyPrePrepare

func (i *Instance) JustifyPrePrepare(round uint64) error

JustifyPrePrepare implements: predicate JustifyPrePrepare(hPRE-PREPARE, λi, round, valuei)

return
	round = 1
	∨ received a quorum Qrc of valid <ROUND-CHANGE, λi, round, prj , pvj> messages such that:
		∀ <ROUND-CHANGE, λi, round, prj , pvj> ∈ Qrc : prj = ⊥ ∧ prj = ⊥
		∨ received a quorum of valid <PREPARE, λi, pr, value> messages such that:
			(pr, value) = HighestPrepared(Qrc)

func (*Instance) JustifyRoundChange

func (i *Instance) JustifyRoundChange(round uint64) (bool, error)

JustifyRoundChange see below

func (*Instance) PreparedAggregatedMsg

func (i *Instance) PreparedAggregatedMsg() (*proto.SignedMessage, error)

PreparedAggregatedMsg returns a signed message for the state's prepared value with the max known signatures

func (*Instance) ProcessChangeRoundPartialQuorum added in v0.0.6

func (i *Instance) ProcessChangeRoundPartialQuorum() (found bool, err error)

ProcessChangeRoundPartialQuorum will look for f+1 change round msgs to bump to a higher round if this instance is behind.

func (*Instance) ProcessMessage

func (i *Instance) ProcessMessage() (processedMsg bool, err error)

ProcessMessage pulls messages from the queue to be processed sequentially

func (*Instance) ProcessStageChange added in v0.0.14

func (i *Instance) ProcessStageChange(stage proto.RoundState)

ProcessStageChange set the State's round State and pushed the new State into the State channel

func (*Instance) RoundLeader

func (i *Instance) RoundLeader(round uint64) uint64

RoundLeader checks the round leader

func (*Instance) SignAndBroadcast

func (i *Instance) SignAndBroadcast(msg *proto.Message) error

SignAndBroadcast checks and adds the signed message to the appropriate round state type

func (*Instance) Start

func (i *Instance) Start(inputValue []byte) error

Start implements the Algorithm 1 IBFT pseudocode for process pi: constants, State variables, and ancillary procedures procedure Start(λ, value)

λi ← λ
ri ← 1
pri ← ⊥
pvi ← ⊥
inputV aluei ← value
if leader(hi, ri) = pi then
	broadcast ⟨PRE-PREPARE, λi, ri, inputV aluei⟩ message
	set timer to running and expire after t(ri)

func (*Instance) StartMainEventLoop added in v0.0.5

func (i *Instance) StartMainEventLoop()

StartMainEventLoop start the main event loop queue for the iBFT instance which iterates events in the queue, if non found it will wait before trying again.

func (*Instance) StartMessagePipeline

func (i *Instance) StartMessagePipeline()

StartMessagePipeline - the iBFT instance is message driven with an 'upon' logic. each message type has it's own pipeline of checks and actions, called by the networker implementation. Internal chan monitor if the instance reached decision or if a round change is required.

func (*Instance) StartPartialChangeRoundPipeline added in v0.0.6

func (i *Instance) StartPartialChangeRoundPipeline()

StartPartialChangeRoundPipeline continuously tries to find partial change round quorum

func (*Instance) Stop

func (i *Instance) Stop()

Stop will trigger a stopped for the entire instance

func (*Instance) Stopped added in v0.0.5

func (i *Instance) Stopped() bool

Stopped is stopping queue work

func (*Instance) ThisRoundLeader

func (i *Instance) ThisRoundLeader() uint64

ThisRoundLeader returns the round leader

func (*Instance) UponPrePrepareMsg

func (i *Instance) UponPrePrepareMsg() pipeline.Pipeline

UponPrePrepareMsg Algorithm 2 IBFT pseudocode for process pi: normal case operation upon receiving a valid ⟨PRE-PREPARE, λi, ri, value⟩ message m from leader(λi, round) such that:

JustifyPrePrepare(m) do
	set timer i to running and expire after t(ri)
	broadcast ⟨PREPARE, λi, ri, value⟩

type InstanceOptions

type InstanceOptions struct {
	Logger         *zap.Logger
	ValidatorShare *storage.Share
	//Me             *proto.Node
	Network        network.Network
	Queue          *msgqueue.MessageQueue
	ValueCheck     valcheck.ValueCheck
	LeaderSelector leader.Selector
	Config         *proto.InstanceConfig
	Lambda         []byte
	SeqNumber      uint64
	// RequireMinPeers flag to require minimum peers before starting an instance
	// useful for tests where we want (sometimes) to avoid networking
	RequireMinPeers bool
}

InstanceOptions defines option attributes for the Instance

type InstanceResult added in v0.0.5

type InstanceResult struct {
	Decided bool
	Msg     *proto.SignedMessage
}

InstanceResult is a struct holding the result of a single iBFT instance

type StartOptions

type StartOptions struct {
	Logger         *zap.Logger
	ValueCheck     valcheck.ValueCheck
	SeqNumber      uint64
	Value          []byte
	ValidatorShare *storage.Share
	// RequireMinPeers flag to require minimum peers before starting an instance
	// useful for tests where we want (sometimes) to avoid networking
	RequireMinPeers bool
}

StartOptions defines type for IBFT instance options

Jump to

Keyboard shortcuts

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