mirror of
https://github.com/QuilibriumNetwork/ceremonyclient.git
synced 2026-02-21 10:27:26 +08:00
* wip: conversion of hotstuff from flow into Q-oriented model * bulk of tests * remaining non-integration tests * add integration test, adjust log interface, small tweaks * further adjustments, restore full pacemaker shape * add component lifecycle management+supervisor * further refinements * resolve timeout hanging * mostly finalized state for consensus * bulk of engine swap out * lifecycle-ify most types * wiring nearly complete, missing needed hooks for proposals * plugged in, vetting message validation paths * global consensus, plugged in and verified * app shard now wired in too * do not decode empty keys.yml (#456) * remove obsolete engine.maxFrames config parameter (#454) * default to Info log level unless debug is enabled (#453) * respect config's "logging" section params, remove obsolete single-file logging (#452) * Trivial code cleanup aiming to reduce Go compiler warnings (#451) * simplify range traversal * simplify channel read for single select case * delete rand.Seed() deprecated in Go 1.20 and no-op as of Go 1.24 * simplify range traversal * simplify channel read for single select case * remove redundant type from array * simplify range traversal * simplify channel read for single select case * RC slate * finalize 2.1.0.5 * Update comments in StrictMonotonicCounter Fix comment formatting and clarify description. --------- Co-authored-by: Black Swan <3999712+blacks1ne@users.noreply.github.com>
41 lines
1.9 KiB
Go
41 lines
1.9 KiB
Go
package consensus
|
|
|
|
import (
|
|
"source.quilibrium.com/quilibrium/monorepo/consensus/models"
|
|
"source.quilibrium.com/quilibrium/monorepo/lifecycle"
|
|
)
|
|
|
|
// VoteAggregator verifies and aggregates votes to build QC. When enough votes
|
|
// have been collected, it builds a QC and send it to the EventLoop.
|
|
// VoteAggregator also detects protocol violation, including invalid votes,
|
|
// double voting etc, and notifies a HotStuff consumer for slashing.
|
|
type VoteAggregator[StateT models.Unique, VoteT models.Unique] interface {
|
|
lifecycle.Component
|
|
|
|
// AddVote verifies and aggregates a vote. The voting state could either be
|
|
// known or unknown. If the voting state is unknown, the vote won't be
|
|
// processed until AddState is called with the state. This method can be
|
|
// called concurrently, votes will be queued and processed asynchronously.
|
|
AddVote(vote *VoteT)
|
|
|
|
// AddState notifies the VoteAggregator that it should start processing votes
|
|
// for the given state. The input state is queued internally within the
|
|
// `VoteAggregator` and processed _asynchronously_ by the VoteAggregator's
|
|
// internal worker routines.
|
|
// CAUTION: we expect that the input state's validity has been confirmed prior
|
|
// to calling AddState, including the proposer's consensus. Otherwise,
|
|
// VoteAggregator might crash or exhibit undefined behaviour.
|
|
AddState(state *models.SignedProposal[StateT, VoteT])
|
|
|
|
// InvalidState notifies the VoteAggregator about an invalid proposal, so that
|
|
// it can process votes for the invalid state and slash the voters. No errors
|
|
// are expected during normal operations.
|
|
InvalidState(state *models.SignedProposal[StateT, VoteT]) error
|
|
|
|
// PruneUpToRank deletes all votes _below_ to the given rank, as well as
|
|
// related indices. We only retain and process whose rank is equal or larger
|
|
// than `lowestRetainedRank`. If `lowestRetainedRank` is smaller than the
|
|
// previous value, the previous value is kept and the method call is a NoOp.
|
|
PruneUpToRank(rank uint64)
|
|
}
|