ceremonyclient/consensus/vote_aggregator.go
Cassandra Heart c797d482f9
v2.1.0.5 (#457)
* 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>
2025-11-11 05:00:17 -06:00

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)
}