diff --git a/pallets/identity/src/mock.rs b/pallets/identity/src/mock.rs index 3a78a4356ff8408525b4073280902fc0f966a606..9556974392d736e30576b21574395dfe18658c44 100644 --- a/pallets/identity/src/mock.rs +++ b/pallets/identity/src/mock.rs @@ -21,12 +21,12 @@ use frame_support::{ traits::{Everything, GenesisBuild, OnFinalize, OnInitialize}, }; use frame_system as system; -use sp_core::H256; +use sp_core::{Pair, H256}; use sp_keystore::{testing::KeyStore, KeystoreExt}; use sp_runtime::{ - testing::{Header, UintAuthorityId}, + testing::Header, traits::{BlakeTwo256, IdentityLookup}, - MultiSignature, + MultiSignature, MultiSigner, }; use std::sync::Arc; @@ -36,10 +36,9 @@ pub type Signature = MultiSignature; pub type AccountPublic = <Signature as Verify>::Signer; pub type AccountId = <AccountPublic as IdentifyAccount>::AccountId; -type AccountIdOf<Test> = <Test as frame_system::Config>::AccountId; - -fn account(id: u8) -> AccountIdOf<Test> { - [id; 32].into() +fn account(id: u8) -> AccountId { + let pair = sp_core::sr25519::Pair::from_seed(&[id; 32]); + MultiSigner::Sr25519(pair.public()).into_account() } // Configure a mock runtime to test the pallet. diff --git a/pallets/identity/src/tests.rs b/pallets/identity/src/tests.rs index ea495479017617d449f012a2fc7e680cdb0e23bc..f04d9d7cb9065be4d5602715021ea48d7c930fe4 100644 --- a/pallets/identity/src/tests.rs +++ b/pallets/identity/src/tests.rs @@ -21,9 +21,31 @@ use crate::{ }; use codec::Encode; use frame_support::{assert_noop, assert_ok}; -use sp_runtime::testing::TestSignature; +use sp_core::sr25519::Pair as KeyPair; +use sp_core::Pair; +use sp_runtime::{traits::IdentifyAccount, MultiSignature, MultiSigner}; -type IdtyVal = IdtyValue<u64, u64, ()>; +type IdtyVal = IdtyValue<u64, AccountId, ()>; + +// Store the account id and the key pair to sign payload +struct Account { + id: AccountId, + signer: KeyPair, +} + +// Create an Account given a u8 +fn account(id: u8) -> Account { + let pair = sp_core::sr25519::Pair::from_seed(&[id; 32]); + Account { + id: MultiSigner::Sr25519(pair.public()).into_account(), + signer: pair, + } +} + +// Sign a payload using a key pair +fn test_signature(key_pair: KeyPair, payload: Vec<u8>) -> MultiSignature { + MultiSignature::Sr25519(key_pair.sign(&payload)) +} fn alice() -> GenesisIdty<Test> { GenesisIdty { @@ -33,7 +55,7 @@ fn alice() -> GenesisIdty<Test> { data: (), next_creatable_identity_on: 0, old_owner_key: None, - owner_key: 1, + owner_key: account(1).id, removable_on: 0, status: crate::IdtyStatus::Validated, }, @@ -48,7 +70,7 @@ fn bob() -> GenesisIdty<Test> { data: (), next_creatable_identity_on: 0, old_owner_key: None, - owner_key: 2, + owner_key: account(2).id, removable_on: 0, status: crate::IdtyStatus::Validated, }, @@ -75,11 +97,14 @@ fn test_create_identity_ok() { run_to_block(1); // Alice should be able to create an identity - assert_ok!(Identity::create_identity(RuntimeOrigin::signed(1), 2)); + assert_ok!(Identity::create_identity( + RuntimeOrigin::signed(account(1).id), + account(2).id + )); System::assert_has_event(RuntimeEvent::Identity(crate::Event::IdtyCreated { idty_index: 2, - owner_key: 2, + owner_key: account(2).id, })); }); } @@ -94,7 +119,10 @@ fn test_create_identity_but_not_confirm_it() { run_to_block(1); // Alice should be able to create an identity - assert_ok!(Identity::create_identity(RuntimeOrigin::signed(1), 2)); + assert_ok!(Identity::create_identity( + RuntimeOrigin::signed(account(1).id), + account(2).id + )); // The identity shoud expire in blocs #3 run_to_block(3); @@ -105,11 +133,14 @@ fn test_create_identity_but_not_confirm_it() { // We shoud be able to recreate the identity run_to_block(4); - assert_ok!(Identity::create_identity(RuntimeOrigin::signed(1), 2)); + assert_ok!(Identity::create_identity( + RuntimeOrigin::signed(account(1).id), + account(2).id + )); System::assert_has_event(RuntimeEvent::Identity(crate::Event::IdtyCreated { idty_index: 3, - owner_key: 2, + owner_key: account(2).id, })); }); } @@ -124,11 +155,14 @@ fn test_idty_creation_period() { run_to_block(1); // Alice should be able to create an identity - assert_ok!(Identity::create_identity(RuntimeOrigin::signed(1), 2)); + assert_ok!(Identity::create_identity( + RuntimeOrigin::signed(account(1).id), + account(2).id + )); System::assert_has_event(RuntimeEvent::Identity(crate::Event::IdtyCreated { idty_index: 2, - owner_key: 2, + owner_key: account(2).id, })); assert_eq!(Identity::identity(1).unwrap().next_creatable_identity_on, 4); @@ -136,21 +170,25 @@ fn test_idty_creation_period() { // Alice cannot create a new identity before block #4 run_to_block(2); assert_eq!( - Identity::create_identity(RuntimeOrigin::signed(1), 3), + Identity::create_identity(RuntimeOrigin::signed(account(1).id), account(3).id), Err(Error::<Test>::NotRespectIdtyCreationPeriod.into()) ); // Alice should be able to create a second identity after block #4 run_to_block(4); - assert_ok!(Identity::create_identity(RuntimeOrigin::signed(1), 3)); + assert_ok!(Identity::create_identity( + RuntimeOrigin::signed(account(1).id), + account(3).id + )); System::assert_has_event(RuntimeEvent::Identity(crate::Event::IdtyCreated { idty_index: 3, - owner_key: 3, + owner_key: account(3).id, })); }); } +// #[test] fn test_change_owner_key() { new_test_ext(IdentityConfig { @@ -158,7 +196,7 @@ fn test_change_owner_key() { }) .execute_with(|| { let genesis_hash = System::block_hash(0); - let old_owner_key = 1u64; + let old_owner_key = account(1).id; let mut new_key_payload = NewOwnerKeyPayload { genesis_hash: &genesis_hash, idty_index: 1u64, @@ -169,25 +207,29 @@ fn test_change_owner_key() { run_to_block(1); // Verify genesis data - assert_eq!(System::sufficients(&1), 1); - assert_eq!(System::sufficients(&10), 0); - + assert_eq!(System::sufficients(&account(1).id), 1); + assert_eq!(System::sufficients(&account(10).id), 0); // Caller should have an associated identity assert_noop!( Identity::change_owner_key( - RuntimeOrigin::signed(42), - 10, - TestSignature(10, (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode()) + RuntimeOrigin::signed(account(42).id), + account(10).id, + test_signature( + account(10).signer, + (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload.clone()).encode() + ) ), Error::<Test>::IdtyIndexNotFound ); - // Payload must be signed by the new key assert_noop!( Identity::change_owner_key( - RuntimeOrigin::signed(1), - 10, - TestSignature(42, (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode()) + RuntimeOrigin::signed(account(1).id), + account(10).id, + test_signature( + account(42).signer, + (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload.clone()).encode() + ) ), Error::<Test>::InvalidNewOwnerKeySig ); @@ -195,9 +237,9 @@ fn test_change_owner_key() { // Payload must be prefixed assert_noop!( Identity::change_owner_key( - RuntimeOrigin::signed(1), - 10, - TestSignature(10, new_key_payload.encode()) + RuntimeOrigin::signed(account(1).id), + account(10).id, + test_signature(account(10).signer, new_key_payload.clone().encode()) ), Error::<Test>::InvalidNewOwnerKeySig ); @@ -205,46 +247,53 @@ fn test_change_owner_key() { // New owner key should not be used by another identity assert_noop!( Identity::change_owner_key( - RuntimeOrigin::signed(1), - 2, - TestSignature(2, (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode()) + RuntimeOrigin::signed(account(1).id), + account(2).id, + test_signature( + account(2).signer, + (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload.clone()).encode() + ) ), Error::<Test>::OwnerKeyAlreadyUsed ); // Alice can change her owner key assert_ok!(Identity::change_owner_key( - RuntimeOrigin::signed(1), - 10, - TestSignature(10, (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode()) + RuntimeOrigin::signed(account(1).id), + account(10).id, + test_signature( + account(10).signer, + (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload.clone()).encode() + ) )); assert_eq!( Identity::identity(1), Some(IdtyVal { data: (), next_creatable_identity_on: 0, - old_owner_key: Some((1, 1)), - owner_key: 10, + old_owner_key: Some((account(1).id, 1)), + owner_key: account(10).id, removable_on: 0, status: crate::IdtyStatus::Validated, }) ); // Alice still sufficient - assert_eq!(System::sufficients(&1), 1); + assert_eq!(System::sufficients(&account(1).id), 1); // New owner key should become a sufficient account - assert_eq!(System::sufficients(&10), 1); + assert_eq!(System::sufficients(&account(10).id), 1); run_to_block(2); - + // // Alice can't re-change her owner key too early - new_key_payload.old_owner_key = &10; + let old = account(10).id; + new_key_payload.old_owner_key = &old; assert_noop!( Identity::change_owner_key( - RuntimeOrigin::signed(10), - 100, - TestSignature( - 100, - (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode() + RuntimeOrigin::signed(account(10).id), + account(100).id, + test_signature( + account(100).signer, + (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload.clone()).encode() ) ), Error::<Test>::OwnerKeyAlreadyRecentlyChanged @@ -253,27 +302,27 @@ fn test_change_owner_key() { // Alice can re-change her owner key after ChangeOwnerKeyPeriod blocs run_to_block(2 + <Test as crate::Config>::ChangeOwnerKeyPeriod::get()); assert_ok!(Identity::change_owner_key( - RuntimeOrigin::signed(10), - 100, - TestSignature( - 100, - (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode() + RuntimeOrigin::signed(account(10).id), + account(100).id, + test_signature( + account(100).signer, + (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload.clone()).encode() ) )); // Old old owner key should not be sufficient anymore - assert_eq!(System::sufficients(&1), 0); + assert_eq!(System::sufficients(&account(1).id), 0); // Old owner key should still sufficient - assert_eq!(System::sufficients(&10), 1); + assert_eq!(System::sufficients(&account(10).id), 1); // New owner key should become a sufficient account - assert_eq!(System::sufficients(&100), 1); + assert_eq!(System::sufficients(&account(100).id), 1); // Revoke identity 1 assert_ok!(Identity::revoke_identity( - RuntimeOrigin::signed(42), + RuntimeOrigin::signed(account(42).id), 1, - 100, - TestSignature( - 100, + account(100).id, + test_signature( + account(100).signer, ( REVOCATION_PAYLOAD_PREFIX, RevocationPayload { @@ -285,9 +334,9 @@ fn test_change_owner_key() { ) )); // Old owner key should not be sufficient anymore - assert_eq!(System::sufficients(&10), 0); + assert_eq!(System::sufficients(&account(10).id), 0); // Last owner key should not be sufficient anymore - assert_eq!(System::sufficients(&100), 0); + assert_eq!(System::sufficients(&account(100).id), 0); }); } @@ -301,7 +350,7 @@ fn test_idty_revocation_with_old_key() { let new_key_payload = NewOwnerKeyPayload { genesis_hash: &genesis_hash, idty_index: 1u64, - old_owner_key: &1u64, + old_owner_key: &account(1).id, }; let revocation_payload = RevocationPayload { idty_index: 1u64, @@ -313,22 +362,28 @@ fn test_idty_revocation_with_old_key() { // Change alice owner key assert_ok!(Identity::change_owner_key( - RuntimeOrigin::signed(1), - 10, - TestSignature(10, (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode()) + RuntimeOrigin::signed(account(1).id), + account(10).id, + test_signature( + account(10).signer, + (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode() + ) )); assert!(Identity::identity(&1).is_some()); let idty_val = Identity::identity(&1).unwrap(); - assert_eq!(idty_val.owner_key, 10); - assert_eq!(idty_val.old_owner_key, Some((1, 1))); + assert_eq!(idty_val.owner_key, account(10).id); + assert_eq!(idty_val.old_owner_key, Some((account(1).id, 1))); // We should be able to revoke Alice identity with old key run_to_block(2); assert_ok!(Identity::revoke_identity( - RuntimeOrigin::signed(42), + RuntimeOrigin::signed(account(42).id), 1, - 1, - TestSignature(1, (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode()) + account(1).id, + test_signature( + account(1).signer, + (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode() + ) )); //run_to_block(2 + <Test as crate::Config>::ChangeOwnerKeyPeriod::get()); @@ -345,7 +400,7 @@ fn test_idty_revocation_with_old_key_after_old_key_expiration() { let new_key_payload = NewOwnerKeyPayload { genesis_hash: &genesis_hash, idty_index: 1u64, - old_owner_key: &1u64, + old_owner_key: &account(1).id, }; let revocation_payload = RevocationPayload { idty_index: 1u64, @@ -357,23 +412,29 @@ fn test_idty_revocation_with_old_key_after_old_key_expiration() { // Change alice owner key assert_ok!(Identity::change_owner_key( - RuntimeOrigin::signed(1), - 10, - TestSignature(10, (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode()) + RuntimeOrigin::signed(account(1).id), + account(10).id, + test_signature( + account(10).signer, + (NEW_OWNER_KEY_PAYLOAD_PREFIX, new_key_payload).encode() + ) )); assert!(Identity::identity(&1).is_some()); let idty_val = Identity::identity(&1).unwrap(); - assert_eq!(idty_val.owner_key, 10); - assert_eq!(idty_val.old_owner_key, Some((1, 1))); + assert_eq!(idty_val.owner_key, account(10).id); + assert_eq!(idty_val.old_owner_key, Some((account(1).id, 1))); // We should not be able to revoke Alice identity with old key after ChangeOwnerKeyPeriod run_to_block(2 + <Test as crate::Config>::ChangeOwnerKeyPeriod::get()); assert_noop!( Identity::revoke_identity( - RuntimeOrigin::signed(42), + RuntimeOrigin::signed(account(42).id), 1, - 1, - TestSignature(1, (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode()) + account(1).id, + test_signature( + account(1).signer, + (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode() + ) ), Error::<Test>::InvalidRevocationKey ); @@ -397,10 +458,13 @@ fn test_idty_revocation() { // Payload must be signed by the right identity assert_eq!( Identity::revoke_identity( - RuntimeOrigin::signed(1), + RuntimeOrigin::signed(account(1).id), 1, - 42, - TestSignature(42, (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode()) + account(42).id, + test_signature( + account(42).signer, + (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode() + ) ), Err(Error::<Test>::InvalidRevocationKey.into()) ); @@ -408,24 +472,27 @@ fn test_idty_revocation() { // Payload must be prefixed assert_eq!( Identity::revoke_identity( - RuntimeOrigin::signed(1), - 1, + RuntimeOrigin::signed(account(1).id), 1, - TestSignature(1, revocation_payload.encode()) + account(1).id, + test_signature(account(1).signer, revocation_payload.encode()) ), Err(Error::<Test>::InvalidRevocationSig.into()) ); // Anyone can submit a revocation payload assert_ok!(Identity::revoke_identity( - RuntimeOrigin::signed(42), + RuntimeOrigin::signed(account(42).id), 1, - 1, - TestSignature(1, (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode()) + account(1).id, + test_signature( + account(1).signer, + (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode() + ) )); System::assert_has_event(RuntimeEvent::System(frame_system::Event::KilledAccount { - account: 1, + account: account(1).id, })); System::assert_has_event(RuntimeEvent::Identity(crate::Event::IdtyRemoved { idty_index: 1, @@ -436,10 +503,13 @@ fn test_idty_revocation() { // The identity no longer exists assert_eq!( Identity::revoke_identity( - RuntimeOrigin::signed(1), + RuntimeOrigin::signed(account(1).id), 1, - 1, - TestSignature(1, (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode()) + account(1).id, + test_signature( + account(1).signer, + (REVOCATION_PAYLOAD_PREFIX, revocation_payload).encode() + ) ), Err(Error::<Test>::IdtyNotFound.into()) );