-
Notifications
You must be signed in to change notification settings - Fork 1.2k
parachain-template: genesis config presets added #4739
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
d5f9643
089f7a5
1f7eea9
bd7ba7a
9dfe164
399ca86
2e0c2e9
31801e8
a7a4ef9
dc945c3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change | ||
|---|---|---|---|---|
| @@ -0,0 +1,165 @@ | ||||
| use cumulus_primitives_core::ParaId; | ||||
| use sp_std::prelude::*; | ||||
|
|
||||
| pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; | ||||
|
|
||||
| use crate::{AccountId, SessionKeys, Signature, EXISTENTIAL_DEPOSIT}; | ||||
| use serde_json::Value; | ||||
| use sp_core::{sr25519, Pair, Public}; | ||||
| use sp_runtime::traits::{IdentifyAccount, Verify}; | ||||
| #[cfg(not(feature = "std"))] | ||||
| use sp_std::alloc::format; | ||||
|
|
||||
| /// Preset configuration name for a local testnet environment. | ||||
| pub const PRESET_LOCAL_TESTNET: &str = "local_testnet"; | ||||
|
|
||||
| /// Preset configuration name for a development environment. | ||||
| pub const PRESET_DEVELOPMENT: &str = "development"; | ||||
michalkucharczyk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||
|
|
||||
| type AccountPublic = <Signature as Verify>::Signer; | ||||
|
|
||||
| /// The default XCM version to set in genesis config. | ||||
| const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION; | ||||
|
|
||||
| /// Helper function to generate a crypto pair from seed | ||||
| pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public { | ||||
| TPublic::Pair::from_string(&format!("//{}", seed), None) | ||||
| .expect("static values are valid; qed") | ||||
| .public() | ||||
| } | ||||
|
|
||||
| /// Generate collator keys from seed. | ||||
| /// | ||||
| /// This function's return type must always match the session keys of the chain in tuple format. | ||||
| pub fn get_collator_keys_from_seed(seed: &str) -> AuraId { | ||||
| get_from_seed::<AuraId>(seed) | ||||
| } | ||||
|
|
||||
| /// Helper function to generate an account ID from seed | ||||
| pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId | ||||
| where | ||||
| AccountPublic: From<<TPublic::Pair as Pair>::Public>, | ||||
| { | ||||
| AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account() | ||||
| } | ||||
|
|
||||
| /// Generate the session keys from individual elements. | ||||
| /// | ||||
| /// The input must be a tuple of individual keys (a single arg for now since we have just one key). | ||||
| pub fn template_session_keys(keys: AuraId) -> SessionKeys { | ||||
| SessionKeys { aura: keys } | ||||
| } | ||||
|
|
||||
| fn testnet_genesis( | ||||
| invulnerables: Vec<(AccountId, AuraId)>, | ||||
| endowed_accounts: Vec<AccountId>, | ||||
| root: AccountId, | ||||
| id: ParaId, | ||||
| ) -> Value { | ||||
| serde_json::json!({ | ||||
| "balances": { | ||||
| "balances": endowed_accounts.iter().cloned().map(|k| (k, 1u64 << 60)).collect::<Vec<_>>(), | ||||
| }, | ||||
| "parachainInfo": { | ||||
| "parachainId": id, | ||||
| }, | ||||
| "collatorSelection": { | ||||
| "invulnerables": invulnerables.iter().cloned().map(|(acc, _)| acc).collect::<Vec<_>>(), | ||||
| "candidacyBond": EXISTENTIAL_DEPOSIT * 16, | ||||
| }, | ||||
| "session": { | ||||
| "keys": invulnerables | ||||
| .into_iter() | ||||
| .map(|(acc, aura)| { | ||||
| ( | ||||
| acc.clone(), // account id | ||||
| acc, // validator id | ||||
| template_session_keys(aura), // session keys | ||||
| ) | ||||
| }) | ||||
| .collect::<Vec<_>>(), | ||||
| }, | ||||
| "polkadotXcm": { | ||||
| "safeXcmVersion": Some(SAFE_XCM_VERSION), | ||||
| }, | ||||
| "sudo": { "key": Some(root) } | ||||
| }) | ||||
| } | ||||
|
|
||||
| fn local_testnet_genesis() -> Value { | ||||
| testnet_genesis( | ||||
| // initial collators. | ||||
| vec![ | ||||
| ( | ||||
| get_account_id_from_seed::<sr25519::Public>("Alice"), | ||||
| get_collator_keys_from_seed("Alice"), | ||||
| ), | ||||
| ( | ||||
| get_account_id_from_seed::<sr25519::Public>("Bob"), | ||||
| get_collator_keys_from_seed("Bob"), | ||||
| ), | ||||
| ], | ||||
| vec![ | ||||
| get_account_id_from_seed::<sr25519::Public>("Alice"), | ||||
|
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. Ah i have seen this crap in a lot of places being copy pasted 🙈 Similarly, I have what I think is a better way in #5117:
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. I like it. Not sure however, if Some common parts need to be extracted, probably the accounts in presets can be unified somehow.
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. @iulianbarbu this is a pretty easy one for you to pick up :)
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. @kianenigma I am a bit late to the party. Based on the context on this thread I get that we want to do something like I do not get the context around
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. It is about exporting that from the frame main library: polkadot-sdk/substrate/frame/src/lib.rs Line 171 in e002e31
Which was initially proposed by @kianenigma in this (not merged) #5117 PR.
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. re-export it from 'frame' as well for better discover-ability basically means that you don't need extra
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. I see now. Thanks!
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.
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. I am trying re-export
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. No, I am not doing a similar thing. |
||||
| get_account_id_from_seed::<sr25519::Public>("Bob"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Charlie"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Dave"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Eve"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Ferdie"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Alice//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Bob//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Charlie//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Dave//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Eve//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"), | ||||
| ], | ||||
| get_account_id_from_seed::<sr25519::Public>("Alice"), | ||||
| 1000.into(), | ||||
| ) | ||||
| } | ||||
|
|
||||
| fn development_config_genesis() -> Value { | ||||
| testnet_genesis( | ||||
| // initial collators. | ||||
| vec![ | ||||
| ( | ||||
| get_account_id_from_seed::<sr25519::Public>("Alice"), | ||||
| get_collator_keys_from_seed("Alice"), | ||||
| ), | ||||
| ( | ||||
| get_account_id_from_seed::<sr25519::Public>("Bob"), | ||||
| get_collator_keys_from_seed("Bob"), | ||||
| ), | ||||
| ], | ||||
| vec![ | ||||
| get_account_id_from_seed::<sr25519::Public>("Alice"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Bob"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Charlie"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Dave"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Eve"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Ferdie"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Alice//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Bob//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Charlie//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Dave//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Eve//stash"), | ||||
| get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"), | ||||
| ], | ||||
| get_account_id_from_seed::<sr25519::Public>("Alice"), | ||||
| 1000.into(), | ||||
| ) | ||||
| } | ||||
|
|
||||
| /// Provides the JSON representation of predefined genesis config for given `id`. | ||||
| pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option<sp_std::vec::Vec<u8>> { | ||||
| let patch = match id.try_into() { | ||||
| Ok(PRESET_LOCAL_TESTNET) => local_testnet_genesis(), | ||||
| Ok(PRESET_DEVELOPMENT) => development_config_genesis(), | ||||
| _ => return None, | ||||
| }; | ||||
| Some( | ||||
| serde_json::to_string(&patch) | ||||
| .expect("serialization to json is expected to work. qed.") | ||||
| .into_bytes(), | ||||
| ) | ||||
| } | ||||
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.
One annoying little detail about this is that if you don't put
chian_type: Devin the chain-spec, PJS apps won't show the accounts to you. There is a CLI flag for that two, but seem annoying to repeatdevelopmentmany times.We either create a ticket in PJS apps to change this (prob better), or we think about how we can improve it on our side. Maybe a
chain-spec-builder --devthat does both? combined with running the chain in--devit sounds like a good dev ex to me.cc @gupnik @shawntabrizi
Uh oh!
There was an error while loading. Please reload this page.
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.
This would assume that presets' naming is somehow standardized. Every runtime shall provide something in order to make flags in some other tool work correctly. This is probably OK, question is we want to go in that direction.
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.
To me it sounds reasonable that these are separate flags. You could have multiple runtime presets for development, all of them with chainType "Dev".
I was thinking how one could do the pjs route. I think currently pjs calls the
system_chainTypeRPC which gets its data directly from the chain spec. If we don't want to use the chain-spec property for this, we would need another easy way to tell that we are a dev chain.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.
We can keep separate flags,
--devcan be convenient shortcut.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.
yeah, let's keep all things configurable in the super-user mode, but one
--devthat makes some assumptions is a good nice to have.