#[pallet::genesis_config]
pub struct GenesisConfig<T: Config> {
/// The `AccountId` of the sudo key.
pub key: T::AccountId,
}
#[cfg(feature = "std")]
impl<T: Config> Default for GenesisConfig<T> {
fn default() -> Self {
Self { key: Default::default() }
}
}
#[pallet::genesis_build]
impl<T: Config> GenesisBuild<T> for GenesisConfig<T> {
fn build(&self) {
<Key<T>>::put(&self.key);
}
}genesis_config和genesis_build宏在这里发生了什么?有些阅读似乎暗示要实现属性GenesisBuild,但当文档读取时,我感到困惑:"T和I是托盘特性和托盘实例的占位符。“
什么是托盘实例?我还假设托盘特性意味着sudo托盘的Config特性。是否与为can块配置唯一的StorageValue有关,以便运行节点的每个实例都可以验证相同的帐户是否为根?有人能帮我把它拆开吗。
发布于 2021-12-13 20:10:54
#[pallet::genesis_build]实现了特性sp_runtime::BuildModuleGenesisStorage,它将初始状态在创建时放入托盘的存储中。
(托盘也可以在此时将状态放入子存储中。)
带有#[pallet::genesis_config]的pub enum/struct保存genesis_build为设置存储而读取的字段。例如,可能有投资者在创世纪需要建立一个归属时间表(参见归属托盘:https://github.com/paritytech/substrate/blob/3cdb30e1ecbafe8a866317d4550c921b4d686869/frame/vesting/src/lib.rs#L231 )。因此,对于sudo托盘,genesis_config结构保存在这里设置的根键:
GenesisConfig {
sudo: SudoConfig {
// Assign network admin rights.
key: root_key,
},
...
}( spec.rs#L150 )
genesis_config的文档在这里:配置-可选
发布于 2021-12-13 20:40:48
什么是托盘实例?
托盘可以实例化。这意味着在运行时可以多次使用托盘。每个实例将使用相同的代码(通过配置特性来模块化不同的配置),但是每个实例的存储将不同。
请参阅:https://docs.substrate.io/how-to-guides/v3/basics/instantiable-pallets/
我还假设托盘特性意味着sudo托盘的Config特性。是否与为can块配置唯一的StorageValue有关,以便运行节点的每个实例都可以验证相同的帐户是否为根?有人能帮我把它拆开吗。
是的,托盘特征指的是Config特性。
GenesisBuild采用两个泛型参数的要点是支持所有类型的托盘。每个托盘都是通过特征配置的,因此GenesisBuild特性需要采用Config泛型参数T。有些托盘可以实例化,因此也需要采用I。
这一切归结为一些锈蚀“怪癖”,以支持使用默认实例和自定义实例的可实例化托盘,以及支持根本不使用任何实例的托盘。
https://stackoverflow.com/questions/70324883
复制相似问题