Skip to content

Commit 7ed4bac

Browse files
committed
participant module incl initializer and signer
participant updated for bls base changes revise mod.rs other clippy issues more clippy issues
1 parent 4d382b9 commit 7ed4bac

File tree

18 files changed

+350
-269
lines changed

18 files changed

+350
-269
lines changed

demo/protocol-demo/src/types.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use mithril_stm::key_reg::KeyReg;
2-
use mithril_stm::stm::{
3-
Stake, StmAggrSig, StmClerk, StmInitializer, StmParameters, StmSig, StmSigner,
4-
StmVerificationKeyPoP,
1+
use mithril_stm::{
2+
key_reg::KeyReg,
3+
participant::{StmInitializer, StmSigner, StmVerificationKeyPoP},
4+
stm::{Stake, StmAggrSig, StmClerk, StmParameters, StmSig},
55
};
66

77
use blake2::{digest::consts::U32, Blake2b};

mithril-common/src/crypto_helper/cardano/key_certification.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@ use crate::{
1515
StdError, StdResult,
1616
};
1717

18-
use mithril_stm::key_reg::{ClosedKeyReg, KeyReg};
19-
use mithril_stm::stm::{Stake, StmInitializer, StmParameters, StmSigner, StmVerificationKeyPoP};
20-
use mithril_stm::RegisterError;
18+
use mithril_stm::{
19+
key_reg::{ClosedKeyReg, KeyReg},
20+
participant::{StmInitializer, StmSigner, StmVerificationKeyPoP},
21+
stm::{Stake, StmParameters},
22+
RegisterError,
23+
};
2124

2225
use crate::crypto_helper::cardano::Sum6KesBytes;
2326
use anyhow::{anyhow, Context};

mithril-common/src/crypto_helper/types/alias.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use crate::crypto_helper::cardano::{
55

66
use mithril_stm::{
77
key_reg::ClosedKeyReg,
8-
stm::{Index, Stake, StmClerk, StmParameters, StmSigner},
8+
participant::StmSigner,
9+
stm::{Index, Stake, StmClerk, StmParameters},
910
AggregationError,
1011
};
1112

@@ -32,10 +33,10 @@ pub type ProtocolParameters = StmParameters;
3233
/// Alias of [MithrilStm::Index](type@mithril_stm::stm::Index).
3334
pub type ProtocolLotteryIndex = Index;
3435

35-
/// Alias of [MithrilStm:StmSigner](struct@mithril_stm::stm::StmSigner).
36+
/// Alias of [MithrilStm:StmSigner](struct@mithril_stm::participant::StmSigner).
3637
pub type ProtocolSigner = StmSigner<D>;
3738

38-
/// Alias of a wrapper of [MithrilStm:StmInitializer](struct@mithril_stm::stm::StmInitializer).
39+
/// Alias of a wrapper of [MithrilStm:StmInitializer](struct@mithril_stm::participant::StmInitializer).
3940
pub type ProtocolInitializer = StmInitializerWrapper;
4041

4142
/// Alias of [MithrilStm:StmClerk](struct@mithril_stm::stm::StmClerk).

mithril-common/src/crypto_helper/types/protocol_key.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ mod test {
222222
crypto_helper::ProtocolKey,
223223
test_utils::{fake_keys, TempDir},
224224
};
225-
use mithril_stm::stm::StmVerificationKeyPoP;
225+
use mithril_stm::participant::StmVerificationKeyPoP;
226226
use serde::{Deserialize, Serialize};
227227

228228
static VERIFICATION_KEY: &str = fake_keys::signer_verification_key()[0];

mithril-common/src/crypto_helper/types/wrappers.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use anyhow::Context;
22
use hex::{FromHex, ToHex};
33
use kes_summed_ed25519::kes::Sum6KesSig;
4-
use mithril_stm::stm::{StmAggrSig, StmAggrVerificationKey, StmSig, StmVerificationKeyPoP};
4+
use mithril_stm::participant::StmVerificationKeyPoP;
5+
use mithril_stm::stm::{StmAggrSig, StmAggrVerificationKey, StmSig};
56

67
use crate::crypto_helper::{MKMapProof, MKProof, OpCert, ProtocolKey, ProtocolKeyCodec, D};
78
use crate::entities::BlockRange;

mithril-common/src/test_utils/fake_keys.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ pub const fn signable_manifest_signature<'a>() -> [&'a str; 2] {
158158
]
159159
}
160160

