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

Wee*_*ezy 2 substrate

#[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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

genesis_configgenesis_build宏在这里发生了什么?一些阅读似乎建议实现特征GenesisBuild<T,I = ()>但我很困惑,因为文档读到:“T并且I是托盘特征和托盘实例的占位符。”

什么是托盘实例?我还假设托盘特征意味着Configsudo 托盘的特征。StorageValue与为创世块配置唯一性以便运行节点的每个实例都可以验证同一帐户是否为根帐户有什么关系吗?有人可以帮我分解一下吗?

小智 7

什么是托盘实例?

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

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

我还假设托盘特征意味着 sudo 托盘的配置特征。与为创世块配置唯一的 StorageValue 以便运行节点的每个实例都可以验证同一帐户是否为根有什么关系吗?有人可以帮我分解一下吗?

是的,托盘特质意味着Config特质。

这里采用两个通用参数的目的GenesisBuild是支持所有类型的托盘。每个 Pallet 都可以通过 Trait 进行配置,因此GenesisBuildTrait 需要采用Config通用参数T。有些 Pallet 是可以实例化的,所以它也需要带I.

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