TVM 与 EVM
以太坊虚拟机(EVM)和 TON 虚拟机(TVM)都是为运行智能合约代码而开发的基于栈的虚拟机。虽然它们有共同的特点,但也有明显的区别。
数据介绍
以太坊虚拟机 (EVM)
- 基本数据单位
- EVM 主要在 256 位整数上运行,反映了其围绕以太坊加密功能(如 Keccak-256 散列和椭圆曲线操作)的设计。
- 数据类型主要限于整数和字节,有时也包括这些类型的数组,但所有数据类型都必须符合 256 位处理规则。
- 状态存储
- 以太坊区块链的整个状态是 256 位地址到 256 位值的映射。这种映射保存在一种名为 默克尔帕特里夏字典树(Merkle Patricia Trie,MPT)的数据结构中。
- MPT 使以太坊能够通过加密验证有效地证明区块链状态的一致性和完整性,这对于像以太坊这样的去中心化系统至关重要。
- 数据结构限制
- 简化为 256 位字限制意味着,EVM 本身并不是为直接处理复杂或自定义数据结构而设计的。
- 开发人员往往需要在智能合约中执行额外的逻辑,以模拟更复杂的数据结构,这可能会导致 gas 成本和复杂性增加。
TON 虚拟机(TVM)
- 基于 Cell 的架构
- TVM 使用独特的 "bag of cells" 模型来表示数据。每个 cell 最多可包含 128 个数据字节,最多可有 4 个指向其他 cell 的引用。
- 这种结构允许 TVM 在其存储模型中直接支持任意代数数据类型和更复杂的结构,如树或有向无环图 (DAG)。
- 灵活性和效率
- cell 模型具有极大的灵活性,使 TVM 能够比 EVM 更自然、更高效地处理各种数据结构。
- 例如,通过 cell 引用创建链接结构的能力允许动态和潜在的无限数据结构,这对于某些类型的应用(如分散式社交网络或复杂的分散式金融(DeFi)协议)至关重要。
- 复杂数据处理
- 虚拟机架构中固有的管理复杂数据类型的能力减少了智能合约中变通实现的需要,从而有可能降低执行成本并提高执行速度。
- TVM 的设计对于需要复杂状态管理或互联数据结构的应用尤其有利,为开发人员构建复杂、可扩展的去中心化应用提供了坚实的基础。
堆栈机
以太坊虚拟机 (EVM)
- EVM 以传统的堆栈式机器方式运行,使用后进先出(LIFO)堆栈管理计算。
- 它通过推入和弹出 256 位整数来处理操作,这是堆栈中所有元素的标准大小。
TON 虚拟机(TVM)
- TVM 也能像基于堆栈的机器一样运行,但有一个关键区别:它同时支持 257 位整数和 cell 引用。
- 这样,TVM 就能将这两种不同类型的数据推入/推出堆栈,提高直接数据操作的灵活性。
堆栈操作示例
假设我们想在 EVM 中将两个数字(2 和 2)相加。这个过程包括将数字推入堆栈,然后调用 "ADD "指令。结果(4)将留在堆栈顶部。
我们可以在 TVM 中以同样的方式进行这种操作。不过,让我们看看另一个例子,其中的数据结构更为复杂,例如哈希表和 cell 引用。假设我们有一个存储键值对的哈希表,其中键是整数,值是整数或 cell 引用。假设我们的哈希表包含以下条目:
{
1: 10
2: cell_a (which contains 10)
}
我们希望将键 1 和键 2 的相关值相加,然后将结果存储在键 3 中。让我们来看看堆栈操作:
- 将键 1 推入堆栈:
stack
= (1) - 为键 1 调用
DICTGET
(检索与堆栈顶部键相关的值):检索值 10。stack
= (10) - 将键 2 推入堆栈:
stack
= (10, 2) - 为键 2 调用
DICTGET
: 读取 Cell_A 的引用。stack
= (10, Cell_A) - 从 cell _A 中载入数值:执行一条指令,从 cell 引用中载入数值。
stack
= (10, 10) - 调用
ADD
指令:执行ADD
指令时,TVM 将从堆栈中取出前两个元素相加,并将结果推回堆栈。在本例中,前两个元素分别是 10 和 10。相加后,堆栈将包含结果:stack
= (20) - 将键 3 推入堆栈:
stack
= (20, 3) - 调用
DICTSET
:存储 20,键值为 3。更新哈希表:
{
1: 10,
2: cell_a,
3: 20
}
要在 EVM 中实现同样的功能,我们需要定义一个存储键值对的映射,以及一个直接处理映射中存储的 256 位整数的函数。 必须指出的是,EVM 利用 Solidity 支持复杂的数据结构,但这些结构是建立在 EVM 较简单的数据模型之上的,与 TVM 更富表现力的数据模型有着本质区别