TON虚拟机 (TVM,有时TON VM) 执行区块链智能合约的虚拟计算机 TON这是网络执行层:每个 智能合同 存储并运行为TVM的程序. 机器处理进来的消息,改变合同的常态状态,并为其他合同构建输出消息.
TVM架构有三个要求:完全确定执行 (同一输入在任何节点上都会产生相同的结果),高密度的代码 (区块链中的最低空间) 和扩展指令集时的反向兼容性.
历史#
TVM是由Telegram团队在2018年开发的.:
- 2018 第一个与TON测试网络发布的TVM版本.
- 2020 年 3 月 发布详细的技术文件,描述数据类型,优化和合同说明.
- 2020年 (主网启动) TVM支持全面的操作集,并确保生产网络的确定性.
项目传递给社区后,TVM的开发通过TEP过程继续进行,更新通过改进建议进行,并通过验证器的共识激活.
基础知识#
TVM使用比特行作为数据的基本表示.它们以两种符号表示:
- 十六位数表示 长度乘以四位的行,分为4位的组,每个被写成一个十六位数 (0F). 如果长度不乘以4位,则添加一个特殊的结束标签来标记修改.
- 序列化为八 字符串分为8位组,并作为字节序列记录;必要时添加到8位的等级.
堆模型#
TVM 是一个堆式虚拟机.这意味着数据存储在 сте克 (last-in-first-out) 结构中,而不是命名变量或注册.大多数操作 (算术,比较,参数传输) 将参数从堆中取出并将结果放在那里. 堆模型比注册方法简单,并提供更密集的编码说明.
值类型
TVM堆使用固定的原始类型:
- Integer 257位符号整数 (选择分级可以容纳256位哈希加上没有损失的符号).
- Cell 包含最多1023位数据和最多4个链接到其他单元格的对象.
- Tuple 是各种类型的有序集合值.
- Slice 通过:阅读时指向剩余的数据和链接.
- Builder 一个缓冲区,可以连续组建新的Cell.
- Continuation 继续执行点的介绍; 下面见.
- Null 没有值;标记未初始化的字段.
指令类别
TVM指令按其用途分类为:
- 排列式和道式 堆重置,使用tuple;
- 常数 将预定的值插入到堆中;
- 算法学 自动检查过度填充的标准算术操作;
- 单元格操作 阅读Slice,录制Builder,使用链接;
- 控制流量 有条件的分支,循环,延续的呼唤;
- 应用原始词 专业的TON操作:处理地址,签名,消息激活器.
单元格及其类型#
单元格 (Cell) 是TVM和TON区块链本身的原子存储单元. 每个Cell包含高达1023位数据和高达4个链接到其他Cell. 通过链接形成的单元器图,导向循环图 (DAG):循环不允许. 区块区块中的任何数据 (智能合约,状态,消息,块) 都被存储为这样的图.
单元格类型
- 常用 (类型-1) 标准的数据和链接载体.
- 外来细胞 (exotic cells) 类型2255具有脱序和哈希的特点.用于截断的分支 (truncated branches),库链接和Merkle证据.
奇异的单元格可以传输部分区块链快照,
继续 (继续)#
Continuation 是管理流量的TVM中心结构.其实是延期计算:包含执行代码,当前堆和控制寄存器保存状态的标记.
继续是构建了子程序调用,条件操作,循环和例外处理的语言.在TVM中,继续更强大,也包括程序的不完全延续.
延伸类型
- 通常的 包含代码,堆,保存的注册表列表和代码页面 (见下文).
- 简单的 只有代码和代码页面,没有存储的数据堆.
- 目前的情况 (cc, current continuation) 表示正在执行的代码,是机器状态的关键部分.
控制是通过 JMP (传输控制) 和 RET (返回) 命令切换延续之间的.例外是特殊延续,在错误时被激活:它们获得错误参数并确定进一步的行为.条件和代结构 (IF,WHILE,REPEAT) 在延续上实现.
代码页面#
每个常规的延续带有一个16位代码页面 (cp) 字段,它决定如何解码其指令.这是一个反向兼容性机制:网络中可以同时存在合同,编译为不同版本的TVM指令集.
命令以二进制前代码编码,使其能够进行明确的解码和密集的表示.如果前不符合当前代码页面的允许的指示,则会产生不允许的对代码的排除.
在代码页面之间可以根据执行的操作自动切换,这允许专业化页面进行频繁的操作 (堆操作,数据处理) 并减少代码的容量.
TVM vs Ethereum Virtual Machine#
TVM和EVM都是智能合约的堆虚拟机,但有关键的区别.
| 属性 | TVM | EVM |
|---|---|---|
| 基本数据模型 | 单元格表 (Cell, 1023位 + 4个链接) | 256位字母 + 帕特里西亚·特里 Merkle |
| 整数大小 | 257位数 | 256 位 |
| 过度检查 | 自动 | 手动使用 (Solidity ≥0.8) |
| 密码学 | Curve25519, Weil pairings (zk-SNARKs), sha256 | secp256k1, keccak256 |
| 合同的主要语言 | FunC (静态类型化,ADT) | Solidity |
| 保存状态 | 按合约单元格分配 | 全球状态MPT |
细胞图简化了处理复杂结构 (树,DAG),比MPT需要更少的内存和计算资源.自动填充检查降低了典型的漏洞类.支持 Curve25519和Weil pairings 提供了EVM 开箱无法获得的加密功能.