From 830cbc859b23c0bf43373bf47c18aedbb54943a2 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-python/examples/exception.py | 2 +-
ferveo-python/examples/server_api_precomputed.py | 2 +-
ferveo-python/examples/server_api_simple.py | 2 +-
ferveo-python/test/test_ferveo.py | 2 +-
ferveo-python/test/test_serialization.py | 2 +-
ferveo-wasm/examples/node/src/main.test.ts | 2 +-
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 ++++
15 files changed, 33 insertions(+), 15 deletions(-)
diff --git a/ferveo-python/examples/exception.py b/ferveo-python/examples/exception.py
index 4e16aea9..daa067b7 100644
--- a/ferveo-python/examples/exception.py
+++ b/ferveo-python/examples/exception.py
@@ -16,7 +16,7 @@ def gen_eth_addr(i: int) -> str:
validator_keypairs = [Keypair.random() for _ in range(0, shares_num)]
validators = [
- Validator(gen_eth_addr(i), keypair.public_key())
+ Validator(gen_eth_addr(i), keypair.public_key(), i)
for i, keypair in enumerate(validator_keypairs)
]
diff --git a/ferveo-python/examples/server_api_precomputed.py b/ferveo-python/examples/server_api_precomputed.py
index 7c433e96..72263405 100644
--- a/ferveo-python/examples/server_api_precomputed.py
+++ b/ferveo-python/examples/server_api_precomputed.py
@@ -21,7 +21,7 @@ def gen_eth_addr(i: int) -> str:
validator_keypairs = [Keypair.random() for _ in range(0, shares_num)]
validators = [
- Validator(gen_eth_addr(i), keypair.public_key())
+ Validator(gen_eth_addr(i), keypair.public_key(), i)
for i, keypair in enumerate(validator_keypairs)
]
diff --git a/ferveo-python/examples/server_api_simple.py b/ferveo-python/examples/server_api_simple.py
index 4f9e8447..5fd2c8e5 100644
--- a/ferveo-python/examples/server_api_simple.py
+++ b/ferveo-python/examples/server_api_simple.py
@@ -19,7 +19,7 @@ def gen_eth_addr(i: int) -> str:
shares_num = 4
validator_keypairs = [Keypair.random() for _ in range(0, shares_num)]
validators = [
- Validator(gen_eth_addr(i), keypair.public_key())
+ Validator(gen_eth_addr(i), keypair.public_key(), i)
for i, keypair in enumerate(validator_keypairs)
]
diff --git a/ferveo-python/test/test_ferveo.py b/ferveo-python/test/test_ferveo.py
index 6f00b6df..b3496d3e 100644
--- a/ferveo-python/test/test_ferveo.py
+++ b/ferveo-python/test/test_ferveo.py
@@ -44,7 +44,7 @@ def scenario_for_variant(variant: FerveoVariant, shares_num, threshold, shares_t
tau = 1
validator_keypairs = [Keypair.random() for _ in range(0, shares_num)]
validators = [
- Validator(gen_eth_addr(i), keypair.public_key())
+ Validator(gen_eth_addr(i), keypair.public_key(), i)
for i, keypair in enumerate(validator_keypairs)
]
validators.sort(key=lambda v: v.address)
diff --git a/ferveo-python/test/test_serialization.py b/ferveo-python/test/test_serialization.py
index 57032c6a..6c600771 100644
--- a/ferveo-python/test/test_serialization.py
+++ b/ferveo-python/test/test_serialization.py
@@ -17,7 +17,7 @@ def gen_eth_addr(i: int) -> str:
shares_num = 4
validator_keypairs = [Keypair.random() for _ in range(shares_num)]
validators = [
- Validator(gen_eth_addr(i), keypair.public_key())
+ Validator(gen_eth_addr(i), keypair.public_key(), i)
for i, keypair in enumerate(validator_keypairs)
]
validators.sort(key=lambda v: v.address)
diff --git a/ferveo-wasm/examples/node/src/main.test.ts b/ferveo-wasm/examples/node/src/main.test.ts
index 047beeb5..5814a53d 100644
--- a/ferveo-wasm/examples/node/src/main.test.ts
+++ b/ferveo-wasm/examples/node/src/main.test.ts
@@ -29,7 +29,7 @@ function setupTest(sharesNum :number, threshold: number) {
for (let i = 0; i < sharesNum; i++) {
const keypair = Keypair.random();
validatorKeypairs.push(keypair);
- const validator = new Validator(genEthAddr(i), keypair.publicKey);
+ const validator = new Validator(genEthAddr(i), keypair.publicKey, i);
validators.push(validator);
}
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,
})
}
}