alea

package
v0.3.9 Latest Latest
Warning

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

Go to latest
Published: Apr 11, 2023 License: GPL-3.0 Imports: 10 Imported by: 0

README

Alea-BFT

Introduction

This is a spec implementation for the Alea-BFT protocol, following the paper specification.

Important note on message processing

The spec only deals with message process logic but it's also very important the way controller.ProcessMsg is called. Message queueing and retry are important as there is no guarantee as to when a message is delivered.

TODO

  • Implement new Alea-BFT messages
  • Adjust controller.go and instance.go
  • Implement the Alea-BFT protocol abstracting ABA and VCBC primitives
  • Implement ABA
  • Implement VCBC
  • Proposal, VCBC, Fill validation
  • ABA validation
  • Message tests
  • Happy Flow tests
  • Proposal tests
  • VCBC tests
  • ABA tests
  • FillGap and Filler tests
  • Instance tests
  • Controller tests

Documentation

Index

Constants

View Source
const (
	NoRound      Round   = 0 // NoRound represents a nil/ zero round
	FirstRound   Round   = 1 // FirstRound value is the first round in any QBFT instance start
	FirstHeight  Height  = 0
	FirstACRound ACRound = 1
)

Variables

This section is empty.

Functions

func ControllerIdToMessageID

func ControllerIdToMessageID(identifier []byte) types.MessageID

func EncodeProposals

func EncodeProposals(proposals []*ProposalData) ([]byte, error)

Encode returns the list encoded bytes or error

func GetProposalsHash

func GetProposalsHash(proposals []*ProposalData) ([]byte, error)

GetHash returns the SHA-256 hash

func HasPartialQuorum

func HasPartialQuorum(share *types.Share, msgs []*SignedMessage) bool

HasPartialQuorum returns true if a unique set of signers has partial quorum

func HasQuorum

func HasQuorum(share *types.Share, msgs []*SignedMessage) bool

HasQuorum returns true if a unique set of signers has quorum

func IsDecidedMsg

func IsDecidedMsg(share *types.Share, signedDecided *SignedMessage) bool

IsDecidedMsg returns true if signed commit has all quorum sigs

func RoundRobinProposer

func RoundRobinProposer(state *State, round Round) types.OperatorID

RoundRobinProposer returns the proposer for the round. Each new height starts with the first proposer and increments by 1 with each following round. Each new height has a different first round proposer which is +1 from the previous height. First height starts with index 0

func SharedCoinF

func SharedCoinF(round Round) byte

func ValidateDecided

func ValidateDecided(
	config IConfig,
	signedDecided *SignedMessage,
	share *types.Share,
) error

func ValidateFutureMsg

func ValidateFutureMsg(
	config IConfig,
	msg *SignedMessage,
	operators []*types.Operator,
) error

Types

type ABAAuxData

type ABAAuxData struct {
	Vote    byte
	Round   Round
	ACRound ACRound
}

func (*ABAAuxData) Decode

func (d *ABAAuxData) Decode(data []byte) error

Decode returns error if decoding failed

func (*ABAAuxData) Encode

func (d *ABAAuxData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*ABAAuxData) Validate

