跳到主要内容

TVM 与 EVM

以太坊虚拟机(EVM)和 TON 虚拟机(TVM)都是为运行智能合约代码而开发的基于栈的虚拟机。虽然它们有共同的特点,但也有明显的区别。

数据介绍

以太坊虚拟机 (EVM)

  1. 基本数据单位
  • EVM 主要在 256 位整数上运行,反映了其围绕以太坊加密功能(如 Keccak-256 散列和椭圆曲线操作)的设计。
  • 数据类型主要限于整数和字节,有时也包括这些类型的数组,但所有数据类型都必须符合 256 位处理规则。
  1. 状态存储
  • 以太坊区块链的整个状态是 256 位地址到 256 位值的映射。这种映射保存在一种名为默克尔帕特里夏字典树(Merkle Patricia Trie,MPT)的数据结构中。
  • MPT 使以太坊能够通过加密验证有效地证明区块链状态的一致性和完整性,这对于像以太坊这样的去中心化系统至关重要。
  1. 数据结构限制
  • 简化为 256 位字限制意味着,EVM 本身并不是为直接处理复杂或自定义数据结构而设计的。
  • 开发人员往往需要在智能合约中执行额外的逻辑,以模拟更复杂的数据结构,这可能会导致 gas 成本和复杂性增加。

TON 虚拟机(TVM)

  1. 基于 Cell 的架构
  • TVM 使用独特的 "bag of cells" 模型来表示数据。每个 cell 最多可包含 128 个数据字节,最多可有 4 个指向其他 cell 的引用。
  • 这种结构允许 TVM 在其存储模型中直接支持任意代数数据类型和更复杂的结构,如树或有向无环图 (DAG)。
  1. 灵活性和效率
  • cell 模型具有极大的灵活性,使 TVM 能够比 EVM 更自然、更高效地处理各种数据结构。
  • 例如,通过 cell 引用创建链接结构的能力允许动态和潜在的无限数据结构,这对于某些类型的应用(如分散式社交网络或复杂的分散式金融(DeFi)协议)至关重要。
  1. 复杂数据处理
  • 虚拟机架构中固有的管理复杂数据类型的能力减少了智能合约中变通实现的需要,从而有可能降低执行成本并提高执行速度。
  • 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. 将键 1 推入堆栈: stack = (1)
  2. 为键 1 调用 DICTGET(检索与堆栈顶部键相关的值):检索值 10。stack = (10)
  3. 将键 2 推入堆栈: stack = (10, 2)
  4. 为键 2 调用 DICTGET: 读取 Cell_A 的引用。stack = (10, Cell_A)
  5. 从 cell _A 中载入数值:执行一条指令,从 cell 引用中载入数值。stack = (10, 10)
  6. 调用 ADD 指令:执行 ADD 指令时,TVM 将从堆栈中取出前两个元素相加,并将结果推回堆栈。在本例中,前两个元素分别是 10 和 10。相加后,堆栈将包含结果: stack = (20)
  7. 将键 3 推入堆栈: stack = (20, 3)
  8. 调用 DICTSET:存储 20,键值为 3。更新哈希表:
{
1: 10,
2: cell_a,
3: 20
}

要在 EVM 中实现同样的功能,我们需要定义一个存储键值对的映射,以及一个直接处理映射中存储的 256 位整数的函数。 必须指出的是,EVM 利用 Solidity 支持复杂的数据结构,但这些结构是建立在 EVM 较简单的数据模型之上的,与 TVM 更富表现力的数据模型有着本质区别

算术运算

以太坊虚拟机 (EVM)

  • 以太坊虚拟机(EVM)使用 256 位整数处理算术运算,这意味着加法、减法、乘法和除法等运算都是根据这种数据大小定制的。

TON 虚拟机(TVM)

  • TON 虚拟机(TVM)支持更多样化的算术运算,包括 64 位、128 位和 256 位整数(无符号和有符号)以及模运算。TVM 进一步增强了其算术功能,如乘法-移位和移位-除法等操作,这些操作对实现定点算术特别有用。这种多样性允许开发人员根据其智能合约的具体要求选择最有效的算术运算,并根据数据大小和类型提供潜在的优化。

溢出检查

以太坊虚拟机 (EVM)

  • 在 EVM 中,虚拟机本身并不执行溢出检查。随着 Solidity 0.8.0 的推出,自动溢出和下溢检查被集成到语言中,以增强安全性。这些检查有助于防止与算术运算相关的常见漏洞,但需要较新版本的 Solidity,因为早期版本需要手动执行这些保护措施。

TON 虚拟机(TVM)

  • 相比之下,TVM 会自动对所有算术运算执行溢出检查,这一功能直接内置在虚拟机中。这种设计选择从本质上降低了错误风险,提高了代码的整体可靠性和安全性,从而简化了智能合约的开发。

密码学和散列函数

以太坊虚拟机 (EVM)

  • EVM 支持以太坊特定的加密方案,如 secp256k1 椭圆曲线和 keccak256 哈希函数。 另外,EVM 没有内置的 Merkle 证明支持,这些证明是用于验证某个元素在集合中的成员身份的加密证明。

TON 虚拟机(TVM)

  • TVM 为预定义曲线(如 Curve25519)提供 256 位椭圆曲线加密(ECC)支持。它还支持某些椭圆曲线的 Weil 配对,这对快速实现 zk-SNARK(零知识证明)非常有用。它还支持 sha256 等常用哈希函数,为加密操作提供了更多选择。此外,TVM 还能与 Merkle 证明一起使用,提供额外的加密功能,这对某些用例(如验证区块中是否包含交易)很有帮助。

高级语言

以太坊虚拟机 (EVM)

  • EVM 主要使用 Solidity 作为其高级语言,这是一种面向对象的静态类型语言,类似于 JavaScript 和 C++。此外,还有其他用于编写以太坊智能合约的语言,如 Vyper、Yul 等。

TON 虚拟机(TVM)

  • TVM 使用 FunC 作为高级语言,用于编写 TON 智能合约。它是一种程序语言,具有静态类型并支持代数数据类型。FunC 可编译为 Fift,而 Fift 又可编译为 TVM 字节码。

结语

总之,虽然 EVM 和 TVM 都是基于堆栈的机器,旨在执行智能合约,但 TVM 提供了更大的灵活性,支持更广泛的数据类型和结构,内置溢出检查和高级加密功能。

TVM 支持分片感知智能合约,其独特的数据表示方法使其更适合某些用例和可扩展的区块链网络。