在Substrate中,有没有一种方法可以使用另一个自定义模块中的存储和功能?

T9b*_*T9b 5 substrate

我已经看到了底教程创造单片基板运行模块的包装箱这里为了重复使用的功能,但我不知道是否有一个自定义模块的方式来访问在另一个自定义模块存储或功能?

遵循以下原则:

/// In ModuleA

    pub type IndexType = u64;

    decl_storage! {
        trait Store for Module<T: Trait> as ModuleA {
                pub MyIndexCount get(my_index_count): Option<IndexType>;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后在ModuleB内部-要使用/包括ModuleA的功能,我需要怎么做?如何称呼它?

/// In ModuleB

    decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
        fn deposit_event<T>() = default;

        pub fn edit_index(origin) -> Result {
            let sender = ensure_signed(origin)?;

            // --->>>> I want to read some storage from ModuleA whilst inside ModuleB
            let c: IndexType = ReadStorageFromModuleA >>> my_index_count().ok_or("Storage Read Error: cannot get index")?;

            // change storage in ModuleA from ModuleB
            WriteToStorageInModuleA <MyIndexCount<T>>::put(&c + 1);

            Ok(())
            }
        }
    }    
Run Code Online (Sandbox Code Playgroud)

Sha*_*izi 5

如果要构建直接依赖于另一个模块(module1)的模块(module2),则必须在module2的特征定义中继承module1的特征:

pub trait Trait: module1::Trait {
    ...
}
Run Code Online (Sandbox Code Playgroud)

要从模块2中的模块1 访问公共存储项目,您需要执行以下操作:

  • 导入相应的存储特性访问存储API: ,StorageValueStorageMap等...
  • 通过module1的存储类型访问公共存储
    • <module1::Something<T>>::get()
    • <module1::Something<T>>::put()
    • 等等...

要从模块2中的模块1 访问其他公共功能,您需要使用以下Module类型:

<module1::Module<T>>::public_function();
Run Code Online (Sandbox Code Playgroud)

这是两个以这种方式交互的模块的简单示例:

module1.rs

请注意,此模块中的所有内容都标记为public(pub

pub trait Trait: module1::Trait {
    ...
}
Run Code Online (Sandbox Code Playgroud)

module2.rs

<module1::Module<T>>::public_function();
Run Code Online (Sandbox Code Playgroud)