菜单

区块链交互

相关源文件

本页面介绍了Sway合约如何与Fuel区块链进行交互。内容涵盖了交易上下文信息、身份验证、资产操作、合约间调用、消息处理、区块链状态访问和密码学操作。

有关合约内数据存储的信息,请参阅集合和存储页面。

Sway 中区块链交互概览

Sway标准库提供了几个模块,允许合约与Fuel区块链进行交互。这些模块提供了访问交易数据、用户身份验证、资产转移、合约间通信等功能。

关键区块链交互模块

来源:sway-lib-std/src/lib.sw33-51

身份验证

auth模块提供了用于识别和验证交易及消息发送者身份的功能,构成了Sway智能合约安全的基础。

消息发送者 vs 合约调用者

auth模块区分了不同的身份概念:

  • msg_sender():返回原始发送消息的实体地址(“外部”调用者)
  • caller_address():返回直接合约调用者的地址
  • caller_addresses():返回交易链中的所有调用者地址

身份验证流程示例

来源:test/src/sdk-harness/test_projects/auth/mod.rs30-69 test/src/sdk-harness/test_projects/auth/mod.rs143-562

谓词

谓词是特殊的程序,用于验证花费条件而无需签名。它们充当资产转移的可编程条件。

来源:test/src/sdk-harness/test_projects/auth/mod.rs600-741 test/src/sdk-harness/test_projects/auth/mod.rs744-828

交易上下文

context模块提供了访问交易和执行上下文信息的功能。

消息信息

  • msg_amount():返回当前消息发送的代币数量
  • msg_asset_id():返回发送代币的资产ID
  • msg_gas():返回当前消息可用的gas
  • global_gas():返回交易可用的总gas

余额信息

  • this_balance(asset_id):返回当前合约特定资产的余额
  • balance_of(contract_id, asset_id):返回指定合约的余额

上下文访问示例

来源:test/src/sdk-harness/test_projects/context/mod.rs55-83 test/src/sdk-harness/test_projects/context/mod.rs85-106 test/src/sdk-harness/test_projects/context/mod.rs108-155

消息处理

message模块提供了在Fuel区块链上发送消息的功能。

发送消息

message模块提供了两个主要函数:

  • send_message:发送包含任意字节数据的消息
  • send_typed_message:发送包含需要索引的类型化数据的消息

消息流

来源:sway-lib-std/src/message.sw10-79

合约间调用

call_frames模块允许合约之间进行交互并访问调用信息。

合约身份和参数

  • contract_id():返回当前合约的ID
  • param1(), param2(), ...:访问传递给合约的参数

合约代码检查

  • code_size():返回合约代码的大小

来源:test/src/sdk-harness/test_projects/call_frames/mod.rs26-45 test/src/sdk-harness/test_projects/call_frames/mod.rs48-100

区块链状态访问

合约可以访问各种区块链状态信息,以便根据当前的区块链上下文做出决策。

区块信息

block模块提供了对当前区块数据的访问。

  • height():返回当前区块高度
  • timestamp():返回当前区块时间戳

用于底层操作的寄存器访问

对于更高级的操作,Sway提供了对VM寄存器的访问:

注册功能描述
全局Gasget_global_gas()交易中剩余的gas
上下文Gasget_context_gas()当前上下文中可用的gas
余额get_balance()余额寄存器值
程序计数器get_program_counter()当前指令指针
栈指针get_stack_ptr()当前栈位置
堆指针get_heap_ptr()当前堆位置

来源:test/src/sdk-harness/test_projects/registers/mod.rs28-134

密码学操作

Sway提供了对区块链操作至关重要的密码学哈希函数。

哈希函数

hash模块提供了两种主要的哈希算法:

  • sha256():计算数据的SHA-256哈希值
  • keccak256():计算数据的Keccak-256哈希值(兼容以太坊)

可哈希类型

两种哈希函数都支持各种Sway类型:

类型使用示例
u8, u16, u32, u64sha256(42u64)
boolkeccak256(true)
strsha256("Fuel")
b256keccak256(contract_id)
structsha256(my_struct)
枚举keccak256(my_enum)
tuplesha256((true, 5))
arraykeccak256([1, 2, 3])

来源:test/src/sdk-harness/test_projects/hashing/mod.rs18-141 test/src/sdk-harness/test_projects/hashing/mod.rs160-486

完整的区块链交互流程

此图展示了Sway合约中典型的区块链交互流程:

来源:test/src/sdk-harness/test_projects/auth/mod.rs30-69 test/src/sdk-harness/test_projects/context/mod.rs55-201 sway-lib-std/src/message.sw10-79