Documentation ¶
Overview ¶
Package hare implements the Hare Protocol.
nolint
Index ¶
- Constants
- Variables
- type AggregatedMessages
- type Broker
- func (b *Broker) CleanOldLayers(current types.LayerID)
- func (b *Broker) Close()
- func (b *Broker) HandleEligibility(ctx context.Context, em *types.HareEligibilityGossip) bool
- func (b *Broker) HandleMessage(ctx context.Context, _ p2p.Peer, msg []byte) error
- func (b *Broker) Register(ctx context.Context, id types.LayerID) (chan any, *EligibilityTracker, error)
- func (b *Broker) Start(ctx context.Context)
- func (b *Broker) Synced(ctx context.Context, id types.LayerID) bool
- func (b *Broker) Unregister(ctx context.Context, id types.LayerID)
- type Certificate
- type Consensus
- type CountInfo
- func (ci *CountInfo) Add(other *CountInfo) *CountInfo
- func (ci *CountInfo) IncDishonest(count uint16)
- func (ci *CountInfo) IncHonest(count uint16)
- func (ci *CountInfo) IncKnownEquivocator(count uint16)
- func (ci *CountInfo) MarshalLogObject(encoder log.ObjectEncoder) error
- func (ci *CountInfo) Meet(threshold int) bool
- type Cred
- type EligibilityTracker
- type Hare
- type InnerMessage
- type LayerClock
- type LayerOutput
- type Message
- func (m *Message) Bytes() []byte
- func (t *Message) DecodeScale(dec *scale.Decoder) (total int, err error)
- func (t *Message) EncodeScale(enc *scale.Encoder) (total int, err error)
- func (m *Message) Field() log.Field
- func (m *Message) MarshalLogObject(encoder log.ObjectEncoder) error
- func (m *Message) SignedBytes() []byte
- type MessageType
- type Opt
- type RefCountTracker
- type Rolacle
- type RoundClock
- type Set
- func (s *Set) Add(id types.ProposalID)
- func (s *Set) Clone() *Set
- func (s *Set) Complement(u *Set) *Set
- func (s *Set) Contains(id types.ProposalID) bool
- func (s *Set) Equals(g *Set) bool
- func (s *Set) ID() types.Hash32
- func (s *Set) Intersection(g *Set) *Set
- func (s *Set) IsSubSetOf(g *Set) bool
- func (s *Set) Remove(id types.ProposalID)
- func (s *Set) Size() int
- func (s *Set) String() string
- func (s *Set) Subtract(g *Set)
- func (s *Set) ToSlice() []types.ProposalID
- func (s *Set) Union(g *Set) *Set
- type SimpleRoundClock
- type State
Constants ¶
const (
// RoundsPerIteration is the number of rounds per iteration in the hare protocol.
RoundsPerIteration = 4
)
const Wakeup = math.MaxUint32 - 1 // -2
Wakeup has a value of -2 because it occurs exactly two round durations before the end of round 0. This accounts for the duration of round zero and the preround.
Variables ¶
var ErrTooLate = errors.New("consensus process finished too late")
ErrTooLate means that the consensus was terminated too late.
Functions ¶
This section is empty.
Types ¶
type AggregatedMessages ¶ added in v1.0.0
type AggregatedMessages struct {
Messages []Message `scale:"max=1000"` // limited by hare config parameter N with safety margin
}
AggregatedMessages is a collection of messages.
func (*AggregatedMessages) DecodeScale ¶ added in v1.0.0
func (t *AggregatedMessages) DecodeScale(dec *scale.Decoder) (total int, err error)
func (*AggregatedMessages) EncodeScale ¶ added in v1.0.0
func (t *AggregatedMessages) EncodeScale(enc *scale.Encoder) (total int, err error)
type Broker ¶
Broker is the dispatcher of incoming Hare messages. The broker validates that the sender is eligible and active and forwards the message to the corresponding outbox.
func (*Broker) CleanOldLayers ¶ added in v1.0.0
func (*Broker) HandleEligibility ¶ added in v1.0.0
func (*Broker) HandleMessage ¶ added in v1.0.0
HandleMessage separate listener routine that receives gossip messages and adds them to the priority queue.
func (*Broker) Register ¶
func (b *Broker) Register(ctx context.Context, id types.LayerID) (chan any, *EligibilityTracker, error)
Register a layer to receive messages Note: the registering instance is assumed to be started and accepting messages.
type Certificate ¶ added in v1.0.0
type Certificate struct { // Values is the committed set - expected are 50 proposals per layer + safety margin Values []types.ProposalID `scale:"max=500"` AggMsgs *AggregatedMessages }
Certificate is a collection of messages and the set of values. Typically used as a collection of commit messages.
func (*Certificate) DecodeScale ¶ added in v1.0.0
func (t *Certificate) DecodeScale(dec *scale.Decoder) (total int, err error)
func (*Certificate) EncodeScale ¶ added in v1.0.0
func (t *Certificate) EncodeScale(enc *scale.Encoder) (total int, err error)
type CountInfo ¶ added in v1.0.0
type CountInfo struct {
// contains filtered or unexported fields
}
func (*CountInfo) IncDishonest ¶ added in v1.0.0
func (*CountInfo) IncKnownEquivocator ¶ added in v1.0.0
func (*CountInfo) MarshalLogObject ¶ added in v1.0.0
func (ci *CountInfo) MarshalLogObject(encoder log.ObjectEncoder) error
type EligibilityTracker ¶ added in v1.0.0
type EligibilityTracker struct {
// contains filtered or unexported fields
}
func NewEligibilityTracker ¶ added in v1.0.0
func NewEligibilityTracker(size int) *EligibilityTracker
func (*EligibilityTracker) Dishonest ¶ added in v1.0.0
func (et *EligibilityTracker) Dishonest(nodeID types.NodeID, round uint32) bool
Dishonest returns whether an eligible identity is known malicious.
type Hare ¶
Hare is the orchestrator that starts new consensus processes and collects their output.
func New ¶
func New( cdb *datastore.CachedDB, conf config.Config, publisher pubsub.PublishSubsciber, sign *signing.EdSigner, edVerifier *signing.EdVerifier, nid types.NodeID, ch chan LayerOutput, syncState system.SyncStateProvider, beacons system.BeaconGetter, rolacle Rolacle, patrol layerPatrol, stateQ stateQuerier, layerClock LayerClock, weakCoin weakCoin, logger log.Log, opts ...Opt, ) *Hare
New returns a new Hare struct.
func (*Hare) Close ¶ added in v1.0.0
func (h *Hare) Close()
Close sends a termination signal to hare goroutines and waits for their termination.
func (*Hare) GetHareMsgHandler ¶ added in v1.0.0
func (h *Hare) GetHareMsgHandler() pubsub.GossipHandler
GetHareMsgHandler returns the gossip handler for hare protocol message.
func (*Hare) HandleEligibility ¶ added in v1.0.0
func (h *Hare) HandleEligibility(ctx context.Context, emsg *types.HareEligibilityGossip)
type InnerMessage ¶ added in v1.0.0
type InnerMessage struct { Layer types.LayerID Round uint32 // the round counter (K) Type MessageType CommittedRound uint32 // the round Values (S) is committed (Ki) // Values is the set S. optional for commit InnerMsg in a certificate - // expected are 50 proposals per layer + safety margin Values []types.ProposalID `scale:"max=500"` Svp *AggregatedMessages // optional. only for proposal Messages Cert *Certificate // optional }
InnerMessage is the actual set of fields that describe a message in the Hare protocol.
func (*InnerMessage) DecodeScale ¶ added in v1.0.0
func (t *InnerMessage) DecodeScale(dec *scale.Decoder) (total int, err error)
func (*InnerMessage) EncodeScale ¶ added in v1.0.0
func (t *InnerMessage) EncodeScale(enc *scale.Encoder) (total int, err error)
func (*InnerMessage) HashBytes ¶ added in v1.0.0
func (im *InnerMessage) HashBytes() []byte
HashBytes returns the message as bytes.
func (*InnerMessage) MarshalLogObject ¶ added in v1.0.0
func (im *InnerMessage) MarshalLogObject(encoder log.ObjectEncoder) error
type LayerClock ¶ added in v1.0.0
type LayerClock interface { LayerToTime(types.LayerID) time.Time AwaitLayer(types.LayerID) <-chan struct{} CurrentLayer() types.LayerID }
LayerClock provides a timer for the start of a given layer, as well as the current layer and allows converting a layer number to a clock time.
type LayerOutput ¶ added in v1.0.0
LayerOutput is the output of each hare consensus process.
type Message ¶
type Message struct { *InnerMessage SmesherID types.NodeID Signature types.EdSignature Eligibility types.HareEligibility // contains filtered or unexported fields }
func MessageFromBuffer ¶
MessageFromBuffer builds an Hare message from the provided bytes buffer. It returns an error if unmarshal of the provided byte slice failed.
func (*Message) Bytes ¶ added in v1.0.0
Bytes returns the message as bytes. It panics if the message errored on unmarshal.
func (*Message) DecodeScale ¶ added in v1.0.0
func (*Message) EncodeScale ¶ added in v1.0.0
func (*Message) Field ¶ added in v0.1.27
Field returns a log field. Implements the LoggableField interface.
func (*Message) MarshalLogObject ¶ added in v1.0.0
func (m *Message) MarshalLogObject(encoder log.ObjectEncoder) error
func (*Message) SignedBytes ¶ added in v1.0.0
SignedBytes returns the signed data for hare message.
type MessageType ¶ added in v1.0.0
type MessageType byte
MessageType is a message type.
func (MessageType) String ¶ added in v1.0.0
func (mType MessageType) String() string
type RefCountTracker ¶
type RefCountTracker struct {
// contains filtered or unexported fields
}
RefCountTracker tracks the number of references of any object id.
func NewRefCountTracker ¶
func NewRefCountTracker(round uint32, et *EligibilityTracker, expectedSize int) *RefCountTracker
NewRefCountTracker creates a new reference count tracker.
func (*RefCountTracker) CountStatus ¶
func (rt *RefCountTracker) CountStatus(id any) *CountInfo
CountStatus returns the number of references to the given id.
type Rolacle ¶
type Rolacle interface { Validate(context.Context, types.LayerID, uint32, int, types.NodeID, types.VrfSignature, uint16) (bool, error) CalcEligibility(context.Context, types.LayerID, uint32, int, types.NodeID, types.VrfSignature) (uint16, error) Proof(context.Context, *signing.VRFSigner, types.LayerID, uint32) (types.VrfSignature, error) IsIdentityActiveOnConsensusView(context.Context, types.NodeID, types.LayerID) (bool, error) }
Rolacle is the roles oracle provider.
type RoundClock ¶ added in v1.0.0
type RoundClock interface { AwaitWakeup() <-chan struct{} // RoundEnd returns the time at which round ends, passing round-1 will // return the time at which round starts. RoundEnd(round uint32) time.Time AwaitEndOfRound(round uint32) <-chan struct{} }
RoundClock is a timer interface.
type Set ¶
type Set struct {
// contains filtered or unexported fields
}
Set represents a unique set of values.
func NewDefaultEmptySet ¶
func NewDefaultEmptySet() *Set
NewDefaultEmptySet creates an empty set with the default size.
func NewEmptySet ¶
NewEmptySet creates an empty set with the provided size.
func NewSet ¶
func NewSet(data []types.ProposalID) *Set
NewSet creates a set from the provided array of values. Note: duplicated values are ignored.
func NewSetFromValues ¶
func NewSetFromValues(values ...types.ProposalID) *Set
NewSetFromValues creates a set of the provided values. Note: duplicated values are ignored.
func (*Set) Add ¶
func (s *Set) Add(id types.ProposalID)
Add a value to the set. It has no effect if the value already exists in the set.
func (*Set) Complement ¶
Complement returns a new set that represents the complement of s relatively to the world u.
func (*Set) Contains ¶
func (s *Set) Contains(id types.ProposalID) bool
Contains returns true if the provided value is contained in the set, false otherwise.
func (*Set) Intersection ¶
Intersection returns the intersection a new set which represents the intersection of s and g.
func (*Set) IsSubSetOf ¶
IsSubSetOf returns true if s is a subset of g, false otherwise.
func (*Set) Remove ¶
func (s *Set) Remove(id types.ProposalID)
Remove a value from the set. It has no effect if the value doesn't exist in the set.
func (*Set) ToSlice ¶
func (s *Set) ToSlice() []types.ProposalID
ToSlice returns the array representation of the set.
type SimpleRoundClock ¶ added in v1.0.0
type SimpleRoundClock struct { LayerTime time.Time WakeupDelta time.Duration RoundDuration time.Duration }
SimpleRoundClock is a simple Hare-round clock. Repeated calls to AwaitEndOfRound() will each return a new channel and will be backed by a new timer which will not be garbage collected until it expires. To avoid leaking resources, callers should avoid calling AwaitEndOfRound() more than once for a given round (e.g. by storing the resulting channel and reusing it).
func NewSimpleRoundClock ¶ added in v1.0.0
func NewSimpleRoundClock(layerTime time.Time, wakeupDelta, roundDuration time.Duration) *SimpleRoundClock
NewSimpleRoundClock returns a new SimpleRoundClock, given the provided configuration.
func (*SimpleRoundClock) AwaitEndOfRound ¶ added in v1.0.0
func (c *SimpleRoundClock) AwaitEndOfRound(round uint32) <-chan struct{}
AwaitEndOfRound returns a channel that gets closed when the given round ends. Repeated calls to this method will return new instances of the channel and use new underlying timers which will not be garbage collected until they expire. To avoid leaking resources, callers should avoid calling AwaitEndOfRound() more than once for a given round (e.g. by storing the resulting channel and reusing it).
func (*SimpleRoundClock) AwaitWakeup ¶ added in v1.0.0
func (c *SimpleRoundClock) AwaitWakeup() <-chan struct{}
AwaitWakeup returns a channel that gets closed when the Hare wakeup delay has passed.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Code generated by MockGen.
|
Code generated by MockGen. |
Code generated by MockGen.
|
Code generated by MockGen. |