| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Ouroboros.Consensus.Committee.Class
Description
Generic interface used by implementations of voting committees.
Synopsis
- data family VotingCommittee crypto committee
- class CryptoSupportsVoteSigning crypto ⇒ CryptoSupportsVotingCommittee crypto committee where
- data VotingCommitteeInput crypto committee
- data VotingCommitteeError crypto committee
- data EligibilityWitness crypto committee
- data Vote crypto committee
- data Cert crypto committee
- voteTarget ∷ Vote crypto committee → (ElectionId crypto, VoteCandidate crypto)
- compareVotesById ∷ Vote crypto committee → Vote crypto committee → Ordering
- mkVotingCommittee ∷ VotingCommitteeInput crypto committee → Either (VotingCommitteeError crypto committee) (VotingCommittee crypto committee)
- checkShouldVote ∷ VotingCommittee crypto committee → PoolId → PrivateKey crypto → ElectionId crypto → Either (VotingCommitteeError crypto committee) (Maybe (EligibilityWitness crypto committee))
- forgeVote ∷ EligibilityWitness crypto committee → PrivateKey crypto → ElectionId crypto → VoteCandidate crypto → Vote crypto committee
- verifyVote ∷ VotingCommittee crypto committee → Vote crypto committee → Either (VotingCommitteeError crypto committee) (EligibilityWitness crypto committee)
- eligiblePartyVoteWeight ∷ VotingCommittee crypto committee → EligibilityWitness crypto committee → VoteWeight
- forgeCert ∷ UniqueVotesWithSameTarget crypto committee → Either (VotingCommitteeError crypto committee) (Cert crypto committee)
- verifyCert ∷ VotingCommittee crypto committee → Cert crypto committee → Either (VotingCommitteeError crypto committee) (NE [EligibilityWitness crypto committee])
- data UniqueVotesWithSameTarget crypto committee
- getElectionIdFromVotes ∷ UniqueVotesWithSameTarget crypto committee → ElectionId crypto
- getVoteCandidateFromVotes ∷ UniqueVotesWithSameTarget crypto committee → VoteCandidate crypto
- getRawVotes ∷ UniqueVotesWithSameTarget crypto committee → NE [Vote crypto committee]
- data UniqueVotesWithSameTargetError vote
- = DuplicateVotes (NE [vote])
- | TargetMismatch vote (NE [vote])
- ensureUniqueVotesWithSameTarget ∷ (Eq (ElectionId crypto), Eq (VoteCandidate crypto)) ⇒ (Vote crypto committee → (ElectionId crypto, VoteCandidate crypto)) → (Vote crypto committee → Vote crypto committee → Ordering) → NE [Vote crypto committee] → Either (UniqueVotesWithSameTargetError (Vote crypto committee)) (UniqueVotesWithSameTarget crypto committee)
- unsafeUniqueVotesWithSameTarget ∷ (CryptoSupportsVotingCommittee crypto committee, Eq (ElectionId crypto), Eq (VoteCandidate crypto)) ⇒ NE [Vote crypto committee] → UniqueVotesWithSameTarget crypto committee
- checkUniqueVotesWithSameTarget ∷ (Eq (ElectionId crypto), Eq (VoteCandidate crypto)) ⇒ Proxy crypto → (vote → (ElectionId crypto, VoteCandidate crypto)) → (vote → vote → Ordering) → NE [vote] → Either (UniqueVotesWithSameTargetError vote) ()
Voting committee interface
data family VotingCommittee crypto committee Source #
Structure storing the voting committee context
NOTE: This data family is defined outside of the
CryptoSupportsVotingCommittee class so that it can be instantiated for the
HFC block without having to provide an instance of the whole class (because
for HFC, we dispatch to a concrete era first so none of the methods/types of
the class would actually be used).
Instances
class CryptoSupportsVoteSigning crypto ⇒ CryptoSupportsVotingCommittee crypto committee where Source #
Interface for voting committee schemes.
This class is parametrized by the crypto primitives and the committee selection data structure. Instances define how to check whether a party should vote and how to compute the voting weight of a committee member.
Associated Types
data VotingCommitteeInput crypto committee Source #
Input information needed to construct a voting committee
data VotingCommitteeError crypto committee Source #
Errors that can occur when operating on a voting committee
data EligibilityWitness crypto committee Source #
Witness attesting that a party is eligible to vote in a given election
NOTE: this is not necessarily the same as the cryptographic proof of eligibility used in concrete votes and certificates sent over the wire.
data Vote crypto committee Source #
Abstract vote cast by a committee member in a given election
data Cert crypto committee Source #
Abstract certificate attesting the winner of a given election
Methods
voteTarget ∷ Vote crypto committee → (ElectionId crypto, VoteCandidate crypto) Source #
Project the target (election and candidate) from an abstract vote
compareVotesById ∷ Vote crypto committee → Vote crypto committee → Ordering Source #
Compare votes by ID, where EQ means that two votes have the same ID and are either total duplicates, or are equivocating (i.e., they have the same ID but a different target)
mkVotingCommittee ∷ VotingCommitteeInput crypto committee → Either (VotingCommitteeError crypto committee) (VotingCommittee crypto committee) Source #
Construct a voting committee
checkShouldVote ∷ VotingCommittee crypto committee → PoolId → PrivateKey crypto → ElectionId crypto → Either (VotingCommitteeError crypto committee) (Maybe (EligibilityWitness crypto committee)) Source #
Check whether we should vote in a given election
forgeVote ∷ EligibilityWitness crypto committee → PrivateKey crypto → ElectionId crypto → VoteCandidate crypto → Vote crypto committee Source #
Forge a vote for a given election and candidate
verifyVote ∷ VotingCommittee crypto committee → Vote crypto committee → Either (VotingCommitteeError crypto committee) (EligibilityWitness crypto committee) Source #
Verify a vote cast by a committee member in a given election
eligiblePartyVoteWeight ∷ VotingCommittee crypto committee → EligibilityWitness crypto committee → VoteWeight Source #
Compute the (relative) voting power of an eligibile party
WARNING: there is a key difference between the "Ledger stake" and the "Vote weight" of a given voter. On one hand, the ledger stake is the stake as reflected directly by the ledger stake distribution under consideration (in its corresponding absolute unit). On the other hand, the "Vote weight" refers to the relative (i.e. normalised) voting power of that voter w.r.t. the rest of the committee.
It is up to the implementation of the voting committee to decide how to compute this value, but it should be implemented so that detecting a quorum can be done by comparing the total vote weight of the votes received against a fixed threshold, e.g., "a quorum is reached if the total weight of the votes received exceeds 75% or 0.75 (of the total voting stake)".
forgeCert ∷ UniqueVotesWithSameTarget crypto committee → Either (VotingCommitteeError crypto committee) (Cert crypto committee) Source #
Forge a certificate attesting the winner of a given election
verifyCert ∷ VotingCommittee crypto committee → Cert crypto committee → Either (VotingCommitteeError crypto committee) (NE [EligibilityWitness crypto committee]) Source #
Verify a certificate attesting the winner of a given election
Instances
| (Ord (ElectionId crypto), CryptoSupportsAggregateVoteSigning crypto) ⇒ CryptoSupportsVotingCommittee crypto EveryoneVotes Source # | |||||||||||||||||||||
Defined in Ouroboros.Consensus.Committee.EveryoneVotes Associated Types
Methods voteTarget ∷ Vote crypto EveryoneVotes → (ElectionId crypto, VoteCandidate crypto) Source # compareVotesById ∷ Vote crypto EveryoneVotes → Vote crypto EveryoneVotes → Ordering Source # mkVotingCommittee ∷ VotingCommitteeInput crypto EveryoneVotes → Either (VotingCommitteeError crypto EveryoneVotes) (VotingCommittee crypto EveryoneVotes) Source # checkShouldVote ∷ VotingCommittee crypto EveryoneVotes → PoolId → PrivateKey crypto → ElectionId crypto → Either (VotingCommitteeError crypto EveryoneVotes) (Maybe (EligibilityWitness crypto EveryoneVotes)) Source # forgeVote ∷ EligibilityWitness crypto EveryoneVotes → PrivateKey crypto → ElectionId crypto → VoteCandidate crypto → Vote crypto EveryoneVotes Source # verifyVote ∷ VotingCommittee crypto EveryoneVotes → Vote crypto EveryoneVotes → Either (VotingCommitteeError crypto EveryoneVotes) (EligibilityWitness crypto EveryoneVotes) Source # eligiblePartyVoteWeight ∷ VotingCommittee crypto EveryoneVotes → EligibilityWitness crypto EveryoneVotes → VoteWeight Source # forgeCert ∷ UniqueVotesWithSameTarget crypto EveryoneVotes → Either (VotingCommitteeError crypto EveryoneVotes) (Cert crypto EveryoneVotes) Source # verifyCert ∷ VotingCommittee crypto EveryoneVotes → Cert crypto EveryoneVotes → Either (VotingCommitteeError crypto EveryoneVotes) (NE [EligibilityWitness crypto EveryoneVotes]) Source # | |||||||||||||||||||||
| (CryptoSupportsAggregateVoteSigning crypto, CryptoSupportsBatchVRFVerification crypto, Ord (ElectionId crypto)) ⇒ CryptoSupportsVotingCommittee crypto WFALS Source # | |||||||||||||||||||||
Defined in Ouroboros.Consensus.Committee.WFALS Associated Types
Methods voteTarget ∷ Vote crypto WFALS → (ElectionId crypto, VoteCandidate crypto) Source # compareVotesById ∷ Vote crypto WFALS → Vote crypto WFALS → Ordering Source # mkVotingCommittee ∷ VotingCommitteeInput crypto WFALS → Either (VotingCommitteeError crypto WFALS) (VotingCommittee crypto WFALS) Source # checkShouldVote ∷ VotingCommittee crypto WFALS → PoolId → PrivateKey crypto → ElectionId crypto → Either (VotingCommitteeError crypto WFALS) (Maybe (EligibilityWitness crypto WFALS)) Source # forgeVote ∷ EligibilityWitness crypto WFALS → PrivateKey crypto → ElectionId crypto → VoteCandidate crypto → Vote crypto WFALS Source # verifyVote ∷ VotingCommittee crypto WFALS → Vote crypto WFALS → Either (VotingCommitteeError crypto WFALS) (EligibilityWitness crypto WFALS) Source # eligiblePartyVoteWeight ∷ VotingCommittee crypto WFALS → EligibilityWitness crypto WFALS → VoteWeight Source # forgeCert ∷ UniqueVotesWithSameTarget crypto WFALS → Either (VotingCommitteeError crypto WFALS) (Cert crypto WFALS) Source # verifyCert ∷ VotingCommittee crypto WFALS → Cert crypto WFALS → Either (VotingCommitteeError crypto WFALS) (NE [EligibilityWitness crypto WFALS]) Source # | |||||||||||||||||||||
| CryptoSupportsVotingCommittee (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme Source # | |||||||||||||||||||||
Defined in Ouroboros.Consensus.Peras.Void Associated Types
Methods voteTarget ∷ Vote (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → (ElectionId (VoidPerasCrypto blk), VoteCandidate (VoidPerasCrypto blk)) Source # compareVotesById ∷ Vote (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → Vote (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → Ordering Source # mkVotingCommittee ∷ VotingCommitteeInput (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → Either (VotingCommitteeError (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme) (VotingCommittee (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme) Source # checkShouldVote ∷ VotingCommittee (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → PoolId → PrivateKey (VoidPerasCrypto blk) → ElectionId (VoidPerasCrypto blk) → Either (VotingCommitteeError (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme) (Maybe (EligibilityWitness (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme)) Source # forgeVote ∷ EligibilityWitness (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → PrivateKey (VoidPerasCrypto blk) → ElectionId (VoidPerasCrypto blk) → VoteCandidate (VoidPerasCrypto blk) → Vote (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme Source # verifyVote ∷ VotingCommittee (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → Vote (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → Either (VotingCommitteeError (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme) (EligibilityWitness (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme) Source # eligiblePartyVoteWeight ∷ VotingCommittee (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → EligibilityWitness (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → VoteWeight Source # forgeCert ∷ UniqueVotesWithSameTarget (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → Either (VotingCommitteeError (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme) (Cert (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme) Source # verifyCert ∷ VotingCommittee (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → Cert (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme → Either (VotingCommitteeError (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme) (NE [EligibilityWitness (VoidPerasCrypto blk) VoidPerasVotingCommitteeScheme]) Source # | |||||||||||||||||||||
Votes with same target
data UniqueVotesWithSameTarget crypto committee Source #
Collection of unique votes all targeting the same election and candidate
getElectionIdFromVotes ∷ UniqueVotesWithSameTarget crypto committee → ElectionId crypto Source #
Get the election identifier targeted by a collection of votes
getVoteCandidateFromVotes ∷ UniqueVotesWithSameTarget crypto committee → VoteCandidate crypto Source #
Get the vote candidate targeted by a collection of votes
getRawVotes ∷ UniqueVotesWithSameTarget crypto committee → NE [Vote crypto committee] Source #
Get the raw votes from a collection of votes with the same target.
NOTE: this returns votes in ascending seat index order.
data UniqueVotesWithSameTargetError vote Source #
Errors when votes do not all target the same election and candidate
Constructors
| DuplicateVotes (NE [vote]) | |
| TargetMismatch vote (NE [vote]) |
ensureUniqueVotesWithSameTarget Source #
Arguments
| ∷ (Eq (ElectionId crypto), Eq (VoteCandidate crypto)) | |
| ⇒ (Vote crypto committee → (ElectionId crypto, VoteCandidate crypto)) | How to project the target from an abstract vote |
| → (Vote crypto committee → Vote crypto committee → Ordering) | How to compare votes by ID, where EQ means that two votes have the same ID and are either total duplicates, or are equivocating (i.e., they have the same ID but a different target) |
| → NE [Vote crypto committee] | Collection of votes to check |
| → Either (UniqueVotesWithSameTargetError (Vote crypto committee)) (UniqueVotesWithSameTarget crypto committee) |
Check that a non-empty list of votes all target the same election and candidate and there are no duplicates.
NOTE: duplicates are reported in preference to target mismatches.
unsafeUniqueVotesWithSameTarget Source #
Arguments
| ∷ (CryptoSupportsVotingCommittee crypto committee, Eq (ElectionId crypto), Eq (VoteCandidate crypto)) | |
| ⇒ NE [Vote crypto committee] | Collection of votes to check |
| → UniqueVotesWithSameTarget crypto committee |
Same as ensureUniqueVotesWithSameTarget but turns the invariant
checks into assertions.
WARNING: asserts become a no-op if the code is compiled with optimizations, thus this function should only be used in production when the caller can guarantee that the input votes satisfy the contract.
checkUniqueVotesWithSameTarget Source #
Arguments
| ∷ (Eq (ElectionId crypto), Eq (VoteCandidate crypto)) | |
| ⇒ Proxy crypto | |
| → (vote → (ElectionId crypto, VoteCandidate crypto)) | How to project the target an abstract vote |
| → (vote → vote → Ordering) | How to compare votes by ID, where EQ means that two votes have the same ID and are either total duplicates, or are equivocating (i.e., they have the same ID but a different target) |
| → NE [vote] | Collection of votes to check |
| → Either (UniqueVotesWithSameTargetError vote) () |
Validate that a non-empty collection of votes is well-formed for
certificate forging: all votes target the same election and candidate
(per getTarget), and no two votes are equal under cmpVotes.
Equality (EQ) is treated as evidence of a duplicate or equivocating vote
and is reported via DuplicateVotes in preference to any TargetMismatch.
NOTE: this is exposed for testing; production code should use
ensureUniqueVotesWithSameTarget or unsafeUniqueVotesWithSameTarget.