Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Select validators for jumpstart DKG #1053

Merged
merged 32 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
c515a98
Select validators based on block number when doing initial DKG
ameba23 Sep 13, 2024
8c198a5
Error handling
ameba23 Sep 13, 2024
7f64bbd
Tidy
ameba23 Sep 13, 2024
6c493ed
Comments
ameba23 Sep 13, 2024
3da3e69
Select jumpstart validators when handling jumpstart extrinsic
ameba23 Sep 16, 2024
c2534db
OcwMessageDkg no longer includes signature request account
ameba23 Sep 16, 2024
960ad7d
Update propagation pallet
ameba23 Sep 16, 2024
bb69aec
Update metadata
ameba23 Sep 16, 2024
44e7f51
DKG session id no longer contains signature request account
ameba23 Sep 16, 2024
02075b3
Handle validating selected validators on jumpstart on TSS
ameba23 Sep 16, 2024
42ceb07
Lockfile
ameba23 Sep 16, 2024
9c52270
Tidy
ameba23 Sep 16, 2024
35b7068
Tests for registry pallet
ameba23 Sep 16, 2024
5235481
Tidy
ameba23 Sep 16, 2024
bf0a608
Add alloc feature to rand
ameba23 Sep 16, 2024
4fa98a4
Update entropy-protocol tests
ameba23 Sep 16, 2024
ad8702b
Update registry benchmarks
ameba23 Sep 16, 2024
a8c96e3
Recalculate registry weights
ameba23 Sep 16, 2024
7e026e3
Update test helper for mocking jumpstart
ameba23 Sep 16, 2024
b78f6b7
Fix jumpstart network test
ameba23 Sep 16, 2024
dde7d20
Fix registry pallet tests
ameba23 Sep 16, 2024
87e9a82
Update TSS bad siging participant test
ameba23 Sep 16, 2024
a9f06e2
Update propagation pallet test
ameba23 Sep 17, 2024
a12525f
Changelog
ameba23 Sep 17, 2024
cad4347
Update registry weights
ameba23 Sep 17, 2024
5ecf047
Merge master
ameba23 Sep 17, 2024
cd5df2d
Update registry benchmarks
ameba23 Sep 18, 2024
851e329
Add comment following review
ameba23 Sep 18, 2024
e22f902
Fix getting newest value from jumpstart dkg storage map and add test
ameba23 Sep 18, 2024
19457cf
Update pallets/registry/src/benchmarking.rs
HCastano Sep 18, 2024
243ddd9
Comment following review
ameba23 Sep 19, 2024
bebd86b
Merge branch 'peg/select-initial-validators' of github.com:entropyxyz…
ameba23 Sep 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/threshold-signature-server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ thiserror ="1.0.63"
blake2 ="0.10.4"
x25519-dalek ={ version="2.0.1", features=["static_secrets"] }
rand_core ="0.6.4"
rand ="0.8.5"
zeroize ="1.8.1"
hex ="0.4.3"
reqwest-eventsource="0.6"
Expand Down
60 changes: 58 additions & 2 deletions crates/threshold-signature-server/src/user/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ use futures::{
};
use num::{bigint::BigInt, FromPrimitive, Num, ToPrimitive};
use parity_scale_codec::{Decode, DecodeAll, Encode};
use rand::{seq::SliceRandom, SeedableRng};
use rand_core::OsRng;
use serde::{Deserialize, Serialize};
use sp_core::{crypto::AccountId32, H256};
use subxt::{
Expand All @@ -55,6 +57,7 @@ use subxt::{
Config, OnlineClient,
};
use synedrion::ThresholdKeyShare;
use tokio::select;
use tracing::instrument;
use x25519_dalek::StaticSecret;
use zeroize::Zeroize;
Expand Down Expand Up @@ -262,7 +265,7 @@ pub async fn generate_network_key(
State(app_state): State<AppState>,
encoded_data: Bytes,
) -> Result<StatusCode, UserErr> {
let data = OcwMessageDkg::decode(&mut encoded_data.as_ref())?;
let mut data = OcwMessageDkg::decode(&mut encoded_data.as_ref())?;
tracing::Span::current().record("block_number", data.block_number);

if data.sig_request_accounts.is_empty() {
Expand All @@ -273,8 +276,10 @@ pub async fn generate_network_key(
let rpc = get_rpc(&app_state.configuration.endpoint).await?;
let (signer, x25519_secret_key) = get_signer_and_x25519_secret(&app_state.kv_store).await?;

let selected_validators = get_jumpstart_validators(&api, &rpc, data.block_number).await?;

let in_registration_group =
check_in_registration_group(&data.validators_info, signer.account_id());
check_in_registration_group(&selected_validators, signer.account_id());

if in_registration_group.is_err() {
tracing::warn!(
Expand All @@ -286,6 +291,8 @@ pub async fn generate_network_key(
return Ok(StatusCode::MISDIRECTED_REQUEST);
}

// Use selected validators rather than the validators from the HTTP request
data.validators_info = selected_validators;
validate_jump_start(&data, &api, &rpc, &app_state.kv_store).await?;

// Do the DKG protocol in another task, so we can already respond
Expand All @@ -300,6 +307,55 @@ pub async fn generate_network_key(
Ok(StatusCode::OK)
}

/// Deterministically select n initial signers from validator set using block number
async fn get_jumpstart_validators(
api: &OnlineClient<EntropyConfig>,
rpc: &LegacyRpcMethods<EntropyConfig>,
block_number: u32,
) -> Result<Vec<entropy_shared::ValidatorInfo>, UserErr> {
// Get n from parameters
let n = {
let total_signers_query = entropy::storage().parameters().signers_info();
let signers_info =
query_chain(api, rpc, total_signers_query, None).await?.ok_or_else(|| {
UserErr::OptionUnwrapError(
"Cannot get signer info from parameters pallet".to_string(),
)
})?;
signers_info.total_signers
};

// Get all validators
let all_validators = {
let validators_query = entropy::storage().session().validators();
query_chain(api, rpc, validators_query, None).await?.ok_or_else(|| {
UserErr::OptionUnwrapError("Cannot get validators info from session pallet".to_string())
})?
};

// Select n validators
let mut rng = rand::rngs::StdRng::seed_from_u64(block_number.into());
let selected_validators: Vec<_> =
all_validators.choose_multiple(&mut rng, n.into()).cloned().collect();
ameba23 marked this conversation as resolved.
Show resolved Hide resolved

// Get validator info for selected validators
let mut validators_info: Vec<_> = vec![];
for validator_address in selected_validators {
let validator_query =
entropy::storage().staking_extension().threshold_servers(validator_address);
let server_info = query_chain(api, rpc, validator_query, None).await?.ok_or_else(|| {
UserErr::OptionUnwrapError("Cannot get server info for selected TS server".to_string())
})?;
validators_info.push(entropy_shared::ValidatorInfo {
x25519_public_key: server_info.x25519_public_key,
ip_address: server_info.endpoint,
tss_account: server_info.tss_account.0.to_vec(),
});
}

Ok(validators_info)
}

/// Setup and execute DKG.
///
/// Called internally by the [generate_network_key] function.
Expand Down
14 changes: 9 additions & 5 deletions crates/threshold-signature-server/src/user/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -714,11 +714,15 @@ async fn test_jumpstart_network() {

let alice = AccountKeyring::Alice;

let cxt = test_context_stationary().await;
let add_parent_key = false;
let (_validator_ips, _validator_ids) =
spawn_testing_validators(false, ChainSpecType::Development).await;
let api = get_api(&cxt.node_proc.ws_url).await.unwrap();
let rpc = get_rpc(&cxt.node_proc.ws_url).await.unwrap();
spawn_testing_validators(add_parent_key, ChainSpecType::Integration).await;

let force_authoring = true;
let substrate_context = test_node_process_testing_state(force_authoring).await;

let api = get_api(&substrate_context.ws_url).await.unwrap();
let rpc = get_rpc(&substrate_context.ws_url).await.unwrap();

let client = reqwest::Client::new();

Expand Down Expand Up @@ -753,7 +757,7 @@ async fn test_jumpstart_network() {

// succeeds
let response_results = join_all(
vec![3002, 3003]
vec![3002, 3003, 3004]
.iter()
.map(|port| {
client
Expand Down
Loading