-
Notifications
You must be signed in to change notification settings - Fork 2.6k
frame/authority-discovery: Have authorities() return both current and next #6788
Changes from 2 commits
63b4d0a
963d67f
640db68
85224d2
e08f0c3
910183d
42ba23e
6e3115a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -32,7 +32,7 @@ pub trait Trait: frame_system::Trait + pallet_session::Trait {} | |||||||||||||||||
|
|
||||||||||||||||||
| decl_storage! { | ||||||||||||||||||
| trait Store for Module<T: Trait> as AuthorityDiscovery { | ||||||||||||||||||
| /// Keys of the current authority set. | ||||||||||||||||||
| /// Keys of the current and next authority set. | ||||||||||||||||||
| Keys get(fn keys): Vec<AuthorityId>; | ||||||||||||||||||
| } | ||||||||||||||||||
| add_extra_genesis { | ||||||||||||||||||
|
|
@@ -47,7 +47,7 @@ decl_module! { | |||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| impl<T: Trait> Module<T> { | ||||||||||||||||||
| /// Retrieve authority identifiers of the current authority set. | ||||||||||||||||||
| /// Retrieve authority identifiers of the current and next authority set. | ||||||||||||||||||
| pub fn authorities() -> Vec<AuthorityId> { | ||||||||||||||||||
| Keys::get() | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
@@ -71,17 +71,24 @@ impl<T: Trait> pallet_session::OneSessionHandler<T::AccountId> for Module<T> { | |||||||||||||||||
| where | ||||||||||||||||||
| I: Iterator<Item = (&'a T::AccountId, Self::Key)>, | ||||||||||||||||||
| { | ||||||||||||||||||
| let keys = authorities.map(|x| x.1).collect::<Vec<_>>(); | ||||||||||||||||||
| let mut keys = authorities.map(|x| x.1).collect::<Vec<_>>(); | ||||||||||||||||||
| keys.sort(); | ||||||||||||||||||
| keys.dedup(); | ||||||||||||||||||
|
|
||||||||||||||||||
| Self::initialize_keys(&keys); | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| fn on_new_session<'a, I: 'a>(changed: bool, validators: I, _queued_validators: I) | ||||||||||||||||||
| fn on_new_session<'a, I: 'a>(changed: bool, validators: I, queued_validators: I) | ||||||||||||||||||
| where | ||||||||||||||||||
| I: Iterator<Item = (&'a T::AccountId, Self::Key)>, | ||||||||||||||||||
| { | ||||||||||||||||||
| // Remember who the authorities are for the new session. | ||||||||||||||||||
| // Remember who the authorities are for the new and next session. | ||||||||||||||||||
| if changed { | ||||||||||||||||||
| Keys::put(validators.map(|x| x.1).collect::<Vec<_>>()); | ||||||||||||||||||
| let mut keys = validators.chain(queued_validators).map(|x| x.1).collect::<Vec<_>>(); | ||||||||||||||||||
| keys.sort(); | ||||||||||||||||||
| keys.dedup(); | ||||||||||||||||||
|
|
||||||||||||||||||
| Keys::put(keys); | ||||||||||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Probably faster? |
||||||||||||||||||
| } | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
|
|
@@ -192,12 +199,13 @@ mod tests { | |||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| #[test] | ||||||||||||||||||
| fn authorities_returns_current_authority_set() { | ||||||||||||||||||
| // The whole authority discovery module ignores account ids, but we still need it for | ||||||||||||||||||
| // `pallet_session::OneSessionHandler::on_new_session`, thus its safe to use the same value everywhere. | ||||||||||||||||||
| fn authorities_returns_current_and_next_authority_set() { | ||||||||||||||||||
| // The whole authority discovery module ignores account ids, but we still need them for | ||||||||||||||||||
| // `pallet_session::OneSessionHandler::on_new_session`, thus its safe to use the same value | ||||||||||||||||||
| // everywhere. | ||||||||||||||||||
| let account_id = AuthorityPair::from_seed_slice(vec![10; 32].as_ref()).unwrap().public(); | ||||||||||||||||||
|
|
||||||||||||||||||
| let first_authorities: Vec<AuthorityId> = vec![0, 1].into_iter() | ||||||||||||||||||
| let mut first_authorities: Vec<AuthorityId> = vec![0, 1].into_iter() | ||||||||||||||||||
| .map(|i| AuthorityPair::from_seed_slice(vec![i; 32].as_ref()).unwrap().public()) | ||||||||||||||||||
| .map(AuthorityId::from) | ||||||||||||||||||
| .collect(); | ||||||||||||||||||
|
|
@@ -206,12 +214,21 @@ mod tests { | |||||||||||||||||
| .map(|i| AuthorityPair::from_seed_slice(vec![i; 32].as_ref()).unwrap().public()) | ||||||||||||||||||
| .map(AuthorityId::from) | ||||||||||||||||||
| .collect(); | ||||||||||||||||||
|
|
||||||||||||||||||
| // Needed for `pallet_session::OneSessionHandler::on_new_session`. | ||||||||||||||||||
| let second_authorities_and_account_ids: Vec<(&AuthorityId, AuthorityId)> = second_authorities.clone() | ||||||||||||||||||
| let second_authorities_and_account_ids = second_authorities.clone() | ||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should technically have the same set as the first one, but anyhow fine substrate/frame/session/src/lib.rs Lines 225 to 229 in 549050b
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, interesting. As far as I can tell the second session being the same as the first is a stricter guarantee than what is assumed here, thus I would keep it as is. Please correct me in case I am missing something. |
||||||||||||||||||
| .into_iter() | ||||||||||||||||||
| .map(|id| (&account_id, id)) | ||||||||||||||||||
| .collect::<Vec<(&AuthorityId, AuthorityId)> >(); | ||||||||||||||||||
|
|
||||||||||||||||||
| let mut third_authorities: Vec<AuthorityId> = vec![4, 5].into_iter() | ||||||||||||||||||
| .map(|i| AuthorityPair::from_seed_slice(vec![i; 32].as_ref()).unwrap().public()) | ||||||||||||||||||
| .map(AuthorityId::from) | ||||||||||||||||||
| .collect(); | ||||||||||||||||||
| // Needed for `pallet_session::OneSessionHandler::on_new_session`. | ||||||||||||||||||
| let third_authorities_and_account_ids = third_authorities.clone() | ||||||||||||||||||
| .into_iter() | ||||||||||||||||||
| .map(|id| (&account_id, id)) | ||||||||||||||||||
| .collect::<Vec<(&AuthorityId, AuthorityId)> >(); | ||||||||||||||||||
|
|
||||||||||||||||||
| // Build genesis. | ||||||||||||||||||
| let mut t = frame_system::GenesisConfig::default() | ||||||||||||||||||
|
|
@@ -233,23 +250,51 @@ mod tests { | |||||||||||||||||
| AuthorityDiscovery::on_genesis_session( | ||||||||||||||||||
| first_authorities.iter().map(|id| (id, id.clone())) | ||||||||||||||||||
| ); | ||||||||||||||||||
| first_authorities.sort(); | ||||||||||||||||||
| assert_eq!(first_authorities, AuthorityDiscovery::authorities()); | ||||||||||||||||||
|
|
||||||||||||||||||
| // When `changed` set to false, the authority set should not be updated. | ||||||||||||||||||
| AuthorityDiscovery::on_new_session( | ||||||||||||||||||
| false, | ||||||||||||||||||
| second_authorities_and_account_ids.clone().into_iter(), | ||||||||||||||||||
| vec![].into_iter(), | ||||||||||||||||||
| third_authorities_and_account_ids.clone().into_iter(), | ||||||||||||||||||
| ); | ||||||||||||||||||
| assert_eq!( | ||||||||||||||||||
| first_authorities, | ||||||||||||||||||
| AuthorityDiscovery::authorities(), | ||||||||||||||||||
| "Expected authority set not to change as `changed` was set to false.", | ||||||||||||||||||
| ); | ||||||||||||||||||
| assert_eq!(first_authorities, AuthorityDiscovery::authorities()); | ||||||||||||||||||
|
|
||||||||||||||||||
| // When `changed` set to true, the authority set should be updated. | ||||||||||||||||||
| AuthorityDiscovery::on_new_session( | ||||||||||||||||||
| true, | ||||||||||||||||||
| second_authorities_and_account_ids.into_iter(), | ||||||||||||||||||
| vec![].into_iter(), | ||||||||||||||||||
| third_authorities_and_account_ids.clone().into_iter(), | ||||||||||||||||||
| ); | ||||||||||||||||||
| let mut second_and_third_authorities = second_authorities.iter() | ||||||||||||||||||
| .chain(third_authorities.iter()) | ||||||||||||||||||
| .cloned() | ||||||||||||||||||
| .collect::<Vec<AuthorityId>>(); | ||||||||||||||||||
| second_and_third_authorities.sort(); | ||||||||||||||||||
| assert_eq!( | ||||||||||||||||||
| second_and_third_authorities, | ||||||||||||||||||
| AuthorityDiscovery::authorities(), | ||||||||||||||||||
| "Expected authority set to contain both the authorities of the new as well as the \ | ||||||||||||||||||
| next session." | ||||||||||||||||||
| ); | ||||||||||||||||||
|
|
||||||||||||||||||
| // With overlapping authority sets, `authorities()` should return a deduplicated set. | ||||||||||||||||||
| AuthorityDiscovery::on_new_session( | ||||||||||||||||||
| true, | ||||||||||||||||||
| third_authorities_and_account_ids.clone().into_iter(), | ||||||||||||||||||
| third_authorities_and_account_ids.clone().into_iter(), | ||||||||||||||||||
| ); | ||||||||||||||||||
| third_authorities.sort(); | ||||||||||||||||||
| assert_eq!( | ||||||||||||||||||
| third_authorities, | ||||||||||||||||||
| AuthorityDiscovery::authorities(), | ||||||||||||||||||
| "Expected authority set to be deduplicated." | ||||||||||||||||||
| ); | ||||||||||||||||||
| assert_eq!(second_authorities, AuthorityDiscovery::authorities()); | ||||||||||||||||||
| }); | ||||||||||||||||||
| } | ||||||||||||||||||
| } | ||||||||||||||||||
Uh oh!
There was an error while loading. Please reload this page.