0

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

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

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

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

当这个测试失败时,我是否可以假设事务失败(没有执行其余的 SRML 代码)?

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

如果不是,那么在运行时模块中可能需要一些进一步的代码,这会显式地产生错误。我见过Err()——但没有结合ensure!()

4

2 回答 2

3

随着https://github.com/paritytech/substrate/pull/3433的合并,该ExtrinsicFailed事件现在包含一个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;

然后你可以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

于 2019-09-05T08:47:34.227 回答
0

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);
        }
    }}
}

所以基本上,这只是一种更快的返回方式Err。在1.0,错误信息只会打印到stdout(至少我到目前为止测试过的),不知道它是否会在未来被包含在区块链中(所以可以在substrate ui中查看)..

于 2019-08-08T11:33:51.490 回答