From cfe5b2d85081d50b97c4c95ec2aac9fde0cfc5f7 Mon Sep 17 00:00:00 2001 From: Leo Eichhorn Date: Thu, 17 Jul 2025 12:09:40 +0000 Subject: [PATCH 1/4] impl error reproducibility --- rs/consensus/idkg/src/payload_verifier.rs | 110 ++++++++++++++++------ rs/interfaces/src/crypto/errors.rs | 65 ++++++++++++- rs/interfaces/src/errors.rs | 69 ++++++++++++++ rs/interfaces/src/lib.rs | 1 + 4 files changed, 213 insertions(+), 32 deletions(-) create mode 100644 rs/interfaces/src/errors.rs diff --git a/rs/consensus/idkg/src/payload_verifier.rs b/rs/consensus/idkg/src/payload_verifier.rs index e14e9f7341d9..f74dd7b1ebdf 100644 --- a/rs/consensus/idkg/src/payload_verifier.rs +++ b/rs/consensus/idkg/src/payload_verifier.rs @@ -78,20 +78,28 @@ use std::{collections::BTreeMap, convert::TryFrom}; // The fields are only read by the `Debug` implementation. // The `dead_code` lint ignores `Debug` impls, see: https://github.com/rust-lang/rust/issues/88900. #[allow(dead_code)] -/// Reasons for why an idkg payload might be invalid. +/// Possible failures which could occur while validating an idkg payload. They don't imply that the +/// payload is invalid. pub enum IDkgPayloadValidationFailure { RegistryClientError(RegistryClientError), StateManagerError(StateManagerError), + ThresholdEcdsaSigInputsError(ecdsa::ThresholdEcdsaSigInputsError), + ThresholdSchnorrSigInputsError(schnorr::ThresholdSchnorrSigInputsError), + TranscriptParamsError(idkg::TranscriptParamsError), + ThresholdEcdsaVerifyCombinedSignatureError(ThresholdEcdsaVerifyCombinedSignatureError), + ThresholdSchnorrVerifyCombinedSignatureError(ThresholdSchnorrVerifyCombinedSigError), + IDkgVerifyTranscriptError(IDkgVerifyTranscriptError), + IDkgVerifyInitialDealingsError(IDkgVerifyInitialDealingsError), } #[derive(Debug)] // The fields are only read by the `Debug` implementation. // The `dead_code` lint ignores `Debug` impls, see: https://github.com/rust-lang/rust/issues/88900. #[allow(dead_code)] -/// Possible failures which could occur while validating an idkg payload. They don't imply that the -/// payload is invalid. +/// Reasons for why an idkg payload might be invalid. pub enum InvalidIDkgPayloadReason { // wrapper of other errors + RegistryClientError(RegistryClientError), UnexpectedSummaryPayload(IDkgPayloadError), UnexpectedDataPayload(Option), InvalidChainCacheError(InvalidChainCacheError), @@ -175,12 +183,72 @@ impl From for IDkgPayloadValidationFailure { } } +impl From for InvalidIDkgPayloadReason { + fn from(err: RegistryClientError) -> Self { + InvalidIDkgPayloadReason::RegistryClientError(err) + } +} + impl From for IDkgPayloadValidationFailure { fn from(err: StateManagerError) -> Self { IDkgPayloadValidationFailure::StateManagerError(err) } } +impl From for IDkgPayloadValidationFailure { + fn from(err: IDkgVerifyInitialDealingsError) -> Self { + IDkgPayloadValidationFailure::IDkgVerifyInitialDealingsError(err) + } +} + +impl From for IDkgPayloadValidationFailure { + fn from(err: IDkgVerifyTranscriptError) -> Self { + IDkgPayloadValidationFailure::IDkgVerifyTranscriptError(err) + } +} + +impl From for IDkgPayloadValidationFailure { + fn from(err: ThresholdSchnorrVerifyCombinedSigError) -> Self { + IDkgPayloadValidationFailure::ThresholdSchnorrVerifyCombinedSignatureError(err) + } +} + +impl From for IDkgPayloadValidationFailure { + fn from(err: ThresholdEcdsaVerifyCombinedSignatureError) -> Self { + IDkgPayloadValidationFailure::ThresholdEcdsaVerifyCombinedSignatureError(err) + } +} + +impl From for InvalidIDkgPayloadReason { + fn from(err: ThresholdSchnorrVerifyCombinedSigError) -> Self { + InvalidIDkgPayloadReason::ThresholdSchnorrVerifyCombinedSignatureError(err) + } +} + +impl From for InvalidIDkgPayloadReason { + fn from(err: ThresholdEcdsaVerifyCombinedSignatureError) -> Self { + InvalidIDkgPayloadReason::ThresholdEcdsaVerifyCombinedSignatureError(err) + } +} + +impl From for IDkgPayloadValidationFailure { + fn from(err: idkg::TranscriptParamsError) -> Self { + IDkgPayloadValidationFailure::TranscriptParamsError(err) + } +} + +impl From for IDkgPayloadValidationFailure { + fn from(err: schnorr::ThresholdSchnorrSigInputsError) -> Self { + IDkgPayloadValidationFailure::ThresholdSchnorrSigInputsError(err) + } +} + +impl From for IDkgPayloadValidationFailure { + fn from(err: ecdsa::ThresholdEcdsaSigInputsError) -> Self { + IDkgPayloadValidationFailure::ThresholdEcdsaSigInputsError(err) + } +} + pub(crate) type IDkgValidationError = ValidationError; @@ -248,8 +316,7 @@ fn validate_summary_payload( InvalidIDkgPayloadReason::ConsensusRegistryVersionNotFound(height), )?; let chain_key_config = - get_idkg_chain_key_config_if_enabled(subnet_id, registry_version, registry_client) - .map_err(IDkgPayloadValidationFailure::from)?; + get_idkg_chain_key_config_if_enabled(subnet_id, registry_version, registry_client)?; if chain_key_config.is_none() { if summary_payload.is_some() { return Err(InvalidIDkgPayloadReason::ChainKeyConfigNotFound.into()); @@ -476,12 +543,8 @@ fn validate_transcript_refs( let config = prev_configs .get(transcript_id) .ok_or(NewTranscriptMissingParams(*transcript_id))?; - let params = config - .translate(block_reader) - .map_err(TranscriptParamsError)?; - crypto - .verify_transcript(¶ms, transcript) - .map_err(IDkgVerifyTranscriptError)?; + let params = config.translate(block_reader)?; + crypto.verify_transcript(¶ms, transcript)?; count += 1; } else { return Err(NewTranscriptNotFound(*transcript_id).into()); @@ -520,14 +583,8 @@ fn validate_reshare_dealings( if let ic_types::messages::Payload::Data(data) = &response.payload { let initial_dealings = decode_initial_dealings(data)?; let transcript_id = config.as_ref().transcript_id; - let param = config - .as_ref() - .translate(block_reader) - .map_err(InvalidIDkgPayloadReason::from)?; - - crypto - .verify_initial_dealings(¶m, &initial_dealings) - .map_err(InvalidIDkgPayloadReason::from)?; + let param = config.as_ref().translate(block_reader)?; + crypto.verify_initial_dealings(¶m, &initial_dealings)?; new_dealings.insert(transcript_id, initial_dealings.dealings().clone()); } } else { @@ -572,7 +629,6 @@ fn validate_new_signature_agreements( prev_payload: &idkg::IDkgPayload, curr_payload: &idkg::IDkgPayload, ) -> Result, IDkgValidationError> { - use InvalidIDkgPayloadReason::*; let mut new_signatures = BTreeMap::new(); let context_map = state .signature_request_contexts() @@ -595,23 +651,18 @@ fn validate_new_signature_agreements( .map_err(InvalidIDkgPayloadReason::NewSignatureBuildInputsError)?; match input_ref { ThresholdSigInputsRef::Ecdsa(input_ref) => { - let input = input_ref - .translate(block_reader) - .map_err(InvalidIDkgPayloadReason::from)?; + let input = input_ref.translate(block_reader)?; let reply = SignWithECDSAReply::decode(data).map_err(|err| { InvalidIDkgPayloadReason::DecodingError(format!("{:?}", err)) })?; let signature = ThresholdEcdsaCombinedSignature { signature: reply.signature, }; - ThresholdEcdsaSigVerifier::verify_combined_sig(crypto, &input, &signature) - .map_err(ThresholdEcdsaVerifyCombinedSignatureError)?; + ThresholdEcdsaSigVerifier::verify_combined_sig(crypto, &input, &signature)?; new_signatures.insert(*id, CombinedSignature::Ecdsa(signature)); } ThresholdSigInputsRef::Schnorr(input_ref) => { - let input = input_ref - .translate(block_reader) - .map_err(InvalidIDkgPayloadReason::from)?; + let input = input_ref.translate(block_reader)?; let reply = SignWithSchnorrReply::decode(data).map_err(|err| { InvalidIDkgPayloadReason::DecodingError(format!("{:?}", err)) })?; @@ -620,8 +671,7 @@ fn validate_new_signature_agreements( }; ThresholdSchnorrSigVerifier::verify_combined_sig( crypto, &input, &signature, - ) - .map_err(ThresholdSchnorrVerifyCombinedSignatureError)?; + )?; new_signatures.insert(*id, CombinedSignature::Schnorr(signature)); } ThresholdSigInputsRef::VetKd(_) => { diff --git a/rs/interfaces/src/crypto/errors.rs b/rs/interfaces/src/crypto/errors.rs index ccb7975f9408..989a1b49091e 100644 --- a/rs/interfaces/src/crypto/errors.rs +++ b/rs/interfaces/src/crypto/errors.rs @@ -1,8 +1,10 @@ use crate::crypto::ErrorReproducibility; use ic_types::crypto::canister_threshold_sig::error::{ - IDkgVerifyComplaintError, IDkgVerifyDealingPrivateError, IDkgVerifyDealingPublicError, - IDkgVerifyInitialDealingsError, IDkgVerifyOpeningError, IDkgVerifyTranscriptError, + EcdsaPresignatureQuadrupleCreationError, IDkgParamsValidationError, IDkgVerifyComplaintError, + IDkgVerifyDealingPrivateError, IDkgVerifyDealingPublicError, IDkgVerifyInitialDealingsError, + IDkgVerifyOpeningError, IDkgVerifyTranscriptError, ThresholdEcdsaSigInputsCreationError, ThresholdEcdsaVerifyCombinedSignatureError, ThresholdEcdsaVerifySigShareError, + ThresholdSchnorrPresignatureTranscriptCreationError, ThresholdSchnorrSigInputsCreationError, ThresholdSchnorrVerifyCombinedSigError, ThresholdSchnorrVerifySigShareError, }; use ic_types::crypto::threshold_sig::ni_dkg::errors::create_transcript_error::DkgCreateTranscriptError; @@ -344,6 +346,28 @@ impl ErrorReproducibility for ThresholdEcdsaVerifyCombinedSignatureError { } } +impl ErrorReproducibility for ThresholdEcdsaSigInputsCreationError { + fn is_reproducible(&self) -> bool { + match self { + ThresholdEcdsaSigInputsCreationError::InconsistentAlgorithmIds => true, + ThresholdEcdsaSigInputsCreationError::InconsistentReceivers => true, + ThresholdEcdsaSigInputsCreationError::InvalidHashLength => true, + ThresholdEcdsaSigInputsCreationError::InvalidQuadrupleOrigin(_) => true, + ThresholdEcdsaSigInputsCreationError::UnsupportedAlgorithm => true, + } + } +} + +impl ErrorReproducibility for EcdsaPresignatureQuadrupleCreationError { + fn is_reproducible(&self) -> bool { + match self { + EcdsaPresignatureQuadrupleCreationError::InconsistentAlgorithmIds => true, + EcdsaPresignatureQuadrupleCreationError::InconsistentReceivers => true, + EcdsaPresignatureQuadrupleCreationError::InvalidTranscriptOrigin(_) => true, + } + } +} + impl ErrorReproducibility for ThresholdSchnorrVerifySigShareError { fn is_reproducible(&self) -> bool { // The match below is intentionally explicit on all possible values, @@ -389,6 +413,43 @@ impl ErrorReproducibility for ThresholdSchnorrVerifyCombinedSigError { } } +impl ErrorReproducibility for ThresholdSchnorrSigInputsCreationError { + fn is_reproducible(&self) -> bool { + match self { + ThresholdSchnorrSigInputsCreationError::InconsistentAlgorithmIds(_, _) => true, + ThresholdSchnorrSigInputsCreationError::InconsistentReceivers => true, + ThresholdSchnorrSigInputsCreationError::InvalidPreSignatureOrigin(_) => true, + ThresholdSchnorrSigInputsCreationError::InvalidUseOfTaprootHash => true, + ThresholdSchnorrSigInputsCreationError::UnsupportedAlgorithm(_) => true, + } + } +} + +impl ErrorReproducibility for ThresholdSchnorrPresignatureTranscriptCreationError { + fn is_reproducible(&self) -> bool { + match self { + ThresholdSchnorrPresignatureTranscriptCreationError::InvalidTranscriptOrigin(_) => true, + ThresholdSchnorrPresignatureTranscriptCreationError::UnsupportedAlgorithm(_) => true, + } + } +} + +impl ErrorReproducibility for IDkgParamsValidationError { + fn is_reproducible(&self) -> bool { + match self { + IDkgParamsValidationError::TooManyReceivers { .. } => true, + IDkgParamsValidationError::TooManyDealers { .. } => true, + IDkgParamsValidationError::UnsatisfiedVerificationThreshold { .. } => true, + IDkgParamsValidationError::UnsatisfiedCollectionThreshold { .. } => true, + IDkgParamsValidationError::ReceiversEmpty => true, + IDkgParamsValidationError::DealersEmpty => true, + IDkgParamsValidationError::UnsupportedAlgorithmId { .. } => true, + IDkgParamsValidationError::WrongTypeForOriginalTranscript => true, + IDkgParamsValidationError::DealersNotContainedInPreviousReceivers => true, + } + } +} + impl ErrorReproducibility for IDkgVerifyOpeningError { fn is_reproducible(&self) -> bool { match self { diff --git a/rs/interfaces/src/errors.rs b/rs/interfaces/src/errors.rs new file mode 100644 index 000000000000..32f6f372173a --- /dev/null +++ b/rs/interfaces/src/errors.rs @@ -0,0 +1,69 @@ +use ic_types::consensus::idkg::{ + common::TranscriptOperationError, + ecdsa::{PreSignatureQuadrupleError, ThresholdEcdsaSigInputsError}, + schnorr::{PreSignatureTranscriptError, ThresholdSchnorrSigInputsError}, + TranscriptParamsError, +}; + +use crate::crypto::ErrorReproducibility; + +impl ErrorReproducibility for ThresholdEcdsaSigInputsError { + fn is_reproducible(&self) -> bool { + match self { + ThresholdEcdsaSigInputsError::PreSignatureQuadruple(err) => err.is_reproducible(), + ThresholdEcdsaSigInputsError::KeyTranscript(_) => true, + ThresholdEcdsaSigInputsError::Failed(err) => err.is_reproducible(), + } + } +} + +impl ErrorReproducibility for PreSignatureQuadrupleError { + fn is_reproducible(&self) -> bool { + match self { + PreSignatureQuadrupleError::KappaUnmasked(_) => true, + PreSignatureQuadrupleError::LambdaMasked(_) => true, + PreSignatureQuadrupleError::KappaTimesLambda(_) => true, + PreSignatureQuadrupleError::KeyTimesLambda(_) => true, + PreSignatureQuadrupleError::Failed(err) => err.is_reproducible(), + } + } +} + +impl ErrorReproducibility for ThresholdSchnorrSigInputsError { + fn is_reproducible(&self) -> bool { + match self { + ThresholdSchnorrSigInputsError::PreSignatureTranscript(err) => err.is_reproducible(), + ThresholdSchnorrSigInputsError::KeyTranscript(_) => true, + ThresholdSchnorrSigInputsError::Failed(err) => err.is_reproducible(), + } + } +} + +impl ErrorReproducibility for PreSignatureTranscriptError { + fn is_reproducible(&self) -> bool { + match self { + PreSignatureTranscriptError::BlinderUnmasked(_) => true, + PreSignatureTranscriptError::Failed(err) => err.is_reproducible(), + } + } +} + +impl ErrorReproducibility for TranscriptParamsError { + fn is_reproducible(&self) -> bool { + match self { + TranscriptParamsError::OperationRef(err) => err.is_reproducible(), + TranscriptParamsError::ParamsValidation(err) => err.is_reproducible(), + } + } +} + +impl ErrorReproducibility for TranscriptOperationError { + fn is_reproducible(&self) -> bool { + match self { + TranscriptOperationError::ReshareOfMasked(_) => true, + TranscriptOperationError::ReshareOfUnmasked(_) => true, + TranscriptOperationError::UnmaskedTimesMasked1(_) => true, + TranscriptOperationError::UnmaskedTimesMasked2(_) => true, + } + } +} diff --git a/rs/interfaces/src/lib.rs b/rs/interfaces/src/lib.rs index 3749a2305ddf..c5d9d8fbc69e 100644 --- a/rs/interfaces/src/lib.rs +++ b/rs/interfaces/src/lib.rs @@ -9,6 +9,7 @@ pub mod consensus; pub mod consensus_pool; pub mod crypto; pub mod dkg; +pub mod errors; pub mod execution_environment; pub mod idkg; pub mod ingress_manager; From 24b2ae0241a6056d9bb0b1f6972f205b2dcf5951 Mon Sep 17 00:00:00 2001 From: Leo Eichhorn Date: Thu, 17 Jul 2025 12:38:45 +0000 Subject: [PATCH 2/4] refactor --- .github/CODEOWNERS | 1 + rs/consensus/idkg/src/payload_verifier.rs | 34 +++++++++++---------- rs/interfaces/src/consensus.rs | 2 ++ rs/interfaces/src/{ => consensus}/errors.rs | 0 rs/interfaces/src/lib.rs | 1 - 5 files changed, 21 insertions(+), 17 deletions(-) rename rs/interfaces/src/{ => consensus}/errors.rs (100%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b16b0b75a34a..823c05e9e10c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -147,6 +147,7 @@ go_deps.bzl @dfinity/idx /rs/interfaces/certified_stream_store/ @dfinity/ic-message-routing-owners /rs/interfaces/registry/ @dfinity/governance-team /rs/interfaces/src/canister_http.rs @dfinity/consensus +/rs/interfaces/src/consensus @dfinity/consensus /rs/interfaces/src/consensus.rs @dfinity/consensus /rs/interfaces/src/consensus_pool.rs @dfinity/consensus /rs/interfaces/src/crypto.rs @dfinity/crypto-team diff --git a/rs/consensus/idkg/src/payload_verifier.rs b/rs/consensus/idkg/src/payload_verifier.rs index f74dd7b1ebdf..08bac58f8733 100644 --- a/rs/consensus/idkg/src/payload_verifier.rs +++ b/rs/consensus/idkg/src/payload_verifier.rs @@ -99,7 +99,6 @@ pub enum IDkgPayloadValidationFailure { /// Reasons for why an idkg payload might be invalid. pub enum InvalidIDkgPayloadReason { // wrapper of other errors - RegistryClientError(RegistryClientError), UnexpectedSummaryPayload(IDkgPayloadError), UnexpectedDataPayload(Option), InvalidChainCacheError(InvalidChainCacheError), @@ -183,12 +182,6 @@ impl From for IDkgPayloadValidationFailure { } } -impl From for InvalidIDkgPayloadReason { - fn from(err: RegistryClientError) -> Self { - InvalidIDkgPayloadReason::RegistryClientError(err) - } -} - impl From for IDkgPayloadValidationFailure { fn from(err: StateManagerError) -> Self { IDkgPayloadValidationFailure::StateManagerError(err) @@ -316,7 +309,8 @@ fn validate_summary_payload( InvalidIDkgPayloadReason::ConsensusRegistryVersionNotFound(height), )?; let chain_key_config = - get_idkg_chain_key_config_if_enabled(subnet_id, registry_version, registry_client)?; + get_idkg_chain_key_config_if_enabled(subnet_id, registry_version, registry_client) + .map_err(IDkgPayloadValidationFailure::from)?; if chain_key_config.is_none() { if summary_payload.is_some() { return Err(InvalidIDkgPayloadReason::ChainKeyConfigNotFound.into()); @@ -460,7 +454,7 @@ fn validate_data_payload( signatures, }; - let idkg_payload = create_data_payload_helper( + match create_data_payload_helper( subnet_id, context, parent_block, @@ -472,13 +466,21 @@ fn validate_data_payload( registry_client, None, &ic_logger::replica_logger::no_op_logger(), - ) - .map_err(|err| InvalidIDkgPayloadReason::UnexpectedDataPayload(Some(err)))?; - - if idkg_payload.as_ref() == data_payload { - Ok(()) - } else { - Err(InvalidIDkgPayloadReason::DataPayloadMismatch.into()) + ) { + Ok(idkg_payload) => { + if idkg_payload.as_ref() == data_payload { + Ok(()) + } else { + Err(InvalidIDkgPayloadReason::DataPayloadMismatch.into()) + } + } + Err(IDkgPayloadError::RegistryClientError(err)) => { + Err(IDkgPayloadValidationFailure::RegistryClientError(err).into()) + } + Err(IDkgPayloadError::StateManagerError(err)) => { + Err(IDkgPayloadValidationFailure::StateManagerError(err).into()) + } + Err(err) => Err(InvalidIDkgPayloadReason::UnexpectedDataPayload(Some(err)).into()), } } diff --git a/rs/interfaces/src/consensus.rs b/rs/interfaces/src/consensus.rs index a083dfc4667d..963f85bb1b9a 100644 --- a/rs/interfaces/src/consensus.rs +++ b/rs/interfaces/src/consensus.rs @@ -25,6 +25,8 @@ use ic_types::{ Height, Time, }; +pub mod errors; + /// The [`PayloadBuilder`] is responsible for creating and validating payload that /// is included in consensus blocks. pub trait PayloadBuilder: Send + Sync { diff --git a/rs/interfaces/src/errors.rs b/rs/interfaces/src/consensus/errors.rs similarity index 100% rename from rs/interfaces/src/errors.rs rename to rs/interfaces/src/consensus/errors.rs diff --git a/rs/interfaces/src/lib.rs b/rs/interfaces/src/lib.rs index c5d9d8fbc69e..3749a2305ddf 100644 --- a/rs/interfaces/src/lib.rs +++ b/rs/interfaces/src/lib.rs @@ -9,7 +9,6 @@ pub mod consensus; pub mod consensus_pool; pub mod crypto; pub mod dkg; -pub mod errors; pub mod execution_environment; pub mod idkg; pub mod ingress_manager; From 66221529c82277b9cd629e6f67e5c97215c94b33 Mon Sep 17 00:00:00 2001 From: Leo Eichhorn Date: Thu, 17 Jul 2025 13:44:03 +0000 Subject: [PATCH 3/4] re-order From implementations --- rs/consensus/idkg/src/payload_verifier.rs | 72 +++++++++++------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/rs/consensus/idkg/src/payload_verifier.rs b/rs/consensus/idkg/src/payload_verifier.rs index 08bac58f8733..0cd84e4e6394 100644 --- a/rs/consensus/idkg/src/payload_verifier.rs +++ b/rs/consensus/idkg/src/payload_verifier.rs @@ -152,39 +152,51 @@ impl From for InvalidIDkgPayloadReason { } } +impl From for IDkgPayloadValidationFailure { + fn from(err: ecdsa::ThresholdEcdsaSigInputsError) -> Self { + IDkgPayloadValidationFailure::ThresholdEcdsaSigInputsError(err) + } +} + impl From for InvalidIDkgPayloadReason { fn from(err: schnorr::ThresholdSchnorrSigInputsError) -> Self { InvalidIDkgPayloadReason::ThresholdSchnorrSigInputsError(err) } } +impl From for IDkgPayloadValidationFailure { + fn from(err: schnorr::ThresholdSchnorrSigInputsError) -> Self { + IDkgPayloadValidationFailure::ThresholdSchnorrSigInputsError(err) + } +} + impl From for InvalidIDkgPayloadReason { fn from(err: idkg::TranscriptParamsError) -> Self { InvalidIDkgPayloadReason::TranscriptParamsError(err) } } -impl From for InvalidIDkgPayloadReason { - fn from(err: IDkgVerifyTranscriptError) -> Self { - InvalidIDkgPayloadReason::IDkgVerifyTranscriptError(err) +impl From for IDkgPayloadValidationFailure { + fn from(err: idkg::TranscriptParamsError) -> Self { + IDkgPayloadValidationFailure::TranscriptParamsError(err) } } -impl From for InvalidIDkgPayloadReason { - fn from(err: IDkgVerifyInitialDealingsError) -> Self { - InvalidIDkgPayloadReason::IDkgVerifyInitialDealingsError(err) +impl From for InvalidIDkgPayloadReason { + fn from(err: IDkgVerifyTranscriptError) -> Self { + InvalidIDkgPayloadReason::IDkgVerifyTranscriptError(err) } } -impl From for IDkgPayloadValidationFailure { - fn from(err: RegistryClientError) -> Self { - IDkgPayloadValidationFailure::RegistryClientError(err) +impl From for IDkgPayloadValidationFailure { + fn from(err: IDkgVerifyTranscriptError) -> Self { + IDkgPayloadValidationFailure::IDkgVerifyTranscriptError(err) } } -impl From for IDkgPayloadValidationFailure { - fn from(err: StateManagerError) -> Self { - IDkgPayloadValidationFailure::StateManagerError(err) +impl From for InvalidIDkgPayloadReason { + fn from(err: IDkgVerifyInitialDealingsError) -> Self { + InvalidIDkgPayloadReason::IDkgVerifyInitialDealingsError(err) } } @@ -194,15 +206,9 @@ impl From for IDkgPayloadValidationFailure { } } -impl From for IDkgPayloadValidationFailure { - fn from(err: IDkgVerifyTranscriptError) -> Self { - IDkgPayloadValidationFailure::IDkgVerifyTranscriptError(err) - } -} - -impl From for IDkgPayloadValidationFailure { - fn from(err: ThresholdSchnorrVerifyCombinedSigError) -> Self { - IDkgPayloadValidationFailure::ThresholdSchnorrVerifyCombinedSignatureError(err) +impl From for InvalidIDkgPayloadReason { + fn from(err: ThresholdEcdsaVerifyCombinedSignatureError) -> Self { + InvalidIDkgPayloadReason::ThresholdEcdsaVerifyCombinedSignatureError(err) } } @@ -218,27 +224,21 @@ impl From for InvalidIDkgPayloadReason { } } -impl From for InvalidIDkgPayloadReason { - fn from(err: ThresholdEcdsaVerifyCombinedSignatureError) -> Self { - InvalidIDkgPayloadReason::ThresholdEcdsaVerifyCombinedSignatureError(err) - } -} - -impl From for IDkgPayloadValidationFailure { - fn from(err: idkg::TranscriptParamsError) -> Self { - IDkgPayloadValidationFailure::TranscriptParamsError(err) +impl From for IDkgPayloadValidationFailure { + fn from(err: ThresholdSchnorrVerifyCombinedSigError) -> Self { + IDkgPayloadValidationFailure::ThresholdSchnorrVerifyCombinedSignatureError(err) } } -impl From for IDkgPayloadValidationFailure { - fn from(err: schnorr::ThresholdSchnorrSigInputsError) -> Self { - IDkgPayloadValidationFailure::ThresholdSchnorrSigInputsError(err) +impl From for IDkgPayloadValidationFailure { + fn from(err: RegistryClientError) -> Self { + IDkgPayloadValidationFailure::RegistryClientError(err) } } -impl From for IDkgPayloadValidationFailure { - fn from(err: ecdsa::ThresholdEcdsaSigInputsError) -> Self { - IDkgPayloadValidationFailure::ThresholdEcdsaSigInputsError(err) +impl From for IDkgPayloadValidationFailure { + fn from(err: StateManagerError) -> Self { + IDkgPayloadValidationFailure::StateManagerError(err) } } From 5c31f18522f07623f1c929062ec568a31b8a6fe8 Mon Sep 17 00:00:00 2001 From: Leo Eichhorn Date: Thu, 17 Jul 2025 13:44:42 +0000 Subject: [PATCH 4/4] review --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 823c05e9e10c..7cec313ead6b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -147,8 +147,8 @@ go_deps.bzl @dfinity/idx /rs/interfaces/certified_stream_store/ @dfinity/ic-message-routing-owners /rs/interfaces/registry/ @dfinity/governance-team /rs/interfaces/src/canister_http.rs @dfinity/consensus -/rs/interfaces/src/consensus @dfinity/consensus /rs/interfaces/src/consensus.rs @dfinity/consensus +/rs/interfaces/src/consensus/ @dfinity/consensus /rs/interfaces/src/consensus_pool.rs @dfinity/consensus /rs/interfaces/src/crypto.rs @dfinity/crypto-team /rs/interfaces/src/crypto/ @dfinity/crypto-team