func (d *ABAAuxData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type ABAConfData

type ABAConfData struct {
	Votes   []byte
	Round   Round
	ACRound ACRound
}

func (*ABAConfData) Decode

func (d *ABAConfData) Decode(data []byte) error

Decode returns error if decoding failed

func (*ABAConfData) Encode

func (d *ABAConfData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*ABAConfData) Validate

func (d *ABAConfData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type ABAFinishData

type ABAFinishData struct {
	Vote    byte
	ACRound ACRound
}

func (*ABAFinishData) Decode

func (d *ABAFinishData) Decode(data []byte) error

Decode returns error if decoding failed

func (*ABAFinishData) Encode

func (d *ABAFinishData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*ABAFinishData) Validate

func (d *ABAFinishData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type ABAInitData

type ABAInitData struct {
	Vote    byte
	Round   Round
	ACRound ACRound
}

func (*ABAInitData) Decode

func (d *ABAInitData) Decode(data []byte) error

Decode returns error if decoding failed

func (*ABAInitData) Encode

func (d *ABAInitData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*ABAInitData) Validate

func (d *ABAInitData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type ABAState

type ABAState struct {
	// message containers
	ABAInitContainer   *MsgContainer
	ABAAuxContainer    *MsgContainer
	ABAConfContainer   *MsgContainer
	ABAFinishContainer *MsgContainer
	// message counters
	InitCounter   map[Round]map[byte][]types.OperatorID
	AuxCounter    map[Round]map[byte][]types.OperatorID
	ConfCounter   map[Round][]types.OperatorID
	ConfValues    map[Round]map[types.OperatorID][]byte
	FinishCounter map[byte][]types.OperatorID

	// current ABA round
	ACRound ACRound
	// value inputed to ABA
	Vin map[Round]byte
	// value decided by ABA
	Vdecided byte
	// current ABA round
	Round Round
	// values that completed strong support of INIT messages
	Values map[Round][]byte
	// terminate channel to announce to ABA caller
	Terminate bool
	// contains filtered or unexported fields
}

func NewABAState

func NewABAState(acRound ACRound) *ABAState

func (*ABAState) AddToValues

func (s *ABAState) AddToValues(round Round, vote byte)

func (*ABAState) CountAux added in v0.3.1

func (s *ABAState) CountAux(round Round, vote byte) uint64

func (*ABAState) CountAuxInValues

func (s *ABAState) CountAuxInValues(round Round) uint64

func (*ABAState) CountConf added in v0.3.1

func (s *ABAState) CountConf(round Round) uint64

func (*ABAState) CountConfContainedInValues

func (s *ABAState) CountConfContainedInValues(round Round) uint64

func (*ABAState) CountFinish added in v0.3.1

func (s *ABAState) CountFinish(vote byte) uint64

func (*ABAState) CountInit added in v0.3.1

func (s *ABAState) CountInit(round Round, vote byte) uint64

func (*ABAState) GetVInput added in v0.3.1

func (s *ABAState) GetVInput(round Round) byte

func (*ABAState) GetValues

func (s *ABAState) GetValues(round Round) []byte

func (*ABAState) HasAux added in v0.3.1

func (s *ABAState) HasAux(round Round, operatorID types.OperatorID, vote byte) bool

func (*ABAState) HasConf added in v0.3.1

func (s *ABAState) HasConf(round Round, operatorID types.OperatorID) bool

func (*ABAState) HasFinish added in v0.3.1

func (s *ABAState) HasFinish(operatorID types.OperatorID) bool

func (*ABAState) HasInit added in v0.3.1

func (s *ABAState) HasInit(round Round, operatorID types.OperatorID, vote byte) bool

func (*ABAState) IncrementRound

func (s *ABAState) IncrementRound()

func (*ABAState) InitializeRound

func (s *ABAState) InitializeRound(round Round)

func (*ABAState) SentAux

func (s *ABAState) SentAux(round Round, vote byte) bool

func (*ABAState) SentConf

func (s *ABAState) SentConf(round Round) bool

func (*ABAState) SentFinish

func (s *ABAState) SentFinish(vote byte) bool

func (*ABAState) SentInit

func (s *ABAState) SentInit(round Round, vote byte) bool

func (*ABAState) SetAux added in v0.3.1

func (s *ABAState) SetAux(round Round, operatorID types.OperatorID, vote byte)

func (*ABAState) SetConf added in v0.3.1

func (s *ABAState) SetConf(round Round, operatorID types.OperatorID, votes []byte)

func (*ABAState) SetDecided added in v0.3.1

func (s *ABAState) SetDecided(vote byte)

func (*ABAState) SetFinish added in v0.3.1

func (s *ABAState) SetFinish(operatorID types.OperatorID, vote byte)

func (*ABAState) SetInit added in v0.3.1

func (s *ABAState) SetInit(round Round, operatorID types.OperatorID, vote byte)

func (*ABAState) SetSentAux added in v0.3.1

func (s *ABAState) SetSentAux(round Round, vote byte, value bool)

func (*ABAState) SetSentConf added in v0.3.1

func (s *ABAState) SetSentConf(round Round, value bool)

func (*ABAState) SetSentFinish added in v0.3.1

func (s *ABAState) SetSentFinish(vote byte, value bool)

func (*ABAState) SetSentInit added in v0.3.1

func (s *ABAState) SetSentInit(round Round, vote byte, value bool)

func (*ABAState) SetTerminate added in v0.3.1

func (s *ABAState) SetTerminate(value bool)

func (*ABAState) SetVInput added in v0.3.1

func (s *ABAState) SetVInput(round Round, vote byte)

type ACRound

type ACRound uint64

type ACState

type ACState struct {
	ACRound  ACRound
	ABAState map[ACRound]*ABAState
}

func NewACState

func NewACState() *ACState

func (*ACState) GetABAState

func (s *ACState) GetABAState(acRound ACRound) *ABAState

func (*ACState) GetCurrentABAState

func (s *ACState) GetCurrentABAState() *ABAState

func (*ACState) IncrementRound

func (s *ACState) IncrementRound()

func (*ACState) InitializeRound

func (s *ACState) InitializeRound(acRound ACRound)

type CoinF

type CoinF func(round Round) byte

type Config

type Config struct {
	Signer      types.SSVSigner
	SigningPK   []byte
	Domain      types.DomainType
	ValueCheckF ProposedValueCheckF
	ProposerF   ProposerF
	Network     Network
	Timer       Timer
	CoinF       CoinF
}

func (*Config) GetCoinF

func (c *Config) GetCoinF() CoinF

GetCoinF returns random coin

func (*Config) GetNetwork

func (c *Config) GetNetwork() Network

GetNetwork returns a p2p Network instance

func (*Config) GetProposerF

func (c *Config) GetProposerF() ProposerF

GetProposerF returns func used to calculate proposer

func (*Config) GetSignatureDomainType

func (c *Config) GetSignatureDomainType() types.DomainType

GetSignatureDomainType returns the Domain type used for signatures

func (*Config) GetSigner

func (c *Config) GetSigner() types.SSVSigner

GetSigner returns a Signer instance

func (*Config) GetSigningPubKey

func (c *Config) GetSigningPubKey() []byte

GetSigningPubKey returns the public key used to sign all QBFT messages

func (*Config) GetTimer

func (c *Config) GetTimer() Timer

GetTimer returns round timer

func (*Config) GetValueCheckF

func (c *Config) GetValueCheckF() ProposedValueCheckF

GetValueCheckF returns value check instance

type Controller

type Controller struct {
	Identifier []byte
	Height     Height // incremental Height for InstanceContainer
	// StoredInstances stores the last HistoricalInstanceCapacity in an array for message processing purposes.
	StoredInstances InstanceContainer
	// FutureMsgsContainer holds all msgs from a higher height
	FutureMsgsContainer map[types.OperatorID]Height // maps msg signer to height of higher height received msgs
	Domain              types.DomainType
	Share               *types.Share
	// contains filtered or unexported fields
}

Controller is a QBFT coordinator responsible for starting and following the entire life cycle of multiple QBFT InstanceContainer

func NewController

func NewController(
	identifier []byte,
	share *types.Share,
	domain types.DomainType,
	config IConfig,
) *Controller

func (*Controller) BaseMsgValidation

func (c *Controller) BaseMsgValidation(msg *SignedMessage) error

BaseMsgValidation returns error if msg is invalid (base validation)

func (*Controller) CanStartInstance

func (c *Controller) CanStartInstance() error

CanStartInstance returns nil if controller can start a new instance

func (*Controller) Decode

func (c *Controller) Decode(data []byte) error

Decode implementation

func (*Controller) Encode

func (c *Controller) Encode() ([]byte, error)

Encode implementation

func (*Controller) GetConfig

func (c *Controller) GetConfig() IConfig

func (*Controller) GetIdentifier

func (c *Controller) GetIdentifier() []byte

GetIdentifier returns QBFT Identifier, used to identify messages

func (*Controller) GetRoot

func (c *Controller) GetRoot() ([]byte, error)

GetRoot returns the state's deterministic root

func (*Controller) InstanceForHeight

func (c *Controller) InstanceForHeight(height Height) *Instance

func (*Controller) ProcessMsg

func (c *Controller) ProcessMsg(msg *SignedMessage) (*SignedMessage, error)

ProcessMsg processes a new msg, returns decided message or error

func (*Controller) StartNewInstance

func (c *Controller) StartNewInstance(value []byte) error

StartNewInstance will start a new QBFT instance, if can't will return error

func (*Controller) UponDecided

func (c *Controller) UponDecided(msg *SignedMessage) (*SignedMessage, error)

UponDecided returns decided msg if decided, nil otherwise

func (*Controller) UponExistingInstanceMsg

func (c *Controller) UponExistingInstanceMsg(msg *SignedMessage) (*SignedMessage, error)

func (*Controller) UponFutureMsg

func (c *Controller) UponFutureMsg(msg *SignedMessage) (*SignedMessage, error)

type FillGapData

type FillGapData struct {
	OperatorID types.OperatorID
	Priority   Priority
}

func (*FillGapData) Decode

func (d *FillGapData) Decode(data []byte) error

Decode returns error if decoding failed

func (*FillGapData) Encode

func (d *FillGapData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*FillGapData) Validate

func (d *FillGapData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type FillerData

type FillerData struct {
	Entries        [][]*ProposalData
	Priorities     []Priority
	AggregatedMsgs [][]byte
	OperatorID     types.OperatorID
}

func (*FillerData) Decode

func (d *FillerData) Decode(data []byte) error

Decode returns error if decoding failed

func (*FillerData) Encode

func (d *FillerData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*FillerData) Validate

func (d *FillerData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type Height

type Height uint64

type IConfig

type IConfig interface {

	// GetValueCheckF returns value check function
	GetValueCheckF() ProposedValueCheckF
	// GetProposerF returns func used to calculate proposer
	GetProposerF() ProposerF
	// GetNetwork returns a p2p Network instance
	GetNetwork() Network
	// GetTimer returns round timer
	GetTimer() Timer
	// GetCoinF returns a shared coin
	GetCoinF() CoinF
	// contains filtered or unexported methods
}

type Instance

type Instance struct {
	State *State

	StartValue []byte
	// contains filtered or unexported fields
}

Instance is a single QBFT instance that starts with a Start call (including a value). Every new msg the ProcessMsg function needs to be called

func NewInstance

func NewInstance(
	config IConfig,
	share *types.Share,
	identifier []byte,
	height Height,
) *Instance

func (*Instance) AddOwnVCBCReady

func (i *Instance) AddOwnVCBCReady(proposals []*ProposalData, priorioty Priority) error

func (*Instance) AddVCBCOutput

func (i *Instance) AddVCBCOutput(proposals []*ProposalData, priority Priority, author types.OperatorID)

func (*Instance) BaseMsgValidation

func (i *Instance) BaseMsgValidation(msg *SignedMessage) error

func (*Instance) Broadcast

func (i *Instance) Broadcast(msg *SignedMessage) error

func (*Instance) Decode

func (i *Instance) Decode(data []byte) error

Decode implementation

func (*Instance) Deliver

func (i *Instance) Deliver(proposals []*ProposalData) int

func (*Instance) Encode

func (i *Instance) Encode() ([]byte, error)

Encode implementation

func (*Instance) GetConfig

func (i *Instance) GetConfig() IConfig

GetConfig returns the instance config

func (*Instance) GetHeight

func (i *Instance) GetHeight() Height

GetHeight interface implementation

func (*Instance) GetRoot

func (i *Instance) GetRoot() ([]byte, error)

GetRoot returns the state's deterministic root

func (*Instance) IsDecided

func (i *Instance) IsDecided() (bool, []byte)

IsDecided interface implementation

func (*Instance) ProcessMsg

func (i *Instance) ProcessMsg(msg *SignedMessage) (decided bool, decidedValue []byte, aggregatedCommit *SignedMessage, err error)

ProcessMsg processes a new QBFT msg, returns non nil error on msg processing error

func (*Instance) Start

func (i *Instance) Start(value []byte, height Height)

Start is an interface implementation

func (*Instance) StartABA

func (i *Instance) StartABA(vote byte) (byte, error)

func (*Instance) StartAgreementComponent

func (i *Instance) StartAgreementComponent() error

func (*Instance) StartVCBC

func (i *Instance) StartVCBC(priority Priority) error

func (*Instance) WaitFillGapResponse

func (i *Instance) WaitFillGapResponse(leader types.OperatorID, priority Priority, fillerContLen int)

type InstanceContainer

type InstanceContainer []*Instance

func (InstanceContainer) FindInstance

func (i InstanceContainer) FindInstance(height Height) *Instance

type Message

type Message struct {
	MsgType    MessageType
	Height     Height // QBFT instance Height (Though not used for AleaBFT, leave field)
	Round      Round  // QBFT round for which the msg is for (Though not used for AleaBFT, leave field)
	Identifier []byte // instance Identifier this msg belongs to
	Data       []byte
}

func (*Message) Decode

func (msg *Message) Decode(data []byte) error

Decode returns error if decoding failed

func (*Message) Encode

func (msg *Message) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*Message) GetABAAuxData

func (msg *Message) GetABAAuxData() (*ABAAuxData, error)

GetABAAuxData returns abainit specific data

func (*Message) GetABAConfData

func (msg *Message) GetABAConfData() (*ABAConfData, error)

GetABAConfData returns abainit specific data

func (*Message) GetABAFinishData

func (msg *Message) GetABAFinishData() (*ABAFinishData, error)

GetABAFinishData returns abainit specific data

func (*Message) GetABAInitData

func (msg *Message) GetABAInitData() (*ABAInitData, error)

GetABAInitData returns abainit specific data

func (*Message) GetFillGapData

func (msg *Message) GetFillGapData() (*FillGapData, error)

GetFillGapData returns fillgap specific data

func (*Message) GetFillerData

func (msg *Message) GetFillerData() (*FillerData, error)

GetFillerData returns filler specific data

func (*Message) GetProposalData

func (msg *Message) GetProposalData() (*ProposalData, error)

GetProposalData returns proposal specific data

func (*Message) GetRoot

func (msg *Message) GetRoot() ([]byte, error)

GetRoot returns the root used for signing and verification

func (*Message) GetVCBCAnswerData

func (msg *Message) GetVCBCAnswerData() (*VCBCAnswerData, error)

VCBCAnswerData returns abainit specific data

func (*Message) GetVCBCFinalData

func (msg *Message) GetVCBCFinalData() (*VCBCFinalData, error)

VCBCFinalData returns abainit specific data

func (*Message) GetVCBCReadyData

func (msg *Message) GetVCBCReadyData() (*VCBCReadyData, error)

VCBCReadyData returns abainit specific data

func (*Message) GetVCBCRequestData

func (msg *Message) GetVCBCRequestData() (*VCBCRequestData, error)

VCBCRequestData returns abainit specific data

func (*Message) GetVCBCSendData

func (msg *Message) GetVCBCSendData() (*VCBCSendData, error)

VCBCSendData returns abainit specific data

func (*Message) Validate

func (msg *Message) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type MessageType

type MessageType int
const (
	ProposalMsgType MessageType = iota
	FillGapMsgType
	FillerMsgType
	ABAInitMsgType
	ABAAuxMsgType
	ABAConfMsgType
	ABAFinishMsgType
	VCBCSendMsgType
	VCBCReadyMsgType
	VCBCFinalMsgType
	VCBCRequestMsgType
	VCBCAnswerMsgType
)

type MsgContainer

type MsgContainer struct {
	Msgs map[Round][]*SignedMessage
}

func NewMsgContainer

func NewMsgContainer() *MsgContainer

func (*MsgContainer) AddFirstMsgForSignerAndRound

func (c *MsgContainer) AddFirstMsgForSignerAndRound(msg *SignedMessage) (bool, error)

AddFirstMsgForSignerAndRound will add the first msg for each signer for a specific round, consequent msgs will not be added

func (*MsgContainer) AddMsg

func (c *MsgContainer) AddMsg(msg *SignedMessage)

AddMsg will add any message regardless of signers

func (*MsgContainer) AllMessaged

func (c *MsgContainer) AllMessaged() []*SignedMessage

AllMessaged returns all messages

func (*MsgContainer) Clear

func (c *MsgContainer) Clear()

Clear the container

func (*MsgContainer) Decode

func (c *MsgContainer) Decode(data []byte) error

Decode returns error if decoding failed

func (*MsgContainer) Encode

func (c *MsgContainer) Encode() ([]byte, error)

Encode returns the encoded struct in bytes or error

func (*MsgContainer) HasMsg

func (c *MsgContainer) HasMsg(msg *SignedMessage) (bool, error)

HasMsg returns if message exists in the container

func (*MsgContainer) Len

func (c *MsgContainer) Len(roundNumber Round) int

Len returns the number of messages stored

func (*MsgContainer) LongestUniqueSignersForRoundAndValue

func (c *MsgContainer) LongestUniqueSignersForRoundAndValue(round Round, value []byte) ([]types.OperatorID, []*SignedMessage)

LongestUniqueSignersForRoundAndValue returns the longest set of unique signers and msgs for a specific round and value

func (*MsgContainer) MessagesForRound

func (c *MsgContainer) MessagesForRound(round Round) []*SignedMessage

MessagesForRound returns all msgs for Height and round, empty slice otherwise

func (*MsgContainer) MessagesForRoundAndValue

func (c *MsgContainer) MessagesForRoundAndValue(round Round, value []byte) []*SignedMessage

MessagesForRoundAndValue returns all msgs for round and value, empty slice otherwise

type Network

type Network interface {
	Syncer
	p2p.Broadcaster
}

Network is the interface for networking across QBFT components

type Priority

type Priority uint64
const (
	FirstPriority Priority = 0
)

type ProposalData

type ProposalData struct {
	Data []byte
}

func DecodeProposals

func DecodeProposals(data []byte) ([]*ProposalData, error)

Decode returns error if decoding failed

func (*ProposalData) Decode

func (d *ProposalData) Decode(data []byte) error

Decode returns error if decoding failed

func (*ProposalData) Encode

func (d *ProposalData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*ProposalData) Equal

func (d *ProposalData) Equal(other *ProposalData) bool

func (*ProposalData) Validate

func (d *ProposalData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type ProposedValueCheckF

type ProposedValueCheckF func(data []byte) error

type ProposerF

type ProposerF func(state *State, round Round) types.OperatorID

type Round

type Round uint64

type SignedMessage

type SignedMessage struct {
	Signature types.Signature
	Signers   []types.OperatorID
	Message   *Message // message for which this signature is for
}

func AggregateMsgs

func AggregateMsgs(msgs []*SignedMessage) (*SignedMessage, error)

func CreateABAAux

func CreateABAAux(state *State, config IConfig, vote byte, round Round, acRound ACRound) (*SignedMessage, error)

func CreateABAConf

func CreateABAConf(state *State, config IConfig, votes []byte, round Round, acRound ACRound) (*SignedMessage, error)

func CreateABAFinish

func CreateABAFinish(state *State, config IConfig, vote byte, acRound ACRound) (*SignedMessage, error)

func CreateABAInit

func CreateABAInit(state *State, config IConfig, vote byte, round Round, acRound ACRound) (*SignedMessage, error)

func CreateFillGap

func CreateFillGap(state *State, config IConfig, operatorID types.OperatorID, priority Priority) (*SignedMessage, error)

func CreateFiller

func CreateFiller(state *State, config IConfig, entries [][]*ProposalData, priorities []Priority, aggregatedMsgs [][]byte, operatorID types.OperatorID) (*SignedMessage, error)

func CreateProposal

func CreateProposal(state *State, config IConfig, value []byte) (*SignedMessage, error)

CreateProposal

func CreateVCBCAnswer

func CreateVCBCAnswer(state *State, config IConfig, proposals []*ProposalData, priority Priority, aggregatedMsg []byte, author types.OperatorID) (*SignedMessage, error)

func CreateVCBCFinal

func CreateVCBCFinal(state *State, config IConfig, hash []byte, priority Priority, aggregatedMsg []byte, author types.OperatorID) (*SignedMessage, error)

func CreateVCBCReady

func CreateVCBCReady(state *State, config IConfig, hash []byte, priority Priority, author types.OperatorID) (*SignedMessage, error)

func CreateVCBCRequest

func CreateVCBCRequest(state *State, config IConfig, priority Priority, author types.OperatorID) (*SignedMessage, error)

func CreateVCBCSend

func CreateVCBCSend(state *State, config IConfig, proposals []*ProposalData, priority Priority, author types.OperatorID) (*SignedMessage, error)

func (*SignedMessage) Aggregate

func (signedMsg *SignedMessage) Aggregate(sig types.MessageSignature) error

Aggregate will aggregate the signed message if possible (unique signers, same digest, valid)

func (*SignedMessage) CommonSigners

func (signedMsg *SignedMessage) CommonSigners(ids []types.OperatorID) bool

CommonSigners returns true if there is at least 1 common signer

func (*SignedMessage) Decode

func (signedMsg *SignedMessage) Decode(data []byte) error

Decode returns error if decoding failed

func (*SignedMessage) DeepCopy

func (signedMsg *SignedMessage) DeepCopy() *SignedMessage

DeepCopy returns a new instance of SignedMessage, deep copied

func (*SignedMessage) Encode

func (signedMsg *SignedMessage) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*SignedMessage) GetRoot

func (signedMsg *SignedMessage) GetRoot() ([]byte, error)

GetRoot returns the root used for signing and verification

func (*SignedMessage) GetSignature

func (signedMsg *SignedMessage) GetSignature() types.Signature

func (*SignedMessage) GetSigners

func (signedMsg *SignedMessage) GetSigners() []types.OperatorID

func (*SignedMessage) MatchedSigners

func (signedMsg *SignedMessage) MatchedSigners(ids []types.OperatorID) bool

MatchedSigners returns true if the provided signer ids are equal to GetSignerIds() without order significance

func (*SignedMessage) Validate

func (signedMsg *SignedMessage) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type State

type State struct {
	Share                           *types.Share
	ID                              []byte // instance Identifier
	Round                           Round
	Height                          Height
	LastPreparedRound               Round
	LastPreparedValue               []byte
	ProposalAcceptedForCurrentRound *SignedMessage
	Decided                         bool
	DecidedValue                    []byte

	ProposeContainer     *MsgContainer
	PrepareContainer     *MsgContainer
	CommitContainer      *MsgContainer
	RoundChangeContainer *MsgContainer

	// alea
	AleaDefaultRound Round
	Delivered        *VCBCQueue
	BatchSize        int

	VCBCState *VCBCState

	StopAgreement bool
	ACState       *ACState

	FillerMsgReceived int
	FillGapContainer  *MsgContainer
	FillerContainer   *MsgContainer
}

func (*State) Decode

func (s *State) Decode(data []byte) error

Decode returns error if decoding failed

func (*State) Encode

func (s *State) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*State) GetRoot

func (s *State) GetRoot() ([]byte, error)

GetRoot returns the state's deterministic root

type Syncer

type Syncer interface {
	// SyncHighestDecided tries to fetch the highest decided from peers (not blocking)
	SyncHighestDecided(identifier types.MessageID) error
	// SyncDecidedByRange will trigger sync from-to heights (including)
	SyncDecidedByRange(identifier types.MessageID, to, from Height)
}

type Timer

type Timer interface {
	// TimeoutForRound will reset running timer if exists and will start a new timer for a specific round
	TimeoutForRound(round Round)
}

Timer is an interface for a round timer, calling the UponRoundTimeout when times out

type VCBCAnswerData

type VCBCAnswerData struct {
	Proposals     []*ProposalData
	Priority      Priority
	AggregatedMsg []byte
	Author        types.OperatorID
}

func (*VCBCAnswerData) Decode

func (d *VCBCAnswerData) Decode(data []byte) error

Decode returns error if decoding failed

func (*VCBCAnswerData) Encode

func (d *VCBCAnswerData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*VCBCAnswerData) Validate

func (d *VCBCAnswerData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type VCBCFinalData

type VCBCFinalData struct {
	Hash          []byte
	Priority      Priority
	AggregatedMsg []byte
	Author        types.OperatorID
}

func (*VCBCFinalData) Decode

func (d *VCBCFinalData) Decode(data []byte) error

Decode returns error if decoding failed

func (*VCBCFinalData) Encode

func (d *VCBCFinalData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*VCBCFinalData) Validate

func (d *VCBCFinalData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type VCBCQueue

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

func NewVCBCQueue

func NewVCBCQueue() *VCBCQueue

func (*VCBCQueue) Clear

func (queue *VCBCQueue) Clear()

func (*VCBCQueue) Dequeue

func (queue *VCBCQueue) Dequeue() ([]*ProposalData, Priority)

func (*VCBCQueue) Enqueue

func (queue *VCBCQueue) Enqueue(proposals []*ProposalData, priority Priority)

func (*VCBCQueue) GetPriorities

func (queue *VCBCQueue) GetPriorities() []Priority

func (*VCBCQueue) GetValues

func (queue *VCBCQueue) GetValues() [][]*ProposalData

func (*VCBCQueue) HasPriority added in v0.3.2

func (queue *VCBCQueue) HasPriority(priority Priority) bool

func (*VCBCQueue) HasProposal added in v0.3.1

func (queue *VCBCQueue) HasProposal(proposalInstance *ProposalData) bool

func (*VCBCQueue) HasProposalList added in v0.3.1

func (queue *VCBCQueue) HasProposalList(proposalList []*ProposalData) bool

func (*VCBCQueue) IsEmpty

func (queue *VCBCQueue) IsEmpty() bool

func (*VCBCQueue) Peek

func (queue *VCBCQueue) Peek() ([]*ProposalData, Priority)

func (*VCBCQueue) PeekLast

func (queue *VCBCQueue) PeekLast() ([]*ProposalData, Priority)

type VCBCReadyData

type VCBCReadyData struct {
	Hash     []byte
	Priority Priority
	// Proof			types.Signature
	Author types.OperatorID
}

func (*VCBCReadyData) Decode

func (d *VCBCReadyData) Decode(data []byte) error

Decode returns error if decoding failed

func (*VCBCReadyData) Encode

func (d *VCBCReadyData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*VCBCReadyData) Validate

func (d *VCBCReadyData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type VCBCRequestData

type VCBCRequestData struct {
	Priority Priority
	Author   types.OperatorID
}

func (*VCBCRequestData) Decode

func (d *VCBCRequestData) Decode(data []byte) error

Decode returns error if decoding failed

func (*VCBCRequestData) Encode

func (d *VCBCRequestData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*VCBCRequestData) Validate

func (d *VCBCRequestData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type VCBCSendData

type VCBCSendData struct {
	Proposals []*ProposalData
	Priority  Priority
	Author    types.OperatorID
}

func (*VCBCSendData) Decode

func (d *VCBCSendData) Decode(data []byte) error

Decode returns error if decoding failed

func (*VCBCSendData) Encode

func (d *VCBCSendData) Encode() ([]byte, error)

Encode returns a msg encoded bytes or error

func (*VCBCSendData) Validate

func (d *VCBCSendData) Validate() error

Validate returns error if msg validation doesn't pass. Msg validation checks the msg, it's variables for validity.

type VCBCState

type VCBCState struct {
	Priority Priority
	Queues   map[types.OperatorID]*VCBCQueue

	// used to store info about READY messages received
	VCBCr map[types.OperatorID]map[Priority]uint64
	VCBCW map[types.OperatorID]map[Priority][]*SignedMessage
	// used to store data from SEND messages received
	VCBCm map[types.OperatorID]map[Priority][]*ProposalData
	// used to store receipt proofs
	VCBCu map[types.OperatorID]map[Priority][]byte

	// store already received ready messages
	ReceivedReady map[types.OperatorID]map[Priority]map[types.OperatorID]bool
}

func NewVCBCState

func NewVCBCState() *VCBCState

func (*VCBCState) AppendToM added in v0.3.1

func (s *VCBCState) AppendToM(operatorID types.OperatorID, priority Priority, proposal *ProposalData)

func (*VCBCState) AppendToW added in v0.3.1

func (s *VCBCState) AppendToW(operatorID types.OperatorID, priority Priority, signedMessage *SignedMessage)

func (*VCBCState) EqualM added in v0.3.1

func (s *VCBCState) EqualM(operatorID types.OperatorID, priority Priority, proposals []*ProposalData) bool

func (*VCBCState) GetM added in v0.3.1

func (s *VCBCState) GetM(operatorID types.OperatorID, priority Priority) []*ProposalData

func (*VCBCState) GetR added in v0.3.1

func (s *VCBCState) GetR(operatorID types.OperatorID, priority Priority) uint64

func (*VCBCState) GetU added in v0.3.1

func (s *VCBCState) GetU(operatorID types.OperatorID, priority Priority) []byte

func (*VCBCState) GetW added in v0.3.1

func (s *VCBCState) GetW(operatorID types.OperatorID, priority Priority) []*SignedMessage

func (*VCBCState) HasM added in v0.3.1

func (s *VCBCState) HasM(operatorID types.OperatorID, priority Priority) bool

func (*VCBCState) HasReceivedReady added in v0.3.1

func (s *VCBCState) HasReceivedReady(author types.OperatorID, priority Priority, operatorID types.OperatorID) bool

func (*VCBCState) IncrementR added in v0.3.1

func (s *VCBCState) IncrementR(operatorID types.OperatorID, priority Priority)

func (*VCBCState) SetM added in v0.3.2

func (s *VCBCState) SetM(operatorID types.OperatorID, priority Priority, proposals []*ProposalData)

func (*VCBCState) SetReceivedReady added in v0.3.1

func (s *VCBCState) SetReceivedReady(author types.OperatorID, priority Priority, operatorID types.OperatorID, received bool)

func (*VCBCState) SetU added in v0.3.1

func (s *VCBCState) SetU(operatorID types.OperatorID, priority Priority, u []byte)

Jump to

Keyboard shortcuts

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