智能合约开发周期循环
你可以把 TON 智能合约想象成一颗发射到地球轨道上的卫星。这颗卫星绕着地球飞行,与其他卫星互动,能够接受来自地球的信息,处理这些信息并发送一些结果。但是,在我们真正将它发射到太空之前,它还必须经过几个阶段。
- 有一个地面基地来组装卫星。【本地设置】
- 有一个专门的协议记录了所有可能需要卫星执行的指令【TL-B Scheme】
- 在基地实验室测试所有动作场景。【本地测试】
- 在此之后,卫星将进入与在太空环境非常相似的模拟环境,以便再次测试对预定义命令的预期响应,与太空和地球上其他主体的互动。【测试网络和部署后的链上测试】
- 如何将卫星送入轨道?火箭。火箭将卫星送入轨道,并将其留在轨道上,在成功完成任务后脱落。【主网生产部署】
从这一刻起,内部预设了一切程序的卫星就能在太空中独立运行了。
在编写智能合约时,我们也会经历类似的循环。
1.准备本地设置
本地设置的第一个关键是编译器。TON 区块链上的智能合约是以二进制代码的形式存储和执行的。但我们希望用人类可以理解的语言来编写逻辑,而我们用来编写 TON 合约的语言是 FunC。
FunC 与字节码之间的路径如下: FunC 被编译成 Fift 汇编程序代码,然后为 TON 虚拟机生成相应的字节码(如果以我们的卫星为例,则为 Space)。
对我们来说,Fift 汇编程序代码的本质并不重要,我们只将其视为智能合约代码的中间状态。我们把它交给编译器。
代码 -> FunC -> Fift -> BOC(字节码)
目前,运行编译器的最佳和主流方法是使用 TypeScript 。TypeScript 与 TVM 无关。把它想象成卫星发射后留在地球上的东西。
我们要使用的编译器是
@ton-community/func-js
。在这个包的内部同时有着 FunC 编译器和 Fift 解释器,将单个 lib 编译成 WebAssembly (WASM)。2.使用 TL-B 模式来记录智能合约要处理的命令
TL-B(Type Language - Binary,二进制类型语言),用于描述类型系统、构造函数和现有函数。下面是一个可能的 TL-B 文档示例:
通常情况下,当基本功能准备就绪后,我们就开始编写 TL-B 文档,然后不断更新,直到启动合约。
3.编写 FunC 代码
FunC 是一种特定领域的、类似 C 语言的静态类型语言。在后续中,我们将实际用 FunC 代码编写一些逻辑。
4.本地测试 FunC 代码
再次使用 TypeScript 编写测试逻辑。在这一步中,我们会在本地模拟 TVM 机器,将数据发送到模拟的合约中,分析输出结果,不断重复,直到得到理想输出。一旦准备好部署,我们就要编写 TypeScript 代码,将智能合约实际部署到区块链上。这就是我们的‘火箭’。
5.将代码部署到 testnet
在 TON 中,智能合约的部署过程非常有趣。如同之前提及的一样,因为我们可以在将智能合约实际部署到网络之前就计算出它的地址。
要做到这一点,我们需要知道合约的初始数据状态和实际代码。知道地址后,我们就可以向该地址发送包含初始状态和代码的信息。就这么简单。它可以是内部信息,也可以是外部信息。
因此,我们的部署脚本就是计算地址并向该地址发送包含初始状态和代码的消息。
但是在链上发送消息必须花费一些实际资金,但我们不想在链上部署和测试合约时花费大量的真金白银。所以这就是为什么需要有一个真实网络的副本,仅供测试之用。
开发者可以在这个网络上免费获取测试token,我们称这个网络为 testnet。在合约完全准备好用于生产之前,我们只会将其部署到测试网络。
6.启动-将代码部署到主网
将智能合约部署到主网的过程与测试网基本相同,但我们是用真正的 TON 币发送信息来部署我们的合约,我们的信息也会出现在主区块链上,所有 TON 用户都可以使用我们的合约。
有没有用于编写、测试和部署智能合约的标准本地设置(环境)?
TON 的编程工具正在快速增长,有时创建自定义本地设置并不合理。由 TON 基金会官方支持、TonTech 团队维护的Blueprint,只需运行一个本地命令即可使用它:
npm create ton@latest
这会生成一个新项目,其中包含上述所有阶段的代码。可以在 Bluprint 文档中阅读更多相关信息。
在介绍范围内,我们仍将创建一个自定义项目,以便更深入地了解整个流程的工作原理。