Skip to content

Commit 37de42e

Browse files
committed
MembershipDigest - benches and common not working
1 parent 0b91522 commit 37de42e

File tree

18 files changed

+122
-92
lines changed

18 files changed

+122
-92
lines changed

mithril-stm/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ use rayon::prelude::*;
6969

7070
use mithril_stm::{
7171
AggregateSignatureType, AggregationError, Clerk, Initializer, KeyRegistration, Parameters,
72-
Signer, SingleSignature,
72+
Signer, SingleSignature, CustomMembershipDigest
7373
};
7474

75-
type H = Blake2b<U32>;
75+
type H = CustomMembershipDigest;
7676

7777
let nparties = 32;
7878
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);

mithril-stm/examples/key_registration.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,19 @@ use rand_chacha::ChaCha20Rng;
66
use rand_core::{RngCore, SeedableRng};
77

88
use mithril_stm::{
9-
AggregateSignatureType, Clerk, ClosedKeyRegistration, Initializer, KeyRegistration, Parameters,
10-
Stake, VerificationKeyProofOfPossession,
9+
AggregateSignatureType, Clerk, ClosedKeyRegistration, Initializer, KeyRegistration,
10+
MembershipDigest, Parameters, Stake, VerificationKeyProofOfPossession,
1111
};
1212

13-
type H = Blake2b<U32>;
13+
#[derive(Clone, Debug)]
14+
pub struct CustomMembershipDigest {}
15+
impl MembershipDigest for CustomMembershipDigest {
16+
type ConcatenationHash = Blake2b<U32>;
17+
#[cfg(feature = "future_snark")]
18+
type SnarkHash = Blake2b<U32>;
19+
}
20+
21+
type H = CustomMembershipDigest;
1422

1523
fn main() {
1624
let nparties = 4;

mithril-stm/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
//!
1616
//! use mithril_stm::{
1717
//! AggregateSignatureType, AggregationError, Clerk, Initializer, KeyRegistration, Parameters,
18-
//! Signer, SingleSignature,
18+
//! Signer, SingleSignature, CustomMembershipDigest
1919
//! };
2020
//!
2121
//! let nparties = 4; // Use a small number of parties for this example
22-
//! type D = Blake2b<U32>; // Setting the hash function for convenience
22+
//! type D = CustomMembershipDigest; // Setting the hash function for convenience
2323
//!
2424
//! let mut rng = ChaCha20Rng::from_seed([0u8; 32]); // create and initialize rng
2525
//! let mut msg = [0u8; 16]; // setting an arbitrary message
@@ -116,6 +116,7 @@ mod proof_system;
116116
mod protocol;
117117
mod signature_scheme;
118118

119+
pub use membership_commitment::{CustomMembershipDigest, MembershipDigest};
119120
pub use protocol::*;
120121
pub use signature_scheme::BlsSignatureError;
121122

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
11
mod merkle_tree;
22

33
pub use merkle_tree::*;
4+
5+
use blake2::{Blake2b, digest::consts::U32};
6+
use digest::{Digest, FixedOutput};
7+
use std::fmt::Debug;
8+
9+
pub trait MembershipDigest: Send + Sync {
10+
type ConcatenationHash: Digest + FixedOutput + Clone + Debug;
11+
#[cfg(feature = "future_snark")]
12+
type SnarkHash: Digest + FixedOutput + Clone;
13+
}
14+
15+
/// Only for tests
16+
#[derive(Clone, Debug)]
17+
pub struct CustomMembershipDigest {}
18+
19+
impl MembershipDigest for CustomMembershipDigest {
20+
type ConcatenationHash = Blake2b<U32>;
21+
#[cfg(feature = "future_snark")]
22+
type SnarkHash = Blake2b<U32>;
23+
}

mithril-stm/src/proof_system/concatenation.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use anyhow::Context;
2-
use blake2::digest::{Digest, FixedOutput};
32
use serde::{Deserialize, Serialize};
43

54
use crate::{
65
AggregateSignatureError, AggregateVerificationKey, BasicVerifier, Clerk, Parameters,
76
RegisteredParty, SingleSignature, SingleSignatureWithRegisteredParty, StmResult,
8-
membership_commitment::MerkleBatchPath,
7+
membership_commitment::{MembershipDigest, MerkleBatchPath},
98
signature_scheme::{BlsSignature, BlsVerificationKey},
109
};
1110

@@ -14,16 +13,16 @@ use crate::{
1413
/// BatchPath is also a part of the aggregate signature which covers path for all signatures.
1514
#[derive(Debug, Clone, Serialize, Deserialize)]
1615
#[serde(bound(
17-
serialize = "MerkleBatchPath<D>: Serialize",
18-
deserialize = "MerkleBatchPath<D>: Deserialize<'de>"
16+
serialize = "MerkleBatchPath<D::ConcatenationHash>: Serialize",
17+
deserialize = "MerkleBatchPath<D::ConcatenationHash>: Deserialize<'de>"
1918
))]
20-
pub struct ConcatenationProof<D: Clone + Digest + FixedOutput> {
19+
pub struct ConcatenationProof<D: MembershipDigest> {
2120
pub(crate) signatures: Vec<SingleSignatureWithRegisteredParty>,
2221
/// The list of unique merkle tree nodes that covers path for all signatures.
23-
pub batch_proof: MerkleBatchPath<D>,
22+
pub batch_proof: MerkleBatchPath<D::ConcatenationHash>,
2423
}
2524

26-
impl<D: Clone + Digest + FixedOutput + Send + Sync> ConcatenationProof<D> {
25+
impl<D: MembershipDigest> ConcatenationProof<D> {
2726
/// Aggregate a set of signatures for their corresponding indices.
2827
///
2928
/// This function first deduplicates the repeated signatures, and if there are enough signatures, it collects the merkle tree indexes of unique signatures.

mithril-stm/src/protocol/aggregate_signature/aggregate_key.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
1-
use blake2::digest::{Digest, FixedOutput};
21
use serde::{Deserialize, Serialize};
32

43
use crate::{
54
ClosedKeyRegistration, Stake,
6-
membership_commitment::{MerkleBatchPath, MerkleTreeBatchCommitment},
5+
membership_commitment::{MembershipDigest, MerkleBatchPath, MerkleTreeBatchCommitment},
76
};
87

98
/// Stm aggregate key (batch compatible), which contains the merkle tree commitment and the total stake of the system.
109
/// Batch Compat Merkle tree commitment includes the number of leaves in the tree in order to obtain batch path.
1110
#[derive(Debug, Clone, Serialize, Deserialize)]
1211
#[serde(bound(
13-
serialize = "MerkleBatchPath<D>: Serialize",
14-
deserialize = "MerkleBatchPath<D>: Deserialize<'de>"
12+
serialize = "MerkleBatchPath<D::ConcatenationHash>: Serialize",
13+
deserialize = "MerkleBatchPath<D::ConcatenationHash>: Deserialize<'de>"
1514
))]
16-
pub struct AggregateVerificationKey<D: Clone + Digest + FixedOutput> {
17-
mt_commitment: MerkleTreeBatchCommitment<D>,
15+
pub struct AggregateVerificationKey<D: MembershipDigest> {
16+
mt_commitment: MerkleTreeBatchCommitment<D::ConcatenationHash>,
1817
total_stake: Stake,
1918
}
2019

21-
impl<D: Digest + Clone + FixedOutput> AggregateVerificationKey<D> {
22-
pub(crate) fn get_merkle_tree_batch_commitment(&self) -> MerkleTreeBatchCommitment<D> {
20+
impl<D: MembershipDigest> AggregateVerificationKey<D> {
21+
pub(crate) fn get_merkle_tree_batch_commitment(
22+
&self,
23+
) -> MerkleTreeBatchCommitment<D::ConcatenationHash> {
2324
self.mt_commitment.clone()
2425
}
2526

2627
#[deprecated(
2728
since = "0.5.0",
2829
note = "Use `get_merkle_tree_batch_commitment` instead"
2930
)]
30-
pub fn get_mt_commitment(&self) -> MerkleTreeBatchCommitment<D> {
31+
pub fn get_mt_commitment(&self) -> MerkleTreeBatchCommitment<D::ConcatenationHash> {
3132
Self::get_merkle_tree_batch_commitment(self)
3233
}
3334

@@ -36,17 +37,15 @@ impl<D: Digest + Clone + FixedOutput> AggregateVerificationKey<D> {
3637
}
3738
}
3839

39-
impl<D: Digest + Clone + FixedOutput> PartialEq for AggregateVerificationKey<D> {
40+
impl<D: MembershipDigest> PartialEq for AggregateVerificationKey<D> {
4041
fn eq(&self, other: &Self) -> bool {
4142
self.mt_commitment == other.mt_commitment && self.total_stake == other.total_stake
4243
}
4344
}
4445

45-
impl<D: Digest + Clone + FixedOutput> Eq for AggregateVerificationKey<D> {}
46+
impl<D: MembershipDigest> Eq for AggregateVerificationKey<D> {}
4647

47-
impl<D: Clone + Digest + FixedOutput> From<&ClosedKeyRegistration<D>>
48-
for AggregateVerificationKey<D>
49-
{
48+
impl<D: MembershipDigest> From<&ClosedKeyRegistration<D>> for AggregateVerificationKey<D> {
5049
fn from(reg: &ClosedKeyRegistration<D>) -> Self {
5150
Self {
5251
mt_commitment: reg.merkle_tree.to_merkle_tree_batch_commitment(),

mithril-stm/src/protocol/aggregate_signature/clerk.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use anyhow::Context;
2-
use blake2::digest::{Digest, FixedOutput};
32

43
#[cfg(feature = "future_snark")]
54
use anyhow::anyhow;
@@ -9,7 +8,7 @@ use super::AggregationError;
98

109
use crate::{
1110
ClosedKeyRegistration, Index, Parameters, Signer, SingleSignature, Stake, StmResult,
12-
VerificationKey, proof_system::ConcatenationProof,
11+
VerificationKey, membership_commitment::MembershipDigest, proof_system::ConcatenationProof,
1312
};
1413

1514
use super::{AggregateSignature, AggregateSignatureType, AggregateVerificationKey};
@@ -18,12 +17,12 @@ use super::{AggregateSignature, AggregateSignatureType, AggregateVerificationKey
1817
/// Clerks can only be generated with the registration closed.
1918
/// This avoids that a Merkle Tree is computed before all parties have registered.
2019
#[derive(Debug, Clone)]
21-
pub struct Clerk<D: Clone + Digest> {
20+
pub struct Clerk<D: MembershipDigest> {
2221
pub(crate) closed_reg: ClosedKeyRegistration<D>,
2322
pub(crate) params: Parameters,
2423
}
2524

26-
impl<D: Digest + Clone + FixedOutput + Send + Sync> Clerk<D> {
25+
impl<D: MembershipDigest + Clone> Clerk<D> {
2726
/// Create a new `Clerk` from a closed registration instance.
2827
pub fn new_clerk_from_closed_key_registration(
2928
params: &Parameters,

mithril-stm/src/protocol/aggregate_signature/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ pub use signature::*;
1212

1313
#[cfg(test)]
1414
mod tests {
15-
use blake2::{Blake2b, digest::consts::U32};
1615
use proptest::{
1716
collection::{hash_map, vec},
1817
prelude::*,
@@ -25,15 +24,16 @@ mod tests {
2524
use crate::{
2625
Initializer, KeyRegistration, Parameters, Signer, SingleSignature,
2726
SingleSignatureWithRegisteredParty, Stake, StmResult,
28-
membership_commitment::MerkleBatchPath, signature_scheme::BlsVerificationKey,
27+
membership_commitment::{CustomMembershipDigest, MerkleBatchPath},
28+
signature_scheme::BlsVerificationKey,
2929
};
3030

3131
use super::{
3232
AggregateSignature, AggregateSignatureType, AggregationError, BasicVerifier, Clerk,
3333
};
3434

3535
type Sig = AggregateSignature<D>;
36-
type D = Blake2b<U32>;
36+
type D = CustomMembershipDigest;
3737

3838
fn setup_equal_parties(params: Parameters, nparties: usize) -> Vec<Signer<D>> {
3939
let stake = vec![1; nparties];

mithril-stm/src/protocol/aggregate_signature/signature.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use std::{collections::HashMap, fmt::Display, hash::Hash, str::FromStr};
22

33
use anyhow::anyhow;
4-
use blake2::digest::{Digest, FixedOutput};
54
use serde::{Deserialize, Serialize};
65

76
use crate::{
8-
Parameters, StmError, StmResult, membership_commitment::MerkleBatchPath,
7+
MembershipDigest, Parameters, StmError, StmResult, membership_commitment::MerkleBatchPath,
98
proof_system::ConcatenationProof,
109
};
1110

@@ -47,9 +46,7 @@ impl AggregateSignatureType {
4746
}
4847
}
4948

50-
impl<D: Clone + Digest + FixedOutput + Send + Sync> From<&AggregateSignature<D>>
51-
for AggregateSignatureType
52-
{
49+
impl<D: MembershipDigest> From<&AggregateSignature<D>> for AggregateSignatureType {
5350
fn from(aggr_sig: &AggregateSignature<D>) -> Self {
5451
match aggr_sig {
5552
AggregateSignature::Concatenation(_) => AggregateSignatureType::Concatenation,
@@ -85,10 +82,10 @@ impl Display for AggregateSignatureType {
8582
/// An STM aggregate signature.
8683
#[derive(Debug, Clone, Serialize, Deserialize)]
8784
#[serde(bound(
88-
serialize = "MerkleBatchPath<D>: Serialize",
89-
deserialize = "MerkleBatchPath<D>: Deserialize<'de>"
85+
serialize = "MerkleBatchPath<D::ConcatenationHash>: Serialize",
86+
deserialize = "MerkleBatchPath<D::ConcatenationHash>: Deserialize<'de>"
9087
))]
91-
pub enum AggregateSignature<D: Clone + Digest + FixedOutput + Send + Sync> {
88+
pub enum AggregateSignature<D: MembershipDigest> {
9289
/// A future proof system.
9390
#[cfg(feature = "future_snark")]
9491
Future,
@@ -101,7 +98,7 @@ pub enum AggregateSignature<D: Clone + Digest + FixedOutput + Send + Sync> {
10198
Concatenation(ConcatenationProof<D>),
10299
}
103100

104-
impl<D: Clone + Digest + FixedOutput + Send + Sync> AggregateSignature<D> {
101+
impl<D: MembershipDigest + Clone> AggregateSignature<D> {
105102
/// Verify an aggregate signature
106103
pub fn verify(
107104
&self,
@@ -219,17 +216,17 @@ mod tests {
219216
}
220217

221218
mod aggregate_signature_golden_concatenation {
222-
use blake2::{Blake2b, digest::consts::U32};
223219
use rand_chacha::ChaCha20Rng;
224220
use rand_core::SeedableRng;
225221

226222
use super::{AggregateSignature, AggregateSignatureType};
227223
use crate::{
228224
Clerk, ClosedKeyRegistration, KeyRegistration, Parameters, Signer,
225+
membership_commitment::CustomMembershipDigest,
229226
signature_scheme::{BlsSigningKey, BlsVerificationKeyProofOfPossession},
230227
};
231228

232-
type D = Blake2b<U32>;
229+
type D = CustomMembershipDigest;
233230

234231
const GOLDEN_JSON: &str = r#"
235232
{

mithril-stm/src/protocol/key_registration.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ use std::{
55
};
66

77
use anyhow::anyhow;
8-
use blake2::digest::{Digest, FixedOutput};
98

109
use crate::{
1110
RegisterError, Stake, StmResult,
12-
membership_commitment::{MerkleTree, MerkleTreeLeaf},
11+
membership_commitment::{MembershipDigest, MerkleTree, MerkleTreeLeaf},
1312
signature_scheme::{BlsVerificationKey, BlsVerificationKeyProofOfPossession},
1413
};
1514

@@ -51,7 +50,7 @@ impl KeyRegistration {
5150
/// This function disables `KeyReg::register`, consumes the instance of `self`, and returns a `ClosedKeyRegistration`.
5251
pub fn close<D>(self) -> ClosedKeyRegistration<D>
5352
where
54-
D: Digest + FixedOutput,
53+
D: MembershipDigest,
5554
{
5655
let mut total_stake: Stake = 0;
5756
let mut reg_parties = self
@@ -79,23 +78,22 @@ impl KeyRegistration {
7978
/// Structure generated out of a closed registration containing the registered parties, total stake, and the merkle tree.
8079
/// One can only get a global `avk` out of a closed key registration.
8180
#[derive(Clone, Debug, PartialEq, Eq)]
82-
pub struct ClosedKeyRegistration<D: Digest> {
81+
pub struct ClosedKeyRegistration<D: MembershipDigest> {
8382
/// Ordered list of registered parties.
8483
pub reg_parties: Vec<RegisteredParty>,
8584
/// Total stake of the registered parties.
8685
pub total_stake: Stake,
8786
/// Unique public key out of the key registration instance.
88-
pub merkle_tree: Arc<MerkleTree<D>>,
87+
pub merkle_tree: Arc<MerkleTree<D::ConcatenationHash>>,
8988
}
9089

9190
#[cfg(test)]
9291
mod tests {
93-
use blake2::{Blake2b, digest::consts::U32};
9492
use proptest::{collection::vec, prelude::*};
9593
use rand_chacha::ChaCha20Rng;
9694
use rand_core::SeedableRng;
9795

98-
use crate::signature_scheme::BlsSigningKey;
96+
use crate::{membership_commitment::CustomMembershipDigest, signature_scheme::BlsSigningKey};
9997

10098
use super::*;
10199

@@ -148,7 +146,7 @@ mod tests {
148146
}
149147
}
150148
if !kr.keys.is_empty() {
151-
let closed = kr.close::<Blake2b<U32>>();
149+
let closed = kr.close::<CustomMembershipDigest>();
152150
let retrieved_keys = closed.reg_parties.iter().map(|r| (r.0, r.1)).collect::<HashMap<_,_>>();
153151
assert!(retrieved_keys == keys);
154152
}

0 commit comments

Comments
 (0)