在 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()
}
我有一个接受调用的方法(类似于 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()
}