Documentation ¶
Index ¶
- func ReportDecided(pk string, msg *proto.SignedMessage)
- type IBFT
- type Instance
- func (i *Instance) BumpRound()
- func (i *Instance) CommittedAggregatedMsg() (*proto.SignedMessage, error)
- func (i *Instance) ForceDecide(msg *proto.SignedMessage)
- func (i *Instance) GetLastChangeRoundMsg() *proto.SignedMessage
- func (i *Instance) GetStageChan() chan proto.RoundState
- func (i *Instance) Init()
- func (i *Instance) IsLeader() bool
- func (i *Instance) JustifyPrePrepare(round uint64) error
- func (i *Instance) JustifyRoundChange(round uint64) (bool, error)
- func (i *Instance) PreparedAggregatedMsg() (*proto.SignedMessage, error)
- func (i *Instance) ProcessChangeRoundPartialQuorum() (found bool, err error)
- func (i *Instance) ProcessMessage() (processedMsg bool, err error)
- func (i *Instance) ProcessStageChange(stage proto.RoundState)
- func (i *Instance) RoundLeader(round uint64) uint64
- func (i *Instance) SignAndBroadcast(msg *proto.Message) error
- func (i *Instance) Start(inputValue []byte) error
- func (i *Instance) StartMainEventLoop()
- func (i *Instance) StartMessagePipeline()
- func (i *Instance) StartPartialChangeRoundPipeline()
- func (i *Instance) Stop()
- func (i *Instance) Stopped() bool
- func (i *Instance) ThisRoundLeader() uint64
- func (i *Instance) UponPrePrepareMsg() pipeline.Pipeline
- type InstanceOptions
- type InstanceResult
- type StartOptions
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
type Instance ¶
type Instance struct { 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) JustifyPrePrepare ¶
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 ¶
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
ProcessChangeRoundPartialQuorum will look for f+1 change round msgs to bump to a higher round if this instance is behind.
func (*Instance) ProcessMessage ¶
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 ¶
RoundLeader checks the round leader
func (*Instance) SignAndBroadcast ¶
SignAndBroadcast checks and adds the signed message to the appropriate round state type
func (*Instance) Start ¶
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) ThisRoundLeader ¶
ThisRoundLeader returns the round leader
func (*Instance) UponPrePrepareMsg ¶
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 //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 // 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