From 2ac274f420f4206760926acf4a6eb0c736020136 Mon Sep 17 00:00:00 2001 From: Christian Langenbacher Date: Thu, 18 Jan 2024 13:46:11 +0100 Subject: [PATCH 1/7] [primitives/ceremonies] implement convenience methods on `ProofOfAttendance` --- primitives/src/ceremonies.rs | 57 +++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/primitives/src/ceremonies.rs b/primitives/src/ceremonies.rs index f9c92644..a80f3afb 100644 --- a/primitives/src/ceremonies.rs +++ b/primitives/src/ceremonies.rs @@ -21,7 +21,7 @@ use crate::communities::{CommunityIdentifier, Location}; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -use sp_core::{RuntimeDebug, H256}; +use sp_core::{Pair, RuntimeDebug, H256}; use sp_runtime::traits::{BlakeTwo256, Hash, IdentifyAccount, Verify}; pub use crate::scheduler::CeremonyIndexType; @@ -213,6 +213,8 @@ impl CommunityReputation { } } +pub type AccountIdFor = <::Signer as IdentifyAccount>::AccountId; + #[derive( Encode, Decode, Copy, Clone, PartialEq, Eq, Default, RuntimeDebug, TypeInfo, MaxEncodedLen, )] @@ -226,17 +228,36 @@ pub struct ProofOfAttendance { pub attendee_signature: Signature, } -impl ProofOfAttendance { - /// get the hash of the proof without the attendee signature, - /// as the signature is non-deterministic. - pub fn hash(&self) -> H256 { - ( - self.prover_public.clone(), - self.ceremony_index, - self.community_identifier, - self.attendee_public.clone(), +impl ProofOfAttendance> +where + AccountIdFor: Clone + Encode, +{ + pub fn verify_signature(&self) -> bool { + self.attendee_signature.verify( + &(self.prover_public.clone(), self.ceremony_index).encode()[..], + &self.attendee_public.clone().into(), ) - .using_encoded(BlakeTwo256::hash) + } + + pub fn signed( + prover_public: AccountIdFor, + cid: CommunityIdentifier, + cindex: CeremonyIndexType, + attendee: Signer, + ) -> Self + where + Signer: Pair, + Signature: From, + AccountIdFor: From, + { + let msg = (prover_public.clone(), cindex); + ProofOfAttendance { + prover_public, + community_identifier: cid, + ceremony_index: cindex, + attendee_public: attendee.public().into(), + attendee_signature: attendee.sign(&msg.encode()).into(), + } } } @@ -377,4 +398,18 @@ mod tests { assert!(claim.verify_signature()) } + + #[test] + fn proof_of_attendance_signing_works() { + let alice = AccountKeyring::Alice.pair(); + + let proof = ProofOfAttendance::::signed( + alice.public().into(), + Default::default(), + 1, + alice, + ); + + assert!(proof.verify_signature()) + } } From e748c05da59b0527d6e5b329b42f0a04a791741a Mon Sep 17 00:00:00 2001 From: Christian Langenbacher Date: Thu, 18 Jan 2024 13:48:39 +0100 Subject: [PATCH 2/7] [primitives/ceremonies] remove obsolete hash function on proof of attendance --- primitives/src/ceremonies.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/primitives/src/ceremonies.rs b/primitives/src/ceremonies.rs index a80f3afb..7a4cbf5f 100644 --- a/primitives/src/ceremonies.rs +++ b/primitives/src/ceremonies.rs @@ -21,8 +21,8 @@ use crate::communities::{CommunityIdentifier, Location}; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -use sp_core::{Pair, RuntimeDebug, H256}; -use sp_runtime::traits::{BlakeTwo256, Hash, IdentifyAccount, Verify}; +use sp_core::{Pair, RuntimeDebug}; +use sp_runtime::traits::{IdentifyAccount, Verify}; pub use crate::scheduler::CeremonyIndexType; From 8c96757fb81d6e18426dc0f7eee88a0df22c7cc1 Mon Sep 17 00:00:00 2001 From: Christian Langenbacher Date: Thu, 18 Jan 2024 13:52:03 +0100 Subject: [PATCH 3/7] [ceremonies] replace pallet method `verify_attendee_signature` with the proof of attendance's method. --- ceremonies/src/lib.rs | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/ceremonies/src/lib.rs b/ceremonies/src/lib.rs index 80e58b03..c164ee49 100644 --- a/ceremonies/src/lib.rs +++ b/ceremonies/src/lib.rs @@ -153,9 +153,8 @@ pub mod pallet { ) == Reputation::VerifiedUnlinked, Error::::AttendanceUnverifiedOrAlreadyUsed ); - if Self::verify_attendee_signature(p.clone()).is_err() { - return Err(>::BadProofOfAttendanceSignature.into()) - }; + + ensure!(p.verify_signature(), Error::::BadProofOfAttendanceSignature); // this reputation must now be burned so it can not be used again >::insert( @@ -1707,18 +1706,6 @@ impl Pallet { Ok(result) } - fn verify_attendee_signature( - proof: ProofOfAttendance, - ) -> DispatchResult { - match proof.attendee_signature.verify( - &(proof.prover_public, proof.ceremony_index).encode()[..], - &proof.attendee_public, - ) { - true => Ok(()), - false => Err(>::BadAttendeeSignature.into()), - } - } - pub fn get_meetup_location( cc: CommunityCeremony, meetup_idx: MeetupIndexType, From e298373696e9e5f36cbff74e63cfef9c5354a7e6 Mon Sep 17 00:00:00 2001 From: Christian Langenbacher Date: Thu, 18 Jan 2024 16:02:57 +0100 Subject: [PATCH 4/7] [primitives/ceremonies] pass the attendee as borrow for the proof of attendance signed constructor --- primitives/src/ceremonies.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/primitives/src/ceremonies.rs b/primitives/src/ceremonies.rs index 7a4cbf5f..a95aa9be 100644 --- a/primitives/src/ceremonies.rs +++ b/primitives/src/ceremonies.rs @@ -243,7 +243,7 @@ where prover_public: AccountIdFor, cid: CommunityIdentifier, cindex: CeremonyIndexType, - attendee: Signer, + attendee: &Signer, ) -> Self where Signer: Pair, @@ -407,7 +407,7 @@ mod tests { alice.public().into(), Default::default(), 1, - alice, + &alice, ); assert!(proof.verify_signature()) From c5b080077027185428d377a1cf58558f7f16bd9e Mon Sep 17 00:00:00 2001 From: Christian Langenbacher Date: Thu, 18 Jan 2024 16:03:15 +0100 Subject: [PATCH 5/7] [ceremonies] use the new proof of attendance constructor in the tests --- ceremonies/src/tests.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/ceremonies/src/tests.rs b/ceremonies/src/tests.rs index 7170d417..c8ca4535 100644 --- a/ceremonies/src/tests.rs +++ b/ceremonies/src/tests.rs @@ -131,14 +131,7 @@ fn prove_attendance( cindex: CeremonyIndexType, attendee: &sr25519::Pair, ) -> TestProofOfAttendance { - let msg = (prover.clone(), cindex); - ProofOfAttendance { - prover_public: prover, - community_identifier: cid, - ceremony_index: cindex, - attendee_public: account_id(attendee), - attendee_signature: Signature::from(attendee.sign(&msg.encode())), - } + TestProofOfAttendance::signed(prover, cid, cindex, attendee) } /// Wrapper for EncointerCeremonies::register_participant that reduces boilerplate code. From 8d90177bfcfce4755ddc0bfd7deee62e49b5288b Mon Sep 17 00:00:00 2001 From: Christian Langenbacher Date: Thu, 18 Jan 2024 16:07:55 +0100 Subject: [PATCH 6/7] [primitives/ceremonies] fix clippy --- primitives/src/ceremonies.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/src/ceremonies.rs b/primitives/src/ceremonies.rs index a95aa9be..4d3ce691 100644 --- a/primitives/src/ceremonies.rs +++ b/primitives/src/ceremonies.rs @@ -235,7 +235,7 @@ where pub fn verify_signature(&self) -> bool { self.attendee_signature.verify( &(self.prover_public.clone(), self.ceremony_index).encode()[..], - &self.attendee_public.clone().into(), + &self.attendee_public, ) } From 5fdbda5241d06db3b90a8cf546314386af501288 Mon Sep 17 00:00:00 2001 From: Alain Brenzikofer Date: Tue, 20 Feb 2024 14:22:59 +0100 Subject: [PATCH 7/7] fmt --- ceremonies/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/ceremonies/src/lib.rs b/ceremonies/src/lib.rs index 1466ba8e..c95e22fe 100644 --- a/ceremonies/src/lib.rs +++ b/ceremonies/src/lib.rs @@ -156,7 +156,6 @@ pub mod pallet { ensure!(p.verify_signature(), Error::::BadProofOfAttendanceSignature); - // this reputation must now be burned so it can not be used again >::insert( (p.community_identifier, p.ceremony_index),