Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions rs/consensus/dkg/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ use std::{
pub mod dkg_key_manager;
pub mod payload_builder;
pub mod payload_validator;
#[allow(dead_code)]
Comment thread
eichhorl marked this conversation as resolved.
pub(crate) mod remote;

pub use crate::utils::get_vetkey_public_keys;

Expand Down
152 changes: 50 additions & 102 deletions rs/consensus/dkg/src/payload_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -810,20 +810,33 @@ fn process_reshare_chain_key_contexts(
continue;
};

match create_remote_dkg_config_for_key_id(
key_id,
let dkg_id = NiDkgId {
start_block_height,
this_subnet_id,
context.target_id,
&context.nodes,
reshared_transcripts,
dealer_subnet: this_subnet_id,
dkg_tag: NiDkgTag::HighThresholdForKey(key_id),
target_subnet: NiDkgTargetSubnet::Remote(context.target_id),
};
let Some(resharing_transcript) = reshared_transcripts.get(&dkg_id.dkg_tag).cloned() else {
let err = format!(
"Failed to find resharing transcript for a remote dkg for tag {:?}",
&dkg_id.dkg_tag
);
errors.push((dkg_id, err));
continue;
};

match create_remote_dkg_config(
dkg_id.clone(),
resharing_transcript.committee.get().clone(),
context.nodes.clone(),
&context.registry_version,
Some(resharing_transcript),
) {
Ok(config) => {
new_configs.push(vec![config]);
valid_target_ids.push(context.target_id);
}
Err(err) => errors.push(*err),
Err(err) => errors.push((dkg_id, format!("{err:?}"))),
}
}
(new_configs, errors, valid_target_ids)
Expand Down Expand Up @@ -865,8 +878,8 @@ fn process_setup_initial_dkg_contexts(
start_block_height,
this_subnet_id,
context.target_id,
&dealers,
&context.nodes_in_target_subnet,
dealers,
context.nodes_in_target_subnet.clone(),
&context.registry_version,
logger,
) {
Expand All @@ -880,7 +893,7 @@ fn process_setup_initial_dkg_contexts(
Ok((new_configs, errors, valid_target_ids))
}

fn get_node_list(
pub(crate) fn get_node_list(
subnet_id: SubnetId,
registry_client: &dyn RegistryClient,
registry_version: RegistryVersion,
Expand Down Expand Up @@ -948,12 +961,12 @@ fn add_callback_ids_to_transcript_results(
/// This function is called on each entry on the SetupInitialDkgContext. It returns
/// either the created high and low configs for the entry or returns two errors
/// identified by the NiDkgId.
fn create_low_high_remote_dkg_configs(
pub(crate) fn create_low_high_remote_dkg_configs(
start_block_height: Height,
dealer_subnet: SubnetId,
target_subnet: NiDkgTargetId,
dealers: &BTreeSet<NodeId>,
receivers: &BTreeSet<NodeId>,
dealers: BTreeSet<NodeId>,
receivers: BTreeSet<NodeId>,
registry_version: &RegistryVersion,
logger: &ReplicaLogger,
) -> Result<(NiDkgConfig, NiDkgConfig), Vec<(NiDkgId, String)>> {
Expand All @@ -973,8 +986,8 @@ fn create_low_high_remote_dkg_configs(

let low_thr_config = create_remote_dkg_config(
low_thr_dkg_id.clone(),
dealers,
receivers,
dealers.clone(),
receivers.clone(),
registry_version,
None,
);
Expand Down Expand Up @@ -1014,45 +1027,10 @@ fn create_low_high_remote_dkg_configs(
}
}

fn create_remote_dkg_config_for_key_id(
key_id: NiDkgMasterPublicKeyId,
start_block_height: Height,
dealer_subnet: SubnetId,
target_id: NiDkgTargetId,
receivers: &BTreeSet<NodeId>,
reshared_transcripts: &BTreeMap<NiDkgTag, NiDkgTranscript>,
registry_version: &RegistryVersion,
) -> Result<NiDkgConfig, Box<(NiDkgId, String)>> {
let dkg_id = NiDkgId {
start_block_height,
dealer_subnet,
dkg_tag: NiDkgTag::HighThresholdForKey(key_id),
target_subnet: NiDkgTargetSubnet::Remote(target_id),
};

// Find the resharing transcript corresponding to the remote dkg id
let Some(resharing_transcript) = reshared_transcripts.get(&dkg_id.dkg_tag) else {
let err = format!(
"Failed to find resharing transcript for a remote dkg for tag {:?}",
&dkg_id.dkg_tag
);
return Err(Box::new((dkg_id, err)));
};

create_remote_dkg_config(
dkg_id.clone(),
resharing_transcript.committee.get(),
receivers,
registry_version,
Some(resharing_transcript.clone()),
)
.map_err(|err| Box::new((dkg_id, format!("{err:?}"))))
}

fn create_remote_dkg_config(
pub(crate) fn create_remote_dkg_config(
dkg_id: NiDkgId,
dealers: &BTreeSet<NodeId>,
receivers: &BTreeSet<NodeId>,
dealers: BTreeSet<NodeId>,
receivers: BTreeSet<NodeId>,
registry_version: &RegistryVersion,
resharing_transcript: Option<NiDkgTranscript>,
) -> Result<NiDkgConfig, NiDkgConfigValidationError> {
Expand All @@ -1063,16 +1041,22 @@ fn create_remote_dkg_config(
dkg_id,
max_corrupt_dealers: NumberOfNodes::from(get_faults_tolerated(dealers.len()) as u32),
max_corrupt_receivers: NumberOfNodes::from(get_faults_tolerated(receivers.len()) as u32),
dealers: dealers.clone(),
receivers: receivers.clone(),
dealers,
receivers,
registry_version: *registry_version,
resharing_transcript,
})
}

#[cfg(test)]
mod tests {
use crate::{test_utils::create_dealing, tests::test_vet_key_config};
use crate::{
test_utils::{
create_dealing, local_dkg_id, make_test_config, remote_dkg_id,
remote_dkg_id_with_target,
},
tests::test_vet_key_config,
};

use super::{super::test_utils::complement_state_manager_with_setup_initial_dkg_request, *};
use ic_consensus_mocks::{
Expand Down Expand Up @@ -1214,7 +1198,7 @@ mod tests {
}

#[test]
fn test_create_remote_dkg_config_for_key_id_dealers_match_reshared_transcript_committee() {
fn test_remote_dkg_config_dealers_match_reshared_transcript_committee() {
let transcript_committee: Vec<_> = (0..4).map(node_test_id).collect();
let receivers: BTreeSet<_> = (4..8).map(node_test_id).collect();
let start_block_height = Height::from(500);
Expand All @@ -1235,17 +1219,18 @@ mod tests {
777,
);

let mut reshared_transcripts = BTreeMap::new();
reshared_transcripts.insert(tag, resharing_transcript.clone());

let config = super::create_remote_dkg_config_for_key_id(
key_id,
let dkg_id = NiDkgId {
start_block_height,
dealer_subnet,
target_id,
&receivers,
&reshared_transcripts,
dkg_tag: tag,
target_subnet: NiDkgTargetSubnet::Remote(target_id),
};
let config = super::create_remote_dkg_config(
dkg_id,
resharing_transcript.committee.get().clone(),
receivers,
&registry_version,
Some(resharing_transcript.clone()),
)
.expect("expected remote DKG config for resharing");

Expand Down Expand Up @@ -1999,43 +1984,6 @@ mod tests {
}
}

fn make_test_config(dkg_id: NiDkgId, max_corrupt_dealers: u32) -> NiDkgConfig {
let nodes: BTreeSet<_> = (0..10).map(node_test_id).collect();
NiDkgConfig::new(NiDkgConfigData {
dkg_id,
max_corrupt_dealers: NumberOfNodes::from(max_corrupt_dealers),
dealers: nodes.clone(),
max_corrupt_receivers: NumberOfNodes::from(1),
receivers: nodes,
threshold: NumberOfNodes::from(2),
registry_version: RegistryVersion::from(1),
resharing_transcript: None,
})
.unwrap()
}

fn local_dkg_id(tag: NiDkgTag) -> NiDkgId {
NiDkgId {
start_block_height: Height::from(0),
dealer_subnet: subnet_test_id(0),
dkg_tag: tag,
target_subnet: NiDkgTargetSubnet::Local,
}
}

fn remote_dkg_id(tag: NiDkgTag) -> NiDkgId {
remote_dkg_id_with_target(tag, [0_u8; 32])
}

fn remote_dkg_id_with_target(tag: NiDkgTag, target_id: [u8; 32]) -> NiDkgId {
NiDkgId {
start_block_height: Height::from(0),
dealer_subnet: subnet_test_id(0),
dkg_tag: tag,
target_subnet: NiDkgTargetSubnet::Remote(NiDkgTargetId::new(target_id)),
}
}

#[test]
fn test_select_dealings_caps_at_collection_threshold() {
// collection_threshold = max_corrupt_dealers + 1 = 2
Expand Down
Loading
Loading