Skip to content

Commit

Permalink
feat(dkg): relax dkg ceremony constraints using new min_shares_num pa…
Browse files Browse the repository at this point in the history
…rameter
  • Loading branch information
piotr-roslaniec committed Jan 10, 2024
1 parent 87c5f34 commit 538ea89
Show file tree
Hide file tree
Showing 9 changed files with 245 additions and 88 deletions.
36 changes: 23 additions & 13 deletions ferveo-wasm/tests/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ use wasm_bindgen_test::*;

type TestSetup = (
u32,
usize,
usize,
u32,
u32,
u32,
Vec<Keypair>,
Vec<Validator>,
ValidatorArray,
Expand All @@ -21,11 +22,13 @@ type TestSetup = (

fn setup_dkg() -> TestSetup {
let tau = 1;
let shares_num = 16;
let shares_num: u32 = 16;
let security_threshold = shares_num * 2 / 3;
let min_shares_num = shares_num;

let validator_keypairs =
(0..shares_num).map(gen_keypair).collect::<Vec<Keypair>>();
let validator_keypairs = (0..shares_num as usize)
.map(gen_keypair)
.collect::<Vec<Keypair>>();
let validators = validator_keypairs
.iter()
.enumerate()
Expand All @@ -38,8 +41,9 @@ fn setup_dkg() -> TestSetup {
let messages = validators.iter().map(|sender| {
let dkg = Dkg::new(
tau,
shares_num as u32,
security_threshold as u32,
shares_num,
min_shares_num,
security_threshold,
&validators_js,
sender,
)
Expand All @@ -54,8 +58,9 @@ fn setup_dkg() -> TestSetup {

let mut dkg = Dkg::new(
tau,
shares_num as u32,
security_threshold as u32,
shares_num,
min_shares_num,
security_threshold,
&validators_js,
&validators[0],
)
Expand All @@ -81,6 +86,7 @@ fn setup_dkg() -> TestSetup {
(
tau,
shares_num,
min_shares_num,
security_threshold,
validator_keypairs,
validators,
Expand All @@ -97,6 +103,7 @@ fn tdec_simple() {
let (
tau,
shares_num,
min_shares_num,
security_threshold,
validator_keypairs,
validators,
Expand All @@ -112,8 +119,9 @@ fn tdec_simple() {
.map(|(validator, keypair)| {
let mut dkg = Dkg::new(
tau,
shares_num as u32,
security_threshold as u32,
shares_num,
min_shares_num,
security_threshold,
&validators_js,
&validator,
)
Expand Down Expand Up @@ -151,6 +159,7 @@ fn tdec_precomputed() {
let (
tau,
shares_num,
min_shares_num,
security_threshold,
validator_keypairs,
validators,
Expand All @@ -166,8 +175,9 @@ fn tdec_precomputed() {
.map(|(validator, keypair)| {
let mut dkg = Dkg::new(
tau,
shares_num as u32,
security_threshold as u32,
shares_num,
min_shares_num,
security_threshold,
&validators_js,
&validator,
)
Expand Down
6 changes: 1 addition & 5 deletions ferveo/benches/benchmarks/validity_checks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,7 @@ fn setup_dkg(
let me = validators[validator].clone();
PubliclyVerifiableDkg::new(
&validators,
&DkgParams {
tau: 0,
security_threshold: shares_num / 3,
shares_num,
},
&DkgParams::new(0, shares_num / 3, shares_num, shares_num).unwrap(),
&me,
)
.expect("Setup failed")
Expand Down
6 changes: 1 addition & 5 deletions ferveo/examples/bench_primitives_size.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,7 @@ fn setup_dkg(
let me = validators[validator].clone();
PubliclyVerifiableDkg::new(
&validators,
&DkgParams {
tau: 0,
security_threshold,
shares_num,
},
&DkgParams::new(0, security_threshold, shares_num, shares_num).unwrap(),
&me,
)
.expect("Setup failed")
Expand Down
92 changes: 70 additions & 22 deletions ferveo/src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,15 +199,17 @@ impl Dkg {
pub fn new(
tau: u32,
shares_num: u32,
min_shares_num: u32,
security_threshold: u32,
validators: &[Validator],
me: &Validator,
) -> Result<Self> {
let dkg_params = crate::DkgParams {
let dkg_params = crate::DkgParams::new(
tau,
security_threshold,
min_shares_num,
shares_num,
};
)?;
let dkg = crate::PubliclyVerifiableDkg::<E>::new(
validators,
&dkg_params,
Expand Down Expand Up @@ -312,7 +314,7 @@ impl AggregatedTranscript {
.0
.domain
.elements()
.take(dkg.0.dkg_params.shares_num as usize)
.take(dkg.0.dkg_params.shares_num() as usize)
.collect();
self.0.make_decryption_share_simple_precomputed(
&ciphertext_header.0,
Expand Down Expand Up @@ -406,6 +408,7 @@ mod test_ferveo_api {
rng: &mut StdRng,
tau: u32,
security_threshold: u32,
min_shares_num: u32,
shares_num: u32,
) -> TestInputs {
let validator_keypairs = gen_keypairs(shares_num);
Expand All @@ -426,6 +429,7 @@ mod test_ferveo_api {
let dkg = Dkg::new(
tau,
shares_num,
min_shares_num,
security_threshold,
&validators,
sender,
Expand Down Expand Up @@ -456,16 +460,28 @@ mod test_ferveo_api {
// TODO: Refactor DKG constructor to not require security threshold or this case.
// Or figure out a different way to simplify the precomputed variant API.
let security_threshold = shares_num;
let min_shares_num = shares_num;

let (messages, validators, validator_keypairs) =
make_test_inputs(rng, tau, security_threshold, shares_num);
let (messages, validators, validator_keypairs) = make_test_inputs(
rng,
tau,
security_threshold,
min_shares_num,
shares_num,
);

// Now that every validator holds a dkg instance and a transcript for every other validator,
// every validator can aggregate the transcripts
let me = validators[0].clone();
let mut dkg =
Dkg::new(tau, shares_num, security_threshold, &validators, &me)
.unwrap();
let mut dkg = Dkg::new(
tau,
shares_num,
min_shares_num,
security_threshold,
&validators,
&me,
)
.unwrap();

let pvss_aggregated = dkg.aggregate_transcripts(&messages).unwrap();
assert!(pvss_aggregated.verify(shares_num, &messages).unwrap());
Expand All @@ -489,6 +505,7 @@ mod test_ferveo_api {
tau,
shares_num,
security_threshold,
min_shares_num,
&validators,
validator,
)
Expand Down Expand Up @@ -546,15 +563,22 @@ mod test_ferveo_api {
for shares_num in [4, 7] {
let tau = 1;
let security_threshold = shares_num / 2 + 1;
let min_shares_num = shares_num;

let (messages, validators, validator_keypairs) =
make_test_inputs(rng, tau, security_threshold, shares_num);
let (messages, validators, validator_keypairs) = make_test_inputs(
rng,
tau,
security_threshold,
min_shares_num,
shares_num,
);

// Now that every validator holds a dkg instance and a transcript for every other validator,
// every validator can aggregate the transcripts
let mut dkg = Dkg::new(
tau,
shares_num,
min_shares_num,
security_threshold,
&validators,
&validators[0],
Expand All @@ -581,6 +605,7 @@ mod test_ferveo_api {
let mut dkg = Dkg::new(
tau,
shares_num,
min_shares_num,
security_threshold,
&validators,
validator,
Expand Down Expand Up @@ -632,22 +657,34 @@ mod test_ferveo_api {
let rng = &mut StdRng::seed_from_u64(0);

let tau = 1;
let security_threshold = 3;
let shares_num = 4;
let min_shares_num = shares_num;
let security_threshold = shares_num - 1;

let (messages, validators, _) =
make_test_inputs(rng, tau, security_threshold, shares_num);
let (messages, validators, _) = make_test_inputs(
rng,
tau,
security_threshold,
min_shares_num,
shares_num,
);

// Now that every validator holds a dkg instance and a transcript for every other validator,
// every validator can aggregate the transcripts
let me = validators[0].clone();
let mut dkg =
Dkg::new(tau, shares_num, security_threshold, &validators, &me)
.unwrap();
let mut dkg = Dkg::new(
tau,
shares_num,
min_shares_num,
security_threshold,
&validators,
&me,
)
.unwrap();

let local_aggregate = dkg.aggregate_transcripts(&messages).unwrap();
assert!(local_aggregate
.verify(dkg.0.dkg_params.shares_num, &messages)
.verify(dkg.0.dkg_params.shares_num(), &messages)
.is_ok());
}

Expand All @@ -656,11 +693,17 @@ mod test_ferveo_api {
let rng = &mut StdRng::seed_from_u64(0);

let tau = 1;
let security_threshold = 3;
let shares_num = 4;
let security_threshold = shares_num - 1;
let min_shares_num = shares_num;

let (messages, _, _) =
make_test_inputs(rng, tau, security_threshold, shares_num);
let (messages, _, _) = make_test_inputs(
rng,
tau,
security_threshold,
min_shares_num,
shares_num,
);

// We only need `security_threshold` transcripts to aggregate
let messages = &messages[..security_threshold as usize];
Expand Down Expand Up @@ -688,8 +731,13 @@ mod test_ferveo_api {

// Unexpected transcripts in the aggregate or transcripts from a different ritual
// Using same DKG parameters, but different DKG instances and validators
let (bad_messages, _, _) =
make_test_inputs(rng, tau, security_threshold, shares_num);
let (bad_messages, _, _) = make_test_inputs(
rng,
tau,
security_threshold,
min_shares_num,
shares_num,
);
let mixed_messages = [&messages[..2], &bad_messages[..1]].concat();
let bad_aggregate = AggregatedTranscript::new(&mixed_messages);
let result = bad_aggregate.verify(shares_num, messages);
Expand Down
Loading

0 comments on commit 538ea89

Please sign in to comment.