安全智能合约编程
在本节中,我们将介绍 TON 区块链最有趣的几个功能,然后介绍开发人员在 FunC 上编写智能合约的最佳实践清单。
合约分片
在为 EVM 开发合约时,为了方便起见,通常会将项目拆分为多个合约。在某些情况下,可以在一份合约中实现所有功能,即使在有必要拆分合约的情况下(例如,自动做市商中的流动性对),也不会造成任何特殊困难。交易全部执行:要么全部成功,要么全部失败。
在 TON 中,强烈建议避免 "无界数据结构 (unbounded data structures)" 和将单个逻辑合约分割成小块,每个小块管理少量数据。基本的例子是 TON Jettons 的实现。这是 TON 版本的以太坊 ERC-20 代币标准。简而言之,我们有
- 一个
jetton-minter
,用于存储total_supply
、minter_address
和几个引用:令牌描述(元数据)和jetton_wallet_code
。 - 还有大量的 jetton 钱包,每个 jetton 的所有者都有一个。每个钱包只存储所有者的地址、余额、jetton-minter 地址和 jetton_wallet_code 的链接。
这样做是必要的,因为这样可以在钱包之间直接传输 Jettons,而不会影响任何高负载地址,这对并行处理交易至关重要。
也就是说,做好准备,让你的合约变成 "一组合约",而且它们之间会积极互动。
可以部分执行交易
合约逻辑中出现了一个新的独特属性:部分执行交易。
例如,考虑一下标准 TON Jetton 的信息流:
如图所示:
- 发送者会向其钱包 (
sender_wallet
)发送一条op::transfer
信息; sender_wallet
减少令牌余额;- 发送方钱包向接收方钱包(目的地钱包)发送
op::internal_transfer
消息; destination_wallet
增加其令牌余额;destination_wallet
向其所有者 (destination
)发送op::transfer_notification
;destination_wallet
在response_destination
(通常是sender