mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-02 08:17:24 +00:00
8683bbeefb
Closes #2326. This PR both fixes a logic bug and replaces an incorrect name. ## Bug Fix: Respecting custom genesis builder Prior to this PR the standard logic for creating a genesis block was repeated inside of cumulus. This PR removes that duplicated logic, and calls into the proper `BuildGenesisBlock` implementation. One consequence is that if the genesis block has already been initialized, it will not be re-created, but rather read from the database like it is for other node invocations. So you need to watch out for old unpurged data during the development process. Offchain tools may need to be updated accordingly. I've already filed https://github.com/paritytech/zombienet/issues/1519 ## Rename: It doesn't export state. It exports head data. The name export-genesis-state was always wrong, nad it's never too late to right a wrong. I've changed the name of the struct to `ExportGenesisHeadCommand`. There is still the question of what to do with individual nodes' public CLIs. I have updated the parachain template to a reasonable default that preserves compatibility with tools that will expect `export-genesis-state` to still work. And I've chosen not to modify the public CLIs of any other nodes in the repo. I'll leave it up to their individual owners/maintains to decide whether that is appropriate. --------- Co-authored-by: Joshy Orndorff <git-user-email.h0ly5@simplelogin.com> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: Bastian Köcher <info@kchr.de>
70 lines
2.3 KiB
Rust
70 lines
2.3 KiB
Rust
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// This file is part of Cumulus.
|
|
|
|
// Cumulus is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Cumulus is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
use codec::Encode;
|
|
use cumulus_primitives_core::ParaId;
|
|
use cumulus_test_runtime::Block;
|
|
use polkadot_primitives::HeadData;
|
|
use sc_chain_spec::ChainSpec;
|
|
use sp_runtime::{
|
|
traits::{Block as BlockT, Hash as HashT, Header as HeaderT, Zero},
|
|
StateVersion,
|
|
};
|
|
|
|
/// Generate a simple test genesis block from a given ChainSpec.
|
|
pub fn generate_genesis_block<Block: BlockT>(
|
|
chain_spec: &dyn ChainSpec,
|
|
genesis_state_version: StateVersion,
|
|
) -> Result<Block, String> {
|
|
let storage = chain_spec.build_storage()?;
|
|
|
|
let child_roots = storage.children_default.iter().map(|(sk, child_content)| {
|
|
let state_root = <<<Block as BlockT>::Header as HeaderT>::Hashing as HashT>::trie_root(
|
|
child_content.data.clone().into_iter().collect(),
|
|
genesis_state_version,
|
|
);
|
|
(sk.clone(), state_root.encode())
|
|
});
|
|
let state_root = <<<Block as BlockT>::Header as HeaderT>::Hashing as HashT>::trie_root(
|
|
storage.top.clone().into_iter().chain(child_roots).collect(),
|
|
genesis_state_version,
|
|
);
|
|
|
|
let extrinsics_root = <<<Block as BlockT>::Header as HeaderT>::Hashing as HashT>::trie_root(
|
|
Vec::new(),
|
|
genesis_state_version,
|
|
);
|
|
|
|
Ok(Block::new(
|
|
<<Block as BlockT>::Header as HeaderT>::new(
|
|
Zero::zero(),
|
|
extrinsics_root,
|
|
state_root,
|
|
Default::default(),
|
|
Default::default(),
|
|
),
|
|
Default::default(),
|
|
))
|
|
}
|
|
|
|
/// Returns the initial head data for a parachain ID.
|
|
pub fn initial_head_data(para_id: ParaId) -> HeadData {
|
|
let spec = crate::chain_spec::get_chain_spec(Some(para_id));
|
|
let block: Block = generate_genesis_block(&spec, sp_runtime::StateVersion::V1).unwrap();
|
|
let genesis_state = block.header().encode();
|
|
genesis_state.into()
|
|
}
|