Web3——TON开发注意事项

365 阅读3分钟

TON [ docs.ton.org/mandarin/de… ](The Open Network,原名Telegram Open Network),提供了一种分布式的、高性能的区块链解决方案,以支持各种去中心化应用(DApp)和智能合约。

开放网络 The Open Network(TON)  是一个由多个组成部分构成的去中心化和开放的互联网平台。这些组成部分包括:TON 区块链、TON DNS、TON 存储和 TON 网站。TON 区块链是连接 TON 底层基础设施的核心协议,从而形成更大的 TON 生态系统。

TON的基础知识

TON的最大特点就是分片和异步,这一点和别的链有很大区别,也带来了开发上的一些困扰和需要注意的安全问题。

TVM与以太坊虚拟机(EVM)不兼容,因为TON采用了完全不同的架构(TON是异步的,而以太坊是同步的)。

在 TON 中部署的合约的新地址仅取决于两件事 - 部署的字节码(初始代码)和初始合约存储(初始数据),可以说该地址是两者的哈希值的某种派生。

开发语言

TON一共有三种开发语言:

  1. Tact:简单易懂,最终编译为FunC代码,由社区提供,但版本不稳定,且编译出的FunC代码比直接写FunC代码消耗的gas要高。
  2. FunC:类C语言,官方支持,有大量案例,但手上难度比较高,而且过于写起来啰嗦效率比较低。
  3. Fift:接近汇编语言,开发者一般无需使用。

开发注意的点

  1. 由于分片,数据是分散的,通常需要自行抓取链上的数据进行分析管理
  2. 由于异步,容易产生合约竞争条件问题
  3. 用户钱包也是合约,一个公钥可以部署多个钱包
  4. TON上的合约如果发生错误不会自动退回gas,需要手动处理
  5. 如果多个合约形成调用链路,应在末端对gas进行处理,返回gas
  6. 即使合约发生错误而返回亦会消耗gas
  7. 合约发生错误时只会返回错误码和256位数据给 上一个调用的合约,不会返回给最初的交易发送 者。例子:合约A->合约B->合约C,如果合约C发 生错误并且B调用合约C时设置消息为可弹回,则 合约C将返回错误代码给合约B。
  8. 因为合约发生错误时只能返回很少的数据给上一 个合约,因此很难实现复杂合约链条的层层错误 返回。此时,合约的逻辑应直接根据错误情况发 送相应的处理消息给对应的接收方
  9. 单个合约可以消耗的最大Gas fee为 1 TON
  10. 智能合约需要支付租金并向其用户收费
  11. 合约可升级
  12. TON 代币精度为9位小数

合约竞争条件问题(race condition)的产生:因为交易里的所有合约的执行都是异步执行,交易里的某个 合约执行完后,传给下个合约的状态,可能已被其他交易更改了状态,也就是获得的状态不是最新的。 (特别地,如果一个原子性的操作被分割在两个或多个不同的合约时,极易产生合约竞争条件问题

TON上自然是没有ERC20的,下面是一个Jetton合约的示例:

Jetton合约:github.com/TonoxDeFi/c…

EDN