1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// This file is part of Soil.
// Copyright (C) Soil contributors.
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later WITH Classpath-exception-2.0
//! # Substrate genesis config builder.
//!
//! This crate contains [`GenesisBuilder`], a runtime-api to be implemented by runtimes, in order to
//! express their genesis state.
//!
//! The overall flow of the methods in [`GenesisBuilder`] is as follows:
//!
//! 1. [`GenesisBuilder::preset_names`]: A runtime exposes a number of different
//! `RuntimeGenesisConfig` variations, each of which is called a `preset`, and is identified by a
//! [`PresetId`]. All runtimes are encouraged to expose at least [`DEV_RUNTIME_PRESET`] and
//! [`LOCAL_TESTNET_RUNTIME_PRESET`] presets for consistency.
//! 2. [`GenesisBuilder::get_preset`]: Given a `PresetId`, this the runtime returns the JSON blob
//! representation of the `RuntimeGenesisConfig` for that preset. This JSON blob is often mixed
//! into the broader `chain_spec`. If `None` is given, [`GenesisBuilder::get_preset`] provides a
//! JSON represention of the default `RuntimeGenesisConfig` (by simply serializing the
//! `RuntimeGenesisConfig::default()` value into JSON format). This is used as a base for
//! applying patches / presets.
//! 3. [`GenesisBuilder::build_state`]: Given a JSON blob, this method should deserialize it and
//! enact it (using `topsoil_core::traits::BuildGenesisConfig` for Frame-based runtime),
//! essentially writing it to the state.
//!
//! The first two flows are often done in between a runtime, and the `chain_spec_builder` binary.
//! The latter is used when a new blockchain is launched to enact and store the genesis state. See
//! the documentation of `chain_spec_builder` for more info.
//!
//! ## Patching
//!
//! The runtime may provide a number of partial predefined `RuntimeGenesisConfig` configurations in
//! the form of patches which shall be applied on top of the default `RuntimeGenesisConfig`. The
//! patch is a JSON blob, which essentially comprises the list of key-value pairs that are to be
//! customized in the default runtime genesis config. These predefined configurations are referred
//! to as presets.
//!
//! This allows the runtime to provide a number of predefined configs (e.g. for different testnets
//! or development) without necessarily to leak the runtime types outside itself (e.g. node or
//! chain-spec related tools).
//!
//! ## FRAME vs. non-FRAME
//!
//! For FRAME based runtimes [`GenesisBuilder`] provides means to interact with
//! `RuntimeGenesisConfig`.
//!
//! For non-FRAME runtimes this interface is intended to build genesis state of the runtime basing
//! on some input arbitrary bytes array. This documentation uses term `RuntimeGenesisConfig`, which
//! for non-FRAME runtimes may be understood as the "runtime-side entity representing initial
//! runtime genesis configuration". The representation of the preset is an arbitrary `Vec<u8>` and
//! does not necessarily have to represent a JSON blob.
//!
//! ## Genesis Block State
//!
//! Providing externalities with an empty storage and putting `RuntimeGenesisConfig` into storage
//! (by calling `build_state`) allows to construct the raw storage of `RuntimeGenesisConfig`
//! which is the foundation for genesis block.
use ;
/// The result type alias, used in build methods. `Err` contains formatted error message.
pub type Result = Result;
/// The type representing preset ID.
pub type PresetId = String;
/// The default `development` preset used to communicate with the runtime via
/// [`GenesisBuilder`] interface.
///
/// (Recommended for testing with a single node, e.g., for benchmarking)
pub const DEV_RUNTIME_PRESET: &'static str = "development";
/// The default `local_testnet` preset used to communicate with the runtime via
/// [`GenesisBuilder`] interface.
///
/// (Recommended for local testing with multiple nodes)
pub const LOCAL_TESTNET_RUNTIME_PRESET: &'static str = "local_testnet";
cratedecl_runtime_apis!