当事务失败时,是否可以在 Substrate UI 中读取 SRML 错误消息?

Is it possible to read an SRML error message in Substrate UI, when a transaction fails?

我不确定 Substrate 运行时中与 Substrate UI 相关的错误消息的行为,以及它们是否固有地导致事务失败。

例如,在 democracy SRML 中,我看到以下行:

ensure!(!<Cancellations<T>>::exists(h), "cannot cancel the same proposal twice");

这大概是一个宏,如果 h(提案哈希)已经存在,它可以确保交易失败或停止处理。显然有一条与此错误相关的消息。

当此测试失败时,我是否可以假设交易失败(没有执行其余 SRML 代码)?

如果是这样,我如何检测 Substrate UI 中的故障并可能看到消息本身?

如果不是,则可能在运行时模块中需要一些进一步的代码,这些代码会显式创建错误。我见过 Err() - 但没有与 ensure!()

结合使用

ensure!宏扩展为:

#[macro_export]
macro_rules! fail {
    ( $y:expr ) => {{
        return Err($y);
    }}
}

#[macro_export]
macro_rules! ensure {
    ( $x:expr, $y:expr ) => {{
        if !$x {
            $crate::fail!($y);
        }
    }}
}

所以基本上,它只是 return Err 的 qui 方法。在 1.0 时,错误消息只会打印到标准输出(至少我到目前为止测试过的),不知道将来是否会包含在区块链中(所以可以在 substrate ui)..

由于合并了 https://github.com/paritytech/substrate/pull/3433ExtrinsicFailed 事件现在包含一个 DispatchError,这将提供额外的错误代码。

可用的文档不多,所以我将仅使用 system 模块作为示例。

首先你需要decl_error,注意错误变体只能是像枚举这样的简单C

https://github.com/paritytech/substrate/blob/5420de3face1349a97eb954ae71c5b0b940c31de/srml/system/src/lib.rs#L334

decl_error! {
    /// Error for the System module
    pub enum Error {
        BadSignature,
        BlockFull,
        RequireSignedOrigin,
        RequireRootOrigin,
        RequireNoOrigin,
    }
}

然后需要关联声明的Error类型 https://github.com/paritytech/substrate/blob/5420de3face1349a97eb954ae71c5b0b940c31de/srml/system/src/lib.rs#L253

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

然后你可以 return 你的 Error 在事情失败时调度调用

https://github.com/paritytech/substrate/blob/5420de3face1349a97eb954ae71c5b0b940c31de/srml/system/src/lib.rs#L543

pub fn ensure_root<OuterOrigin, AccountId>(o: OuterOrigin) -> Result<(), Error>
    where OuterOrigin: Into<Result<RawOrigin<AccountId>, OuterOrigin>>
{
    match o.into() {
        Ok(RawOrigin::Root) => Ok(()),
        _ => Err(Error::RequireRootOrigin),
    }
}

现在您只能从 JS 端看到两个数字,模块索引和错误代码。稍后可能会支持在元数据中包含错误详细信息,以便前端能够提供更好的响应。

相关问题: https://github.com/paritytech/substrate/issues/2954