当事务失败时,是否可以在 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/3433,ExtrinsicFailed
事件现在包含一个 DispatchError
,这将提供额外的错误代码。
可用的文档不多,所以我将仅使用 system
模块作为示例。
首先你需要decl_error
,注意错误变体只能是像枚举这样的简单C
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
在事情失败时调度调用
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 端看到两个数字,模块索引和错误代码。稍后可能会支持在元数据中包含错误详细信息,以便前端能够提供更好的响应。
我不确定 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/3433,ExtrinsicFailed
事件现在包含一个 DispatchError
,这将提供额外的错误代码。
可用的文档不多,所以我将仅使用 system
模块作为示例。
首先你需要decl_error
,注意错误变体只能是像枚举这样的简单C
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
在事情失败时调度调用
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 端看到两个数字,模块索引和错误代码。稍后可能会支持在元数据中包含错误详细信息,以便前端能够提供更好的响应。