161-
/// A list of pre json hex encoded [MithrilStm:StmVerificationKeyPoP](type@mithril_stm::stm::StmVerificationKeyPoP)
161+
/// A list of pre json hex encoded [MithrilStm:StmVerificationKeyPoP](type@mithril_stm::participant::StmVerificationKeyPoP)
162162
pub const fn signer_verification_key<'a>() -> [&'a str; 4] {
163163
[
164164
"7b22766b223a5b3134352c32332c3135382c31322c3138332c3230392c33322c3134302c33372c3132342c3136\
@@ -392,7 +392,8 @@ mod test {
392392
use super::*;
393393
use ed25519_dalek::VerifyingKey;
394394
use kes_summed_ed25519::kes::Sum6KesSig;
395-
use mithril_stm::stm::{StmAggrSig, StmAggrVerificationKey, StmSig, StmVerificationKeyPoP};
395+
use mithril_stm::stm::{StmAggrSig, StmAggrVerificationKey, StmSig};
396+
use mithril_stm::participant::StmVerificationKeyPoP;
396397
use serde::{de::DeserializeOwned, Serialize};
397398
use std::any::type_name;
398399

mithril-stm/README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ The following is a simple example of the STM implementation:
6363

6464
```rust
6565
use mithril_stm::key_reg::KeyReg;
66-
use mithril_stm::stm::{StmClerk, StmInitializer, StmParameters, StmSig, StmSigner};
66+
use mithril_stm::stm::{StmClerk, StmParameters, StmSig};
67+
use mithril_stm::participant::{StmInitializer, StmSigner};
6768
use mithril_stm::AggregationError;
6869

6970
use blake2::{digest::consts::U32, Blake2b};

mithril-stm/benches/size_benches.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ use blake2::{
44
Blake2b, Digest,
55
};
66
use mithril_stm::key_reg::KeyReg;
7-
use mithril_stm::stm::{
8-
CoreVerifier, Stake, StmClerk, StmInitializer, StmParameters, StmSig, StmSigRegParty,
9-
StmSigner, StmVerificationKey,
10-
};
7+
use mithril_stm::participant::{StmInitializer, StmSigner, StmVerificationKey};
8+
use mithril_stm::stm::{CoreVerifier, Stake, StmClerk, StmParameters, StmSig, StmSigRegParty};
119
use rand_chacha::ChaCha20Rng;
1210
use rand_core::{RngCore, SeedableRng};
1311
use rayon::iter::ParallelIterator;

mithril-stm/benches/stm.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ use blake2::digest::{Digest, FixedOutput};
22
use blake2::{digest::consts::U32, Blake2b};
33
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
44
use mithril_stm::key_reg::KeyReg;
5-
use mithril_stm::stm::{
6-
CoreVerifier, Stake, StmAggrSig, StmClerk, StmInitializer, StmParameters, StmSigner,
7-
StmVerificationKey,
8-
};
5+
use mithril_stm::participant::{StmInitializer, StmSigner, StmVerificationKey};
6+
use mithril_stm::stm::{CoreVerifier, Stake, StmAggrSig, StmClerk, StmParameters};
97
use rand_chacha::ChaCha20Rng;
108
use rand_core::{RngCore, SeedableRng};
119
use rayon::prelude::*;

mithril-stm/examples/key_registration.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
//! run presented in `tests/integration.rs`, we explicitly treat each party individually.
44
use blake2::{digest::consts::U32, Blake2b};
55
use mithril_stm::key_reg::{ClosedKeyReg, KeyReg};
6-
use mithril_stm::stm::{Stake, StmClerk, StmInitializer, StmParameters, StmVerificationKeyPoP};
6+
use mithril_stm::participant::{StmInitializer, StmVerificationKeyPoP};
7+
use mithril_stm::stm::{Stake, StmClerk, StmParameters};
78

89
use rand_chacha::ChaCha20Rng;
910
use rand_core::{RngCore, SeedableRng};

mithril-stm/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,5 @@ pub mod bls_multi_signature;
2020

2121
#[cfg(not(feature = "benchmark-internals"))]
2222
mod bls_multi_signature;
23+
24+
pub mod participant;

mithril-stm/src/merkle_tree/leaf.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::bls_multi_signature::VerificationKey;
22
use crate::error::MerkleTreeError;
3-
use crate::stm::{Stake, StmVerificationKey};
3+
use crate::participant::StmVerificationKey;
4+
use crate::stm::Stake;
45
use blake2::Blake2b;
56
use digest::consts::U32;
67
use serde::{Deserialize, Serialize};
+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
use crate::bls_multi_signature::{SigningKey, VerificationKeyPoP};
2+
use crate::key_reg::{ClosedKeyReg, RegParty};
3+
use crate::participant::StmSigner;
4+
use crate::stm::{Stake, StmParameters};
5+
use crate::RegisterError;
6+
use blake2::digest::Digest;
7+
use digest::FixedOutput;
8+
use rand_core::{CryptoRng, RngCore};
9+
use serde::{Deserialize, Serialize};
10+
11+
/// Wrapper of the MultiSignature Verification key with proof of possession
12+
pub type StmVerificationKeyPoP = VerificationKeyPoP;
13+
14+
/// Initializer for `StmSigner`.
15+
/// This is the data that is used during the key registration procedure.
16+
/// Once the latter is finished, this instance is consumed into an `StmSigner`.
17+
#[derive(Debug, Clone, Serialize, Deserialize)]
18+
pub struct StmInitializer {
19+
/// This participant's stake.
20+
pub stake: Stake,
21+
/// Current protocol instantiation parameters.
22+
pub params: StmParameters,
23+
/// Secret key.
24+
pub(crate) sk: SigningKey,
25+
/// Verification (public) key + proof of possession.
26+
pub(crate) pk: StmVerificationKeyPoP,
27+
}
28+
29+
impl StmInitializer {
30+
/// Builds an `StmInitializer` that is ready to register with the key registration service.
31+
/// This function generates the signing and verification key with a PoP, and initialises the structure.
32+
pub fn setup<R: RngCore + CryptoRng>(params: StmParameters, stake: Stake, rng: &mut R) -> Self {
33+
let sk = SigningKey::gen(rng);
34+
let pk = StmVerificationKeyPoP::from(&sk);
35+
Self {
36+
stake,
37+
params,
38+
sk,
39+
pk,
40+
}
41+
}
42+
43+
/// Extract the verification key.
44+
pub fn verification_key(&self) -> StmVerificationKeyPoP {
45+
self.pk
46+
}
47+
48+
/// Build the `avk` for the given list of parties.
49+
///
50+
/// Note that if this StmInitializer was modified *between* the last call to `register`,
51+
/// then the resulting `StmSigner` may not be able to produce valid signatures.
52+
///
53+
/// Returns an `StmSigner` specialized to
54+
/// * this `StmSigner`'s ID and current stake
55+
/// * this `StmSigner`'s parameter valuation
56+
/// * the `avk` as built from the current registered parties (according to the registration service)
57+
/// * the current total stake (according to the registration service)
58+
/// # Error
59+
/// This function fails if the initializer is not registered.
60+
pub fn new_signer<D: Digest + Clone + FixedOutput>(
61+
self,
62+
closed_reg: ClosedKeyReg<D>,
63+
) -> Result<StmSigner<D>, RegisterError> {
64+
let mut my_index = None;
65+
for (i, rp) in closed_reg.reg_parties.iter().enumerate() {
66+
if rp.0 == self.pk.vk {
67+
my_index = Some(i as u64);
68+
break;
69+
}
70+
}
71+
if my_index.is_none() {
72+
return Err(RegisterError::UnregisteredInitializer);
73+
}
74+
75+
Ok(StmSigner::set_stm_signer(
76+
my_index.unwrap(),
77+
self.stake,
78+
self.params,
79+
self.sk,
80+
self.pk.vk,
81+
closed_reg,
82+
))
83+
}
84+
85+
/// Creates a new core signer that does not include closed registration.
86+
/// Takes `eligible_parties` as a parameter and determines the signer's index in the parties.
87+
/// `eligible_parties` is verified and trusted which is only run by a full-node
88+
/// that has already verified the parties.
89+
pub fn new_core_signer<D: Digest + Clone + FixedOutput>(
90+
self,
91+
eligible_parties: &[RegParty],
92+
) -> Option<StmSigner<D>> {
93+
let mut parties = eligible_parties.to_vec();
94+
parties.sort_unstable();
95+
let mut my_index = None;
96+
for (i, rp) in parties.iter().enumerate() {
97+
if rp.0 == self.pk.vk {
98+
my_index = Some(i as u64);
99+
break;
100+
}
101+
}
102+
if let Some(index) = my_index {
103+
Some(StmSigner::set_core_signer(
104+
index,
105+
self.stake,
106+
self.params,
107+
self.sk,
108+
self.pk.vk,
109+
))
110+
} else {
111+
None
112+
}
113+
}
114+
115+
/// Convert to bytes
116+
/// # Layout
117+
/// * Stake (u64)
118+
/// * Params
119+
/// * Secret Key
120+
/// * Public key (including PoP)
121+
pub fn to_bytes(&self) -> [u8; 256] {
122+
let mut out = [0u8; 256];
123+
out[..8].copy_from_slice(&self.stake.to_be_bytes());
124+
out[8..32].copy_from_slice(&self.params.to_bytes());
125+
out[32..64].copy_from_slice(&self.sk.to_bytes());
126+
out[64..].copy_from_slice(&self.pk.to_bytes());
127+
out
128+
}
129+
130+
/// Convert a slice of bytes to an `StmInitializer`
131+
/// # Error
132+
/// The function fails if the given string of bytes is not of required size.
133+
pub fn from_bytes(bytes: &[u8]) -> Result<StmInitializer, RegisterError> {
134+
let mut u64_bytes = [0u8; 8];
135+
u64_bytes.copy_from_slice(&bytes[..8]);
136+
let stake = u64::from_be_bytes(u64_bytes);
137+
let params = StmParameters::from_bytes(&bytes[8..32])?;
138+
let sk = SigningKey::from_bytes(&bytes[32..])?;
139+
let pk = StmVerificationKeyPoP::from_bytes(&bytes[64..])?;
140+
141+
Ok(Self {
142+
stake,
143+
params,
144+
sk,
145+
pk,
146+
})
147+
}
148+
}

mithril-stm/src/participant/mod.rs

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//! Mithril-stm participant including StmInitializer and StmSigner
2+
3+
mod initializer;
4+
mod signer;
5+
6+
pub use crate::participant::initializer::{StmInitializer, StmVerificationKeyPoP};
7+
pub use crate::participant::signer::{StmSigner, StmVerificationKey};

0 commit comments

Comments
 (0)