<aside> ⏰
晚上 7 点开播
</aside>
关于 Tolk 的更多背景,可以先阅读 《 Tolk 语言入门》和 《Tolk 1.1 Update》。
上周 Tolk 发布了最新的 1.2 版本,基于 TVM 12 引入的新汇编指令集,对内部和外部 address 进行了明确区分,同时支持完整的 rich bounces,以及更多底层功能优化。
今天我们会介绍下新版本的更新。
Tolk 语言的更新不仅仅是“语法糖”层面的小优化,而是会和底层的 TON 虚拟机(TVM)进行同步优化,这让 Tolk 不仅仅是语法层面在进化,同时在执行性能和部署成本等各方面都在不断优化。
本次 v1.2 最重要的是,引入了一个“非兼容性”更新,就是以后在 Tolk 语言中单独出现的 address 仅代表“内部地址(Internal address)”。 因为 TON 在设计的时候比较“超前”,考虑到多链或者多分片之间可能是不同的链架构,地址和共识模式都可以不同。然而当前根本没有外部地址的使用场景,所以这个超前设计目前只是带来一些编程麻烦而没有好处。
| 类型 | 实际含义 | 真实场景举例 |
|---|---|---|
| Internal address | 普通链上合约地址 | 你的 TON 钱包地址、Jetton 合约地址、NFT 地址等 |
| External address | TON 链外地址 | 比如给链外实体发消息,目前几乎没人用 |
| None | 地址为空(0:000…000) | 表示“这个变量根本没填地址” |
在旧的 FunC 和早期 Tolk 里,一个变量类型叫 address 时,它可以同时表示上面 3 种情况,运行时你必须自己手动判断到底是哪一种,最常见的就是如下写法:
;; 老写法,必须自己检查
if (owner.isInternal()) { ... } ;; 是不是内部地址?
Tolk v1.2 直接把 address 的语义拆成了 3 个更精准的类型:
| 新类型 | 能表示什么 | 对应旧写法 | 备注 |
|---|---|---|---|
| address | 只能是内部地址(Internal) | 以前的 address + 必须是 internal | 现在编译器 + TVM 自动帮你校验,序列化/反序列化时免费检查 |
| address? | 要么是内部地址,要么是 none(可空) | 以前的 “maybe address” | 跟 @ton/core 里的一模一样 |
| any_address | 三种都行(内部 / 外部 / none) | 以前的 address | 只有极少数需要外部地址的场景才用这个 |
99.9% 的合约(包括你写的 99.99% 的代码)只用到内部地址,所以现在直接写:tolk