您可能已经注意到您经常需要链接 .call().await.unwrap()
。这是因为:
.call()
和 .simulate()
之间进行选择(下一节将详细介绍)。 .await
它或执行并发任务,充分利用 Rust 的异步功能。 Result<FuelCallResponse, Error>
进行 .unwrap()
。 一旦解开 FuelCallResponse
,您就可以访问该结构体:
pub struct FuelCallResponse<D> {
pub value: D,
pub receipts: Vec<Receipt>,
pub gas_used: u64,
pub log_decoder: LogDecoder,
pub tx_id: Option<Bytes32>,
}
其中 value
将保存其相应合约方法返回的值,由 FuelVM 返回的确切类型表示,例如,如果您的合约返回 FuelVM 的 u64
,那么 value
的 D
将是 u64
。如果它是 FuelVM 的元组 (u8,bool)
,那么 D
将是 (u8,bool)
。如果它是自定义类型,例如,一个包含两个组件的 Sway 结构体 MyStruct
,一个 u64
和一个 b256
,那么 D
将是在编译时生成的结构体,称为 MyStruct
,其中包含 u64
和 [u8; 32]
(在 Rust 中等价于 b256
)。
receipts
将保存由该特定合约调用生成的所有 receipts 。 gas_used
是合约调用消耗的 gas 数量。 tx_id
将保存相应提交的交易的 ID。 您可以使用 is_ok
和 is_err
方法来检查合约调用的 Result
是否是 Ok
或包含错误。这些方法将返回 true
或 false
。
let is_ok = response.is_ok();
let is_error = response.is_err();
如果 is_err
返回 true
,您可以使用 unwrap_err
方法来解包错误消息。
if response.is_err() {
let err = response.unwrap_err();
println!("ERROR: {:?}", err);
};