ouroboros-consensus
Safe HaskellNone
LanguageHaskell2010

Ouroboros.Consensus.Committee.Class

Description

Generic interface used by implementations of voting committees.

Synopsis

Voting committee interface

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 VotingCommittee crypto committee Source #

Structure storing the voting committee context

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

mkVotingCommitteeVotingCommitteeInput crypto committee → Either (VotingCommitteeError crypto committee) (VotingCommittee crypto committee) Source #

Construct a voting committee

checkShouldVoteVotingCommittee crypto committee → PoolIdPrivateKey crypto → ElectionId crypto → Either (VotingCommitteeError crypto committee) (Maybe (EligibilityWitness crypto committee)) Source #

Check whether we should vote in a given election

forgeVoteEligibilityWitness crypto committee → PrivateKey crypto → ElectionId crypto → VoteCandidate crypto → Vote crypto committee Source #

Forge a vote for a given election and candidate

verifyVoteVotingCommittee 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

eligiblePartyVoteWeightVotingCommittee crypto committee → EligibilityWitness crypto committee → VoteWeight Source #

Compute the voting weight of a eligibile party

forgeCertUniqueVotesWithSameTarget crypto committee → Either (VotingCommitteeError crypto committee) (Cert crypto committee) Source #

Forge a certificate attesting the winner of a given election

verifyCertVotingCommittee 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

Instances details
CryptoSupportsAggregateVoteSigning crypto ⇒ CryptoSupportsVotingCommittee crypto EveryoneVotes Source # 
Instance details

Defined in Ouroboros.Consensus.Committee.EveryoneVotes

Associated Types

data VotingCommittee crypto EveryoneVotes 
Instance details

Defined in Ouroboros.Consensus.Committee.EveryoneVotes

data VotingCommitteeInput crypto EveryoneVotes 
Instance details

Defined in Ouroboros.Consensus.Committee.EveryoneVotes

data VotingCommitteeError crypto EveryoneVotes 
Instance details

Defined in Ouroboros.Consensus.Committee.EveryoneVotes

data EligibilityWitness crypto EveryoneVotes 
Instance details

Defined in Ouroboros.Consensus.Committee.EveryoneVotes

data Vote crypto EveryoneVotes 
Instance details

Defined in Ouroboros.Consensus.Committee.EveryoneVotes

data Cert crypto EveryoneVotes 
Instance details

Defined in Ouroboros.Consensus.Committee.EveryoneVotes

(CryptoSupportsAggregateVoteSigning crypto, CryptoSupportsBatchVRFVerification crypto) ⇒ CryptoSupportsVotingCommittee crypto WFALS Source # 
Instance details

Defined in Ouroboros.Consensus.Committee.WFALS

Associated Types

data VotingCommittee crypto WFALS 
Instance details

Defined in Ouroboros.Consensus.Committee.WFALS

data VotingCommitteeInput crypto WFALS 
Instance details

Defined in Ouroboros.Consensus.Committee.WFALS

data VotingCommitteeError crypto WFALS 
Instance details

Defined in Ouroboros.Consensus.Committee.WFALS

data EligibilityWitness crypto WFALS 
Instance details

Defined in Ouroboros.Consensus.Committee.WFALS

data Vote crypto WFALS 
Instance details

Defined in Ouroboros.Consensus.Committee.WFALS

data Cert crypto WFALS 
Instance details

Defined in Ouroboros.Consensus.Committee.WFALS

data Cert crypto WFALS = WFALSCert !(ElectionId crypto) !(VoteCandidate crypto) !(NE (Map SeatIndex (Maybe (VRFOutput crypto)))) !(AggregateVoteSignature crypto)

Votes with same target

data UniqueVotesWithSameTarget crypto committee Source #

Collection of unique votes all targeting the same election and candidate

getElectionIdFromVotesUniqueVotesWithSameTarget crypto committee → ElectionId crypto Source #

Get the election identifier targeted by a collection of votes

getVoteCandidateFromVotesUniqueVotesWithSameTarget crypto committee → VoteCandidate crypto Source #

Get the vote candidate targeted by a collection of votes

getRawVotesUniqueVotesWithSameTarget 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

∷ (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

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.