0

Substrate 允许您“重新调度”外部变量,例如在调用sudosudo 模块中的函数时,我们有:

            let res = match proposal.dispatch(system::RawOrigin::Root.into()) {
                Ok(_) => true,
                Err(e) => {
                    let e: DispatchError = e.into();
                    sr_primitives::print(e);
                    false
                }
            };

在这个模型中,被执行的底层proposal外部sudo函数proposal

在这个例子中这可能是合理的(因为 sudo 帐户是特殊的并且可以被认为是受信任的),但在其他情况下(例如,使用重新发送提议交易的多重签名),情况似乎并非如此。

有没有办法通过 SignedExtension 流程将提案传回,以便TakeFee可以对基础交易进行评估?

4

2 回答 2

1

实际上,您可以看到 Pallet_sudo 采用Dispatchable,该可调度对象不包含DispatchInfo中可用的重量信息,也不包含任何计算费用的逻辑。

如果你想计算费用,也许你想要的不是可调度的,而是实际的外部执行。frame-executive crate 对 extrinsic 是通用的,您应该能够使用类似的trait bounds

然后在运行时定义(bin/node/runtime/src/lib.rs)中,您应该能够进行如下操作:

impl pallet_mine::Trait for Runtime {
    extrinsic: UncheckedExtrinsic
}
于 2020-01-02T13:53:07.913 回答
1

@thiolliere 推荐的内容对我来说听起来很合理。详细说明:

  • 需要运行时的泛型Extrinsic类型executive才能具有 trait Applyable。在 的实现中Applyable,您会看到内部调用是Dispatchable.
  • fn apply()签名的扩展管道在同一特征的内部触发。因此,您可能想要这样做:type Extrinsic: Applyable<_, _>在您的 trait 中,如前所述,将运行时的外部类型传递给它。

归根结底,它归结为对高级、不透明Extrinsic或更粗粒度的内部Dispatchable Call枚举变体进行抽象。

请注意,根据您想要实现的目标,您也可以只对内部调用保持抽象并手动扣除更多费用。您可以将提案类型(如果类似于民主,它只是 a Call)限制为GetDispatchInfo(即type Proposal: Dispatchable + ... + GetDispatchInfo)。这允许您通过 读取重量值poposal.get_dispatch_info()。结合编码长度,您实际上可以复制或执行类似于TakeFees正在执行的操作。

于 2020-01-02T14:19:10.397 回答