This repository has been archived by the owner on Nov 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
frame/authority-discovery: Have authorities() return both current and next #6788
Merged
Merged
Changes from 4 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
63b4d0a
frame/authority-discovery: Have authorities() return both current and…
mxinden 963d67f
frame/authority-discovery: Deduplicate authority ids
mxinden 640db68
frame/authority-discovery: Don't dedup on_genesis authorities
mxinden 85224d2
Merge branch 'paritytech/master' into auth-disc-next-session
mxinden e08f0c3
frame/authority-discovery: Remove mut and sort on comparison in tests
mxinden 910183d
frame/authority-discovery: Use BTreeSet for deduplication
mxinden 42ba23e
Merge branch 'paritytech/master' into auth-disc-next-session
mxinden 6e3115a
Merge branch 'paritytech/master' into auth-disc-next-session
mxinden File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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,22 @@ 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<_>>(); | ||||||||||||
|
||||||||||||
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); | ||||||||||||
} | ||||||||||||
} | ||||||||||||
|
||||||||||||
|
@@ -192,12 +197,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 +212,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() | ||||||||||||
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
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 +248,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()); | ||||||||||||
}); | ||||||||||||
} | ||||||||||||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Probably faster?