配置存储的GenesisConfig条目在哪里?

时间:2019-12-17 16:49:18

标签: substrate

在扩展Sudo模块的根密钥行为之前,我正尝试对其进行重构。在v1 documentation on GenesisConfig之后,我的config()中有一个decl_storage存储变量:

    RootKey get(fn rootkey) config(): T::AccountId;

(目前在node-template template.rs中)

但是,如果我查看宏扩展的输出,则在GenesisConfig结构中没有template项,并且无法在chain_spec的testnet_genesis函数

中放入类似以下的条目

    template: Some(TemplateConfig {
        rootkey: root_key,
    }),         

因为尽管templateTemplateConfig都应该由宏扩展构造,但我仍对此有所抱怨。

编辑:具体来说,如果它在use runtime::{}列表中添加了上面的TemplateConfig项,则会通知我:

error[E0432]: unresolved import `runtime::TemplateConfig`
 --> node-template/src/chain_spec.rs:4:14
  |
4 |     SudoConfig, TemplateConfig, IndicesConfig, SystemConfig, WASM_BINARY, Signature
  |                 ^^^^^^^^^^^^^^ no `TemplateConfig` in the root

error[E0560]: struct `node_template_runtime::GenesisConfig` has no field named `template`
   --> node-template/src/chain_spec.rs:142:3
    |
142 |         template: Some(TemplateConfig {
    |         ^^^^^^^^ `node_template_runtime::GenesisConfig` does not have this field
    |
    = note: available fields are: `system`, `aura`, `grandpa`, `indices`, `balances`, `sudo`

在存储下的polkadot.js中,我也看不到任何模板项,而我却看到了sudo的key()

我想念什么明显的东西?

2 个答案:

答案 0 :(得分:0)

听起来use TemplateConfig文件开头缺少chain_spec.rs。像这样的https://github.com/substrate-developer-hub/substrate-node-template/blob/8fea1dc6dd0c5547117d022fd0d1bf49868ee548/src/chain_spec.rs#L4

如果这不是您的问题,请提供确切的错误信息,并提供完整代码的链接。

答案 1 :(得分:0)

在尝试为运行时模块设置创世纪配置时,您需要执行以下操作:

  1. 确保您的运行时模块具有“可配置的存储项”。这可以像在config()宏中设置decl_storage!一样简单,但也可以更复杂一些,如此处记录的`decl_storage! - GenesisConfig
decl_storage! {
    trait Store for Module<T: Trait> as Sudo {
        Key get(fn key) config(): T::AccountId;
        //--------------^^^^^^^^---------------
    }
}

这将在您的模块中生成一个GenesisConfig,将在下一步中使用。

  1. 接下来,您需要通过将GenesisConfig / Config项添加到Config<T>宏中,将模块特定的construct_runtime!结构公开给运行时的其余部分。在此示例中,我们使用Config<T>,因为我们正在配置通用T::AccountId
construct_runtime!(
    pub enum Runtime where
        Block = Block,
        NodeBlock = opaque::Block,
        UncheckedExtrinsic = UncheckedExtrinsic
    {
        //--snip--
        TemplateModule: template::{Module, Call, Storage, Event<T>, Config<T>},
        //----------------------------------------------------------^^^^^^^^^--
    }
}

这将根据您为模块配置的名称(名称+ GenesisConfig)为模块特定的Config对象生成别名。在这种情况下,对象的名称将为TemplateModuleConfig

  1. 最后,您需要在chain_spec.rs文件中配置此存储项目。为此,请确保导入TemplateModuleConfig项:
use node_template_runtime::{
    AccountId, AuraConfig, BalancesConfig, GenesisConfig, GrandpaConfig,
    SudoConfig, IndicesConfig, SystemConfig, WASM_BINARY, Signature,
    TemplateModuleConfig,
//--^^^^^^^^^^^^^^^^^^^^
};

然后配置您的起源信息:

    template: Some(TemplateModuleConfig {
        key: root_key,
    }),