From ddd57463771a559bf9ababee44ff3bc0f7f6ea57 Mon Sep 17 00:00:00 2001
From: Piotr Roslaniec
Date: Thu, 25 Jan 2024 11:20:39 +0100
Subject: [PATCH] feat(validator): add share_index field to validator
---
ferveo/benches/benchmarks/validity_checks.rs | 1 +
ferveo/examples/bench_primitives_size.rs | 1 +
ferveo/src/api.rs | 1 +
ferveo/src/bindings_python.rs | 11 ++++++++---
ferveo/src/bindings_wasm.rs | 5 +++++
ferveo/src/dkg.rs | 7 ++++---
ferveo/src/pvss.rs | 2 +-
ferveo/src/test_common.rs | 4 ++--
ferveo/src/validator.rs | 4 ++++
9 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/ferveo/benches/benchmarks/validity_checks.rs b/ferveo/benches/benchmarks/validity_checks.rs
index cc7266f7..e6a27b74 100644
--- a/ferveo/benches/benchmarks/validity_checks.rs
+++ b/ferveo/benches/benchmarks/validity_checks.rs
@@ -32,6 +32,7 @@ fn gen_validators(
.map(|i| Validator {
address: gen_address(i),
public_key: keypairs[i].public_key(),
+ share_index: i as u32,
})
.collect()
}
diff --git a/ferveo/examples/bench_primitives_size.rs b/ferveo/examples/bench_primitives_size.rs
index 79afb8a4..8f993c36 100644
--- a/ferveo/examples/bench_primitives_size.rs
+++ b/ferveo/examples/bench_primitives_size.rs
@@ -66,6 +66,7 @@ fn gen_validators(
.map(|i| Validator {
address: gen_address(i),
public_key: keypairs[i].public_key(),
+ share_index: i as u32,
})
.collect()
}
diff --git a/ferveo/src/api.rs b/ferveo/src/api.rs
index 3c2295d1..b8c0febf 100644
--- a/ferveo/src/api.rs
+++ b/ferveo/src/api.rs
@@ -425,6 +425,7 @@ mod test_ferveo_api {
.map(|(i, keypair)| Validator {
address: gen_address(i),
public_key: keypair.public_key(),
+ share_index: i as u32,
})
.collect::>();
diff --git a/ferveo/src/bindings_python.rs b/ferveo/src/bindings_python.rs
index f897c8f6..3b2d4ef0 100644
--- a/ferveo/src/bindings_python.rs
+++ b/ferveo/src/bindings_python.rs
@@ -396,8 +396,9 @@ impl Validator {
pub fn new(
address: String,
public_key: &FerveoPublicKey,
+ share_index: u32,
) -> PyResult {
- let validator = api::Validator::new(address, public_key.0)
+ let validator = api::Validator::new(address, public_key.0, share_index)
.map_err(|err| FerveoPythonError::Other(err.to_string()))?;
Ok(Self(validator))
}
@@ -756,8 +757,12 @@ mod test_ferveo_python {
.iter()
.enumerate()
.map(|(i, keypair)| {
- Validator::new(format!("0x{i:040}"), &keypair.public_key())
- .unwrap()
+ Validator::new(
+ format!("0x{i:040}"),
+ &keypair.public_key(),
+ i as u32,
+ )
+ .unwrap()
})
.collect();
diff --git a/ferveo/src/bindings_wasm.rs b/ferveo/src/bindings_wasm.rs
index a1310277..1c0d2a0b 100644
--- a/ferveo/src/bindings_wasm.rs
+++ b/ferveo/src/bindings_wasm.rs
@@ -421,6 +421,7 @@ impl EthereumAddress {
pub struct Validator {
address: EthereumAddress,
public_key: FerveoPublicKey,
+ share_index: u32,
}
#[wasm_bindgen]
@@ -429,11 +430,13 @@ impl Validator {
pub fn new(
address: &EthereumAddress,
public_key: &FerveoPublicKey,
+ share_index: u32,
) -> JsResult {
set_panic_hook();
Ok(Self {
address: address.clone(),
public_key: public_key.clone(),
+ share_index,
})
}
@@ -442,6 +445,7 @@ impl Validator {
Ok(api::Validator {
address: self.address.0.clone(),
public_key: self.public_key.0,
+ share_index: self.share_index,
})
}
@@ -610,6 +614,7 @@ pub mod test_common {
Validator {
address: gen_address(i),
public_key: keypair.public_key(),
+ share_index: i as u32,
}
}
}
diff --git a/ferveo/src/dkg.rs b/ferveo/src/dkg.rs
index e13c4894..ef5d0bf0 100644
--- a/ferveo/src/dkg.rs
+++ b/ferveo/src/dkg.rs
@@ -375,12 +375,12 @@ mod test_dkg_init {
#[test]
fn test_dkg_fail_unknown_validator() {
let rng = &mut ark_std::test_rng();
- let shares_num = 4;
- let known_keypairs = gen_keypairs(shares_num);
+ let known_keypairs = gen_keypairs(SHARES_NUM);
let unknown_keypair = ferveo_common::Keypair::::new(rng);
let unknown_validator = Validator:: {
- address: gen_address((shares_num + 1) as usize),
+ address: gen_address((SHARES_NUM + 1) as usize),
public_key: unknown_keypair.public_key(),
+ share_index: SHARES_NUM + 5, // Not in the validator set
};
let err = PubliclyVerifiableDkg::::new(
&gen_validators(&known_keypairs),
@@ -464,6 +464,7 @@ mod test_dealing {
let sender = Validator:: {
address: gen_address(unknown_validator_i as usize),
public_key: ferveo_common::Keypair::::new(rng).public_key(),
+ share_index: dkg.dkg_params.shares_num + 5, // Not in the validator set
};
// check that verification fails
assert!(dkg.verify_message(&sender, &pvss).is_err());
diff --git a/ferveo/src/pvss.rs b/ferveo/src/pvss.rs
index c8498bb7..193f3c4f 100644
--- a/ferveo/src/pvss.rs
+++ b/ferveo/src/pvss.rs
@@ -459,7 +459,7 @@ mod test_pvss {
use ark_bls12_381::Bls12_381 as EllipticCurve;
use ark_ec::AffineRepr;
use ark_ff::UniformRand;
- use rand::seq::SliceRandom;
+ use rand::prelude::SliceRandom;
use super::*;
use crate::{test_common::*, utils::is_sorted, DkgParams};
diff --git a/ferveo/src/test_common.rs b/ferveo/src/test_common.rs
index 22d072a2..21739c7e 100644
--- a/ferveo/src/test_common.rs
+++ b/ferveo/src/test_common.rs
@@ -35,6 +35,7 @@ pub fn gen_validators(keypairs: &[Keypair]) -> Vec> {
.map(|(i, keypair)| Validator {
address: gen_address(i),
public_key: keypair.public_key(),
+ share_index: i as u32,
})
.collect()
}
@@ -47,8 +48,7 @@ pub fn setup_dkg_for_n_validators(
my_validator_index: usize,
) -> TestSetup {
let keypairs = gen_keypairs(shares_num);
- let mut validators = gen_validators(keypairs.as_slice());
- validators.sort();
+ let validators = gen_validators(keypairs.as_slice());
let me = validators[my_validator_index].clone();
let dkg = PubliclyVerifiableDkg::new(
&validators,
diff --git a/ferveo/src/validator.rs b/ferveo/src/validator.rs
index d931ca06..146e62eb 100644
--- a/ferveo/src/validator.rs
+++ b/ferveo/src/validator.rs
@@ -45,6 +45,8 @@ pub struct Validator {
pub address: EthereumAddress,
/// The Public key
pub public_key: PublicKey,
+ /// The index of the validator in the given ritual
+ pub share_index: u32,
}
impl PartialOrd for Validator {
@@ -64,10 +66,12 @@ impl Validator {
pub fn new(
address: String,
public_key: PublicKey,
+ share_index: u32,
) -> Result {
Ok(Self {
address: EthereumAddress::from_str(&address)?,
public_key,
+ share_index,
})
}
}