宏#[pallet::genesis_config] 和#[pallet::genesis_build] 在 sudo 托盘上做什么?

What are the macros #[pallet::genesis_config] and #[pallet::genesis_build] doing on the sudo pallet?

#[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_configgenesis_build 宏发生了什么?一些阅读似乎建议实施特征 GenesisBuild<T,I = ()> 但我对文档阅读感到困惑:“TI 是托盘特征和托盘实例的占位符。”

什么是托盘实例?我还假设 pallet trait 是指 sudo pallet 的 Config trait。这与为创世块配置唯一的 StorageValue 以便 运行 节点的每个实例都可以验证同一个帐户是 Root 有什么关系吗?谁能帮我分解一下。

#[pallet::genesis_build] 实现了特征 sp_runtime::BuildModuleGenesisStorage,它在创世时将初始状态放入 pallet 的存储中。
(托盘也可以在那时将状态放入子存储器。)

带有 #[pallet::genesis_config] 的发布 enum/struct 包含 genesis_build 读取的字段以设置存储。例如,创世纪的投资者可能需要设置归属时间表(参见归属托盘:https://github.com/paritytech/substrate/blob/3cdb30e1ecbafe8a866317d4550c921b4d686869/frame/vesting/src/lib.rs#L231)。因此,对于 sudo pallet,genesis_config 结构包含在此处设置的根密钥:

GenesisConfig {
        sudo: SudoConfig {
            // Assign network admin rights.
            key: root_key,
        },
        ...
}

( https://github.com/paritytech/substrate/blob/3cdb30e1ecbafe8a866317d4550c921b4d686869/bin/node-template/node/src/chain_spec.rs#L150 )

genesis_config 的文档在此处:https://docs.substrate.io/rustdocs/latest/frame_support/attr.pallet.html#genesis-config-palletgenesis_config-optional

What are pallet instances?

托盘可以实例化。这意味着一个 Pallet 可以在运行时多次使用。每个实例将使用相同的代码(通过配置特征对不同的配置取模),但每个实例的存储将不同。

参见:https://docs.substrate.io/how-to-guides/v3/basics/instantiable-pallets/

I also assume pallet trait means the Config trait for the sudo pallet. Is it some how related to configuring a unique StorageValue for the Genesis block so that each instance of a running node can verify that the same Account is Root? Can someone help break it down for me.

Yes Pallet 特征表示 Config 特征。

此处 GenesisBuild 采用两个通用参数的要点是支持所有类型的 Pallet。每个 Pallet 都可以通过 trait 进行配置,因此 GenesisBuild trait 需要采用 Config 泛型参数 T。有些Pallets是可以实例化的,所以也需要取I.

这一切都归结为一些 Rust 的“怪癖”,以支持使用默认实例和自定义实例的可实例化 Pallet,以及支持根本不使用任何实例化的 Pallet。