Как декодировать и сопоставить вызов при передаче в качестве параметра в Substrate - PullRequest
0 голосов
/ 06 мая 2020

У меня есть метод, который принимает вызов (аналогичный sudo или поддонам восстановления), и я хочу выполнить некоторую проверку вызова перед его отправкой. Проверка в основном связана с ограничением того, какие методы мы можем вызывать с помощью этого метода.

Вот пример кода, который у меня есть:

decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
        type Error = Error<T>;

        fn deposit_event() = default;

        pub fn foo(origin, call: Box<<T as Trait>::Call>) -> DispatchResult {
            ensure_signed(origin)?;

            let sender = match *call {
                Call::test(x) => Ok(()),
                _ => Err(())
            };

            Ok(())
        }


        pub fn test(origin, x: u32) -> DispatchResult {
            Ok(())
        }
    }
}

В этом примере я хочу, чтобы это было успешным, только если call вызывает мою test() функцию.

К сожалению, я получаю ошибку о несоответствии типов, и любая помощь будет принята с благодарностью.

я получаю следующую ошибку:

Call::test(x) => Ok(()),
| ^^^^^^^^^^^^^ expected associated type, found enum Call
|
= note: expected associated type <T as Trait>::Call
found enum Call<_>
= note: consider constraining the associated type <T as Trait>::Call to Call<_> or calling a method that returns <T as Trait>::Call

1 Ответ

1 голос
/ 07 мая 2020

Если у кого-то такая же проблема, IsSubType - ваш друг. Вы можете ограничить свой тип вызова с помощью IsSubType

type Call: Parameter + Dispatchable<Origin=<Self as frame_system::Trait>::Origin> + IsSubType<Module<Self>, Self>;

И для сопоставления вы можете получить подтип вызова и сопоставить его:

 let call = match call.is_sub_type() {
    Some(call) => call,
    None => return Err(),
 };

 match *call {
    Call::test(x) => return Ok(),
    _ => return Err()
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...