Вот рабочий пример того, как вы прикрепили бы значение признака конфигурации к элементу хранения другого поддона.
Поддон 1
Вот pallet_1
, у которого есть элемент хранения, который мы хотите использовать.
ПРИМЕЧАНИЕ: Это хранилище обозначено pub
, поэтому оно доступно за пределами поддона.
use frame_support::{decl_module, decl_storage};
use frame_system::ensure_signed;
pub trait Trait: frame_system::Trait {}
decl_storage! {
trait Store for Module<T: Trait> as TemplateModule {
pub MyStorage: u32;
}
}
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
#[weight = 0]
pub fn set_storage(origin, value: u32) {
let _ = ensure_signed(origin)?;
MyStorage::put(value);
}
}
}
Поддон 2
Вот pallet_2
, у которого есть черта конфигурации, которую мы хотим заполнить элементом хранилища из pallet_1
:
use frame_support::{decl_module, dispatch, traits::Get};
use frame_system::ensure_signed;
pub trait Trait: frame_system::Trait {
type MyConfig: Get<u32>;
}
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
#[weight = 0]
pub fn do_something(origin) -> dispatch::DispatchResult {
let _ = ensure_signed(origin)?;
let _my_config = T::MyConfig::get();
Ok(())
}
}
}
Конфигурация времени выполнения
Эти две паллеты очень просты и работают отдельно . Но если мы хотим соединить их, нам нужно настроить нашу среду выполнения:
use frame_support::traits::Get;
impl pallet_1::Trait for Runtime {}
pub struct StorageToConfig;
impl Get<u32> for StorageToConfig {
fn get() -> u32 {
return pallet_1::MyStorage::get();
}
}
impl pallet_2::Trait for Runtime {
type MyConfig = StorageToConfig;
}
// We also update the `construct_runtime!`, but that is omitted for this example.
Здесь мы определили структуру StorageToConfig
, которая реализует черту Get<u32>
, которую ожидает pallet_2
. Эта структура сообщает среде выполнения, когда вызывается MyConfig::get()
, затем она должна вызвать pallet_1::MyStorage::get()
, который читает в хранилище времени выполнения и получает это значение.
Итак, теперь каждый вызов T::MyConfig::get()
в pallet_2
будет чтение из хранилища и получит любое значение, установленное в pallet_1
.
Сообщите мне, поможет ли это!