This repository was archived by the owner on Aug 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
Refactor QC traits #64
Merged
Merged
Changes from 4 commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
bfa75ed
reorg qc trait and impl
alxiong 8085561
rename: QCValidation->QC, BitvectorQuorumCertificate->BitVectorQC, ::…
alxiong a419267
add QC::trace() API
alxiong 1cc2965
remove CheckedType since it's unused (and unclear why we need it)
alxiong c9429f0
add back check()->Result<QuorumSize>
alxiong File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,75 @@ | ||
| //! Quorum Certificate traits and implementations. | ||
|
|
||
| use ark_std::{ | ||
| rand::{CryptoRng, RngCore}, | ||
| vec::Vec, | ||
| }; | ||
| use bitvec::prelude::*; | ||
| use generic_array::{ArrayLength, GenericArray}; | ||
| use jf_primitives::errors::PrimitivesError; | ||
| use jf_primitives::signatures::AggregateableSignatureSchemes; | ||
| use serde::{Deserialize, Serialize}; | ||
|
|
||
| pub mod bit_vector; | ||
|
|
||
| /// Trait for validating a QC built from different signatures on the same message | ||
| pub trait QuorumCertificate<A: AggregateableSignatureSchemes + Serialize + for<'a> Deserialize<'a>> | ||
| { | ||
| /// Public parameters for generating the QC | ||
| /// E.g: snark proving/verifying keys, list of (or pointer to) public keys stored in the smart contract. | ||
| type QCProverParams: Serialize + for<'a> Deserialize<'a>; | ||
|
|
||
| /// Public parameters for validating the QC | ||
| /// E.g: verifying keys, stake table commitment | ||
| type QCVerifierParams: Serialize + for<'a> Deserialize<'a>; | ||
|
|
||
| /// Allows to fix the size of the message at compilation time. | ||
| type MessageLength: ArrayLength<A::MessageUnit>; | ||
|
|
||
| /// Type of the actual quorum certificate object | ||
| type QC; | ||
|
|
||
| /// Produces a partial signature on a message with a single user signing key | ||
| /// NOTE: the original message (vote) should be prefixed with the hash of the stake table. | ||
| /// * `agg_sig_pp` - public parameters for aggregate signature | ||
| /// * `message` - message to be signed | ||
| /// * `sk` - user signing key | ||
| /// * `returns` - a "simple" signature | ||
| fn sign<R: CryptoRng + RngCore>( | ||
| agg_sig_pp: &A::PublicParameter, | ||
| message: &GenericArray<A::MessageUnit, Self::MessageLength>, | ||
| sk: &A::SigningKey, | ||
| prng: &mut R, | ||
| ) -> Result<A::Signature, PrimitivesError>; | ||
|
|
||
| /// Computes an aggregated signature from a set of partial signatures and the verification keys involved | ||
| /// * `qc_pp` - public parameters for generating the QC | ||
| /// * `signers` - a bool vector indicating the list of verification keys corresponding to the set of partial signatures | ||
| /// * `sigs` - partial signatures on the same message | ||
| /// * `returns` - an error if some of the partial signatures provided are invalid | ||
| /// or the number of partial signatures / verifications keys are different. | ||
| /// Otherwise return an obtained quorum certificate. | ||
| fn assemble( | ||
| qc_pp: &Self::QCProverParams, | ||
| signers: &BitSlice, | ||
| sigs: &[A::Signature], | ||
| ) -> Result<Self::QC, PrimitivesError>; | ||
|
|
||
| /// Checks an aggregated signature over some message provided as input | ||
| /// * `qc_vp` - public parameters for validating the QC | ||
| /// * `message` - message to check the aggregated signature against | ||
| /// * `qc` - quroum certificate | ||
| /// * `returns` - nothing if the signature is valid, an error otherwise. | ||
| fn check( | ||
| qc_vp: &Self::QCVerifierParams, | ||
| message: &GenericArray<A::MessageUnit, Self::MessageLength>, | ||
| qc: &Self::QC, | ||
| ) -> Result<(), PrimitivesError>; | ||
|
|
||
| /// Trace the list of signers given a qc. | ||
| fn trace( | ||
| qc_vp: &Self::QCVerifierParams, | ||
| message: &GenericArray<A::MessageUnit, Self::MessageLength>, | ||
| qc: &Self::QC, | ||
| ) -> Result<Vec<A::VerificationKey>, PrimitivesError>; | ||
| } | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I remember why this is here now. It's not the
Checked<T>. And it is needed.I'm even the person who requested it, I just forgot.
And I think the entire discussion motivating this was on github.
... 90 minutes of searching later...
https://github.com/EspressoSystems/hotshot-primitives/pull/27/files/907f07d85af77fee0ba1b328a77944cdce4e64d5#r1195601782
Short version: we absolutely, non-negotiably, need the
CheckedTypeif we want to be able to use this from HotShot.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks for digging this comment for us! could you clarify what would the number
CheckedType = U256signify?the number of votes inside the qc?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the case of HotShot, the total number of voted shares, I think...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added it back, see if you like c9429f0 @nyospe