在 Substrate 中作为参数传递时如何解码和匹配调用

How to decode and match a call when passed as a parameter in Substrate

我有一个接受调用的方法(类似于 sudo 或 recovery pallets),我想 运行 在发送之前对调用进行一些验证。验证主要围绕限制我们可以通过此方法调用哪些方法。

这是我的示例代码:

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

如果其他人有同样的问题,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()
 }