diff --git a/frame/bridge/relay-authorities/src/lib.rs b/frame/bridge/relay-authorities/src/lib.rs index ff897b3403..e247dcb6ed 100644 --- a/frame/bridge/relay-authorities/src/lib.rs +++ b/frame/bridge/relay-authorities/src/lib.rs @@ -830,22 +830,21 @@ where fn check_authorities_change_to_sync( term: Term, - mut authorities: Vec, + mut authorities_change_to_sync: Vec, ) -> DispatchResult { - ensure!( - term == >::get(), - >::TermMis - ); + ensure!(term == >::get(), >::TermMis); - let mut chain_authorities = >::get() + let mut next_authorities = >::get() + .ok_or(>::NextAuthoritiesNE)? + .next_authorities .into_iter() .map(|authority| authority.signer) .collect::>(); - authorities.sort(); - chain_authorities.sort(); + authorities_change_to_sync.sort(); + next_authorities.sort(); - if authorities == chain_authorities { + if authorities_change_to_sync == next_authorities { Ok(()) } else { Err(>::AuthoritiesMis)? diff --git a/frame/bridge/relay-authorities/src/mock.rs b/frame/bridge/relay-authorities/src/mock.rs index fab6acd23d..ed47115048 100644 --- a/frame/bridge/relay-authorities/src/mock.rs +++ b/frame/bridge/relay-authorities/src/mock.rs @@ -50,6 +50,9 @@ pub type RelayAuthorities = Module; pub type RelayAuthoritiesError = Error; +pub const DEFAULT_MMR_ROOT: H256 = H256([0; 32]); +pub const DEFAULT_SIGNATURE: [u8; 65] = [0; 65]; + impl_outer_origin! { pub enum Origin for Test {} } @@ -173,7 +176,7 @@ pub fn new_test_ext() -> TestExternalities { .assimilate_storage(&mut storage) .unwrap(); GenesisConfig:: { - authorities: vec![(9, Default::default(), 1)], + authorities: vec![(9, signer_of(9), 1)], } .assimilate_storage(&mut storage) .unwrap(); @@ -200,9 +203,13 @@ pub fn relay_authorities_events() -> Vec { } pub fn request_authority(account_id: AccountId) -> DispatchResult { - RelayAuthorities::request_authority(Origin::signed(account_id), 1, [0; 20]) + RelayAuthorities::request_authority(Origin::signed(account_id), 1, signer_of(account_id)) } pub fn request_authority_with_stake(account_id: AccountId, stake: Balance) -> DispatchResult { - RelayAuthorities::request_authority(Origin::signed(account_id), stake, [0; 20]) + RelayAuthorities::request_authority(Origin::signed(account_id), stake, signer_of(account_id)) +} + +pub fn signer_of(account_id: AccountId) -> [u8; 20] { + [account_id as _; 20] } diff --git a/frame/bridge/relay-authorities/src/test.rs b/frame/bridge/relay-authorities/src/test.rs index bc1fc5716d..97a78bd5f7 100644 --- a/frame/bridge/relay-authorities/src/test.rs +++ b/frame/bridge/relay-authorities/src/test.rs @@ -358,7 +358,7 @@ fn mmr_root_signed_event_should_work() { assert_ok!(RelayAuthorities::add_authority(Origin::root(), vec![1])); assert_ok!(RelayAuthorities::submit_signed_authorities( Origin::signed(9), - [0; 65] + DEFAULT_SIGNATURE )); RelayAuthorities::apply_authorities_change().unwrap(); @@ -371,20 +371,20 @@ fn mmr_root_signed_event_should_work() { assert_ok!(RelayAuthorities::submit_signed_mmr_root( Origin::signed(9), 10, - [0; 65], + DEFAULT_SIGNATURE, )); assert!(relay_authorities_events().is_empty()); assert_ok!(RelayAuthorities::submit_signed_mmr_root( Origin::signed(1), 10, - [0; 65], + DEFAULT_SIGNATURE, )); assert_eq!( relay_authorities_events(), vec![Event::relay_authorities(RawEvent::MMRRootSigned( 10, - Default::default(), - vec![(9, [0; 65]), (1, [0; 65])] + DEFAULT_MMR_ROOT, + vec![(9, DEFAULT_SIGNATURE), (1, DEFAULT_SIGNATURE)] ))] ); }); @@ -402,15 +402,15 @@ fn authorities_change_signed_event_should_work() { assert_ok!(RelayAuthorities::submit_signed_authorities( Origin::signed(9), - [0; 65] + DEFAULT_SIGNATURE )); assert_eq!( relay_authorities_events(), vec![Event::relay_authorities(RawEvent::AuthoritiesChangeSigned( 0, - vec![Default::default(), Default::default()], - vec![(9, [0; 65])] + vec![signer_of(9), signer_of(1)], + vec![(9, DEFAULT_SIGNATURE)] ))] ); @@ -424,13 +424,13 @@ fn authorities_change_signed_event_should_work() { assert_ok!(RelayAuthorities::submit_signed_authorities( Origin::signed(9), - [0; 65] + DEFAULT_SIGNATURE )); // Not enough signatures, `1 / 2 < 60%` assert!(relay_authorities_events().is_empty()); assert_ok!(RelayAuthorities::submit_signed_authorities( Origin::signed(1), - [0; 65] + DEFAULT_SIGNATURE )); // Enough signatures, `2 / 2 > 60%` @@ -438,8 +438,8 @@ fn authorities_change_signed_event_should_work() { relay_authorities_events(), vec![Event::relay_authorities(RawEvent::AuthoritiesChangeSigned( 1, - vec![Default::default(), Default::default(), Default::default()], - vec![(9, [0; 65]), (1, [0; 65])] + vec![signer_of(9), signer_of(1), signer_of(2)], + vec![(9, DEFAULT_SIGNATURE), (1, DEFAULT_SIGNATURE)] ))] ); }); @@ -621,3 +621,51 @@ fn lock_after_authorities_change_should_work() { assert!(Ring::locks(2).is_empty()); }); } + +#[test] +fn check_authorities_change_to_sync_should_work() { + new_test_ext().execute_with(|| { + assert_ok!(request_authority(1)); + assert_ok!(request_authority(2)); + assert_ok!(request_authority(3)); + assert_ok!(RelayAuthorities::add_authority( + Origin::root(), + vec![1, 2, 3] + )); + RelayAuthorities::apply_authorities_change().unwrap(); + + assert_err!( + RelayAuthorities::check_authorities_change_to_sync( + 0, + vec![signer_of(1), signer_of(2), signer_of(3)] + ), + RelayAuthoritiesError::AuthoritiesMis + ); + assert_err!( + RelayAuthorities::check_authorities_change_to_sync( + 0, + vec![signer_of(3), signer_of(1), signer_of(2)] + ), + RelayAuthoritiesError::AuthoritiesMis + ); + assert_err!( + RelayAuthorities::check_authorities_change_to_sync( + 0, + vec![signer_of(3), signer_of(2), signer_of(1)] + ), + RelayAuthoritiesError::AuthoritiesMis + ); + assert_ok!(RelayAuthorities::check_authorities_change_to_sync( + 0, + vec![signer_of(9), signer_of(1), signer_of(2), signer_of(3)] + )); + assert_ok!(RelayAuthorities::check_authorities_change_to_sync( + 0, + vec![signer_of(9), signer_of(3), signer_of(2), signer_of(1)] + )); + assert_ok!(RelayAuthorities::check_authorities_change_to_sync( + 0, + vec![signer_of(1), signer_of(3), signer_of(9), signer_of(2)] + )); + }); +}