diff --git a/pallets/exodus/Cargo.toml b/pallets/exodus/Cargo.toml index 6d0de06..800b5e5 100644 --- a/pallets/exodus/Cargo.toml +++ b/pallets/exodus/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ghost-exodus" -version = "0.1.4" +version = "0.1.5" description = "Threshold signature generation with DKG included" license.workspace = true authors.workspace = true diff --git a/pallets/exodus/src/lib.rs b/pallets/exodus/src/lib.rs index 0489445..3fc105a 100644 --- a/pallets/exodus/src/lib.rs +++ b/pallets/exodus/src/lib.rs @@ -2769,6 +2769,10 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + if Round0Packages::::contains_key(&network_curve, &authority_index) { + return Err(InvalidTransaction::Stale); + } + let authorities = QualificationAuthorities::::get(&network_curve); let authority = authorities.get(authority_index as usize) .ok_or(InvalidTransaction::BadSigner)?; @@ -2836,6 +2840,10 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + if Round1Packages::::get(&network_curve).contains(authority_index) { + return Err(InvalidTransaction::Stale); + } + let authority = authorities .get(authority_index as usize) .ok_or(InvalidTransaction::BadSigner)?; @@ -2915,6 +2923,10 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + if Round2Packages::::get(&network_curve).contains(authority_index) { + return Err(InvalidTransaction::Stale); + } + let authorities = QualificationAuthorities::::get(&network_curve); let authority = authorities.get(authority_index as usize) .ok_or(InvalidTransaction::BadSigner)?; @@ -2985,6 +2997,10 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + if Complaints::::get(&network_curve).contains_key(&authority_index) { + return Err(InvalidTransaction::Stale); + } + let authorities = QualificationAuthorities::::get(&network_curve); let authority = authorities .get(authority_index as usize) @@ -3067,6 +3083,10 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + if Justifications::::get(&network_curve).contains_key(&authority_index) { + return Err(InvalidTransaction::Stale); + } + let authorities = QualificationAuthorities::::get(&network_curve); let authority = authorities.get(authority_index as usize) .ok_or(InvalidTransaction::BadSigner)?; @@ -3129,6 +3149,13 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + if VerifyingKeyConsensus::::get(&network_curve, &package_dkg_index) + .state + .participants + .contains(authority_index) { + return Err(InvalidTransaction::Stale); + } + let authorities = QualificationAuthorities::::get(&network_curve); let authority = authorities.get(authority_index as usize) .ok_or(InvalidTransaction::BadSigner)?; @@ -3195,6 +3222,11 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + if VerifyingSharesParticipants::::get(&network_curve, package_dkg_index) + .contains(authority_index) { + return Err(InvalidTransaction::Stale); + } + let authorities = QualificationAuthorities::::get(&network_curve); let authority = authorities.get(authority_index as usize) .ok_or(InvalidTransaction::BadSigner)?; @@ -3263,15 +3295,6 @@ impl Pallet { return Err(InvalidTransaction::Stale); } - let authorities = ActiveAuthorities::::get(&network_curve); - let authority = authorities.get(authority_index as usize) - .ok_or(InvalidTransaction::BadSigner)?; - - let encoded_package = exodus_package.encode(); - if !authority.verify(&encoded_package, signature) { - return Err(InvalidTransaction::BadProof); - } - let exodus_request = ExodusRequests::::get((&network_curve, exodus_context)) .ok_or(InvalidTransaction::BadProof)?; @@ -3282,6 +3305,22 @@ impl Pallet { None => exodus_request.next_roast_session, }; + if NonceCommitments::::contains_key( + (exodus_context, roast_session), + authority_index + ) { + return Err(InvalidTransaction::Stale); + } + + let authorities = ActiveAuthorities::::get(&network_curve); + let authority = authorities.get(authority_index as usize) + .ok_or(InvalidTransaction::BadSigner)?; + + let encoded_package = exodus_package.encode(); + if !authority.verify(&encoded_package, signature) { + return Err(InvalidTransaction::BadProof); + } + Ok((exodus_request, roast_session)) } @@ -3331,6 +3370,22 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + let roast_session = + RoastSessions::::get(exodus_context, &authority_index) + .ok_or(InvalidTransaction::BadProof)?; + + let roast_state = RoastSessionStates::::get(&exodus_context, &roast_session); + let is_nonce_committer = roast_state.nonce_committers.contains(authority_index); + let is_group_committer = roast_state.group_committers.contains(authority_index); + let is_partial_signer = roast_state.partial_signers.contains(authority_index); + + let threshold_reached = roast_state.nonce_committers == roast_state.group_committers; + let already_committed = !threshold_reached || is_group_committer; + + if !is_nonce_committer || !already_committed || is_partial_signer { + return Err(InvalidTransaction::Stale); + } + let authorities = ActiveAuthorities::::get(&network_curve); let authority = authorities.get(authority_index as usize) .ok_or(InvalidTransaction::BadSigner)?; @@ -3340,8 +3395,7 @@ impl Pallet { return Err(InvalidTransaction::BadProof); } - RoastSessions::::get(exodus_context, &authority_index) - .ok_or(InvalidTransaction::BadProof) + Ok(roast_session) } fn validate_exodus_signature_share_size_and_get_metadata<'a>( @@ -3395,6 +3449,19 @@ impl Pallet { return Err(InvalidTransaction::Stale); } + let roast_session = + RoastSessions::::get(exodus_context, &authority_index) + .ok_or(InvalidTransaction::BadProof)?; + + let roast_state = RoastSessionStates::::get(&exodus_context, &roast_session); + let is_nonce_committer = roast_state.nonce_committers.contains(authority_index); + let is_group_committer = roast_state.group_committers.contains(authority_index); + let is_partial_signer = roast_state.partial_signers.contains(authority_index); + + if !is_nonce_committer || !is_group_committer || is_partial_signer { + return Err(InvalidTransaction::Stale); + } + let authorities = ActiveAuthorities::::get(&network_curve); let authority = authorities.get(authority_index as usize) .ok_or(InvalidTransaction::BadSigner)?; @@ -3404,10 +3471,6 @@ impl Pallet { return Err(InvalidTransaction::BadProof); } - let roast_session = - RoastSessions::::get(exodus_context, &authority_index) - .ok_or(InvalidTransaction::BadProof)?; - Ok((roast_session, active_state.get_dkg_index())) }