1

呼び出しを受け入れるメソッド (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
4

1 に答える 1

2

他の誰かが同じ問題を抱えているなら、IsSubTypeあなたの友達です。IsSubType で Call タイプを制限できます

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()
 }
于 2020-05-07T09:27:35.773 に答える