⌘K

Icon Link调用响应

您可能已经注意到您经常需要链接 .call().await.unwrap()。这是因为:

  1. 您必须在 .call().simulate() 之间进行选择(下一节将详细介绍)。
  2. 合约调用是异步的,因此您可以选择 .await 它或执行并发任务,充分利用 Rust 的异步功能。
  3. 对合约调用返回的 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,那么 valueD 将是 u64。如果它是 FuelVM 的元组 (u8,bool),那么 D 将是 (u8,bool)。如果它是自定义类型,例如,一个包含两个组件的 Sway 结构体 MyStruct,一个 u64 和一个 b256,那么 D 将是在编译时生成的结构体,称为 MyStruct,其中包含 u64[u8; 32](在 Rust 中等价于 b256)。

  • receipts 将保存由该特定合约调用生成的所有 receipts Icon Link
  • gas_used 是合约调用消耗的 gas 数量。
  • tx_id 将保存相应提交的交易的 ID。

Icon Link错误处理

您可以使用 is_okis_err 方法来检查合约调用的 Result 是否是 Ok 或包含错误。这些方法将返回 truefalse

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