本页面介绍了Sway合约如何与Fuel区块链进行交互。内容涵盖了交易上下文信息、身份验证、资产操作、合约间调用、消息处理、区块链状态访问和密码学操作。
有关合约内数据存储的信息,请参阅集合和存储页面。
Sway标准库提供了几个模块,允许合约与Fuel区块链进行交互。这些模块提供了访问交易数据、用户身份验证、资产转移、合约间通信等功能。
来源:sway-lib-std/src/lib.sw33-51
auth模块提供了用于识别和验证交易及消息发送者身份的功能,构成了Sway智能合约安全的基础。
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():返回发送代币的资产IDmsg_gas():返回当前消息可用的gasglobal_gas():返回交易可用的总gasthis_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():返回当前合约的IDparam1(), 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寄存器的访问:
| 注册 | 功能 | 描述 |
|---|---|---|
| 全局Gas | get_global_gas() | 交易中剩余的gas |
| 上下文Gas | get_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, u64 | sha256(42u64) |
| bool | keccak256(true) |
| str | sha256("Fuel") |
| b256 | keccak256(contract_id) |
| struct | sha256(my_struct) |
| 枚举 | keccak256(my_enum) |
| tuple | sha256((true, 5)) |
| array | keccak256([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