Как я могу использовать переменную хранения в одном поддоне в качестве переменной конфигурации в другом? - PullRequest
0 голосов
/ 06 августа 2020

Итак, у вас 2 поддона. Цель состоит в том, чтобы иметь конфигурационную переменную C в pallet_1:

  • В pallet_2 иметь несколько logi c, которые постоянно изменяют хранилище var A;
  • Тогда среда выполнения должна автоматически писать новое состояние переменной A для константы C в pallet_1.

Переменная конфигурации в трейте pallet_1 должна иметь вид MyConfig: Get<u32>

Примерно так: https://github.com/paritytech/substrate/blob/master/frame/recovery/src/lib.rs#L200

Итак, здесь говорится, что нам нужно определить тип, реализующий черту Get<T>:

https://github.com/paritytech/substrate/blob/master/frame/support/src/traits.rs#L471

Итак, это просто функция fn get() -> T

Предположим, у вас есть pallet_2, где есть какой-то элемент хранения, которым вы хотите управлять этой конфигурацией:

decl_storage!{
    MyStorage: u32;
}

В вашей среде выполнения / src /lib.rs, вы определяете что-то вроде:

struct StorageToConfig;
impl Get<u32> for StorageToConfig {
     fn get() -> u32 {
         return pallet_2::MyStorage::get();
    }
}

Как вы можете использовать эту структуру в своем определении трейта в pallet_1 и убедитесь, что среда выполнения автоматически подталкивает (или pallet_1 извлекает из среды выполнения) переменная MyStorage в pallet_2?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вот рабочий пример того, как вы прикрепили бы значение признака конфигурации к элементу хранения другого поддона.

Поддон 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.

Сообщите мне, поможет ли это!

0 голосов
/ 06 августа 2020

На самом деле это похоже на создание признака, подразумевающего структуру, а затем во время выполнения передача структуры получателю (с использованием признака), то, что я сделал, чтобы узнать это, - это посмотреть на все поддоны, которые уже есть, и посмотрите, как здесь передана информация о передаче

например, эта черта в авторстве https://github.com/paritytech/substrate/blob/640dd1a0a44b6f28af1189f0293ab272ebc9d2eb/frame/authorship/src/lib.rs#L39

https://github.com/paritytech/substrate/blob/77819ad119f23a68b7478f3ac88e6c93a1677fc1/frame/aura/src/lib.rs#L148

и здесь он составлен (не с аурой, а с сеансом)

https://github.com/paritytech/substrate/blob/549050b7f1740c90855e777daf3f9700750ad7ff/bin/node/runtime/src/lib.rs#L363

вы также должны прочитать это https://doc.rust-lang.org/book/ch10-02-traits.html#: ~: text = A% 20trait% 20 говорит% 20the% 20Rust, тип% 20, который% 20 имеет% 20% 20поведение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...