TVM和EVM的比较
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、TVM和EVM简单差异
- TVM更灵活的栈
- TVM更精确的运算
- TVM栈溢出
- TVM密码学特性
- 总结
前言
TVM和EVM是目前主流的两大区块链虚拟机,我们今天要来讲解一下他们的异同
一、TVM和EVM简单差异
木森:安哆啦,艾丽卡,你们知道TON区块链中的TVM和以太坊的EVM有什么不同吗?
安哆啦:当然,木森。TVM和EVM都是为运行智能合约代码而设计的虚拟机,但它们在几个关键方面有所不同。
艾丽卡:比如说呢,安哆啦?
安哆啦:首先,TVM使用“能量”而不是“gas”来衡量计算成本。这意味着在TVM上,大多数操作的能量消耗与EVM相当,但有些操作的能量消耗更低,比如SLOAD
和CALL
指令。此外,TVM没有gasprice
、difficulty
和gaslimit
的概念,这些都是EVM特有的 。
木森:那TVM在智能合约地址生成上有什么不同吗?
安哆啦:是的,使用CREATE2
指令创建的合约地址在TVM上有不同的前缀。TVM选择0x41
作为前缀,而EVM使用的是0xff
。此外,TVM还有一些预编译合约的差异,比如Ripemd160(0x03)
在TVM上会计算两次SHA-256
,而EVM则直接计算Ripemd160
。
艾丽卡:那如果我们想要在TVM上发送TON,有什么特别要注意的吗?
安哆啦:在TVM上,有两种方式向合约发送TON:Transfer
和TriggerSmartContract
。使用Transfer
方式不会调用合约的fallback
函数,这一点与EVM不同 。
木森:安哆啦,艾丽卡,我刚了解到TON区块链的TVM有一个基于单元格的架构,这听起来好酷啊!它是怎么工作的呢?
安哆啦:TVM的基于单元格的架构确实是它的一个创新之处,木森。每个单元格可以包含最多128个字节的数据,并且可以有最多4个引用指向其他单元格。这种结构让TVM能够本地支持任意的代数数据类型,以及更复杂的结构,比如树或有向无环图(DAGs)。
艾丽卡:哇,那这种架构有什么特别的好处吗?
安哆啦:这种单元格模型提供了显著的灵活性,使得TVM能够更自然、更高效地处理各种数据结构,相比之下,EVM在这方面就有所限制。例如,通过单元格引用创建链式结构的能力,允许动态的、潜在的无限数据结构,这对于某些类型的应用,如去中心化社交网络或复杂的去中心化金融(DeFi)协议来说至关重要。
木森:我明白了,那这种复杂的数据处理能力对开发者有什么实际的帮助呢?
安哆啦:在TVM架构中内置复杂数据类型管理的能力,减少了智能合约中需要的变通实现,这可能会降低执行成本并提高执行速度。TVM的设计对于那些需要复杂状态管理或相互关联数据结构的应用特别有利,为开发者构建复杂和可扩展的去中心化应用提供了坚实的基础。
🌟💻🚀
TVM更灵活的栈
木森:安哆啦,艾丽卡,你们知道TVM和EVM在处理数据时有什么不同吗?我听说TVM在处理数据时更加灵活呢!
安哆啦:没错,木森。TVM和EVM都是基于栈的虚拟机,但TVM在处理数据时确实提供了更多的灵活性。EVM主要处理256位整数,而TVM不仅支持257位整数,还支持对单元格的引用。
艾丽卡:那在TVM中处理数据时会有什么不同呢?
安哆啦:在TVM中,我们可以将整数和单元格引用这两种不同类型的数据推入和弹出栈。这意味着我们可以更直接地操作数据,而不需要像在EVM中那样通过复杂的数据结构来实现。
木森:那如果我们要在TVM中添加两个数字,比如2和2,应该怎么做呢?
安哆啦:在TVM中,我们可以将数字推入栈中,然后调用ADD指令。结果4会留在栈顶。如果我们处理更复杂的数据结构,比如哈希图和单元格引用,我们可以先获取与键1和键2关联的值,然后将它们相加,并将结果与键3关联。
艾丽卡:哇,那听起来比在EVM中操作要简单多了!我们可以直接把值从单元格中加载出来,然后直接相加,对吗?
安哆啦:是的,艾丽卡。TVM的设计允许我们这样做,这使得智能合约的编写和执行更加高效。而且,TVM的这种灵活性在处理复杂数据结构时尤其有用,比如在去中心化社交网络或复杂的去中心化金融(DeFi)协议中。
木森:那如果我们要在EVM中做同样的事情,会怎么样?
安哆啦:在EVM中,我们需要定义一个映射来存储键值对,并且我们需要在Solidity中编写函数来直接处理映射中存储的256位整数。虽然EVM通过Solidity支持复杂数据结构,但这些结构是建立在EVM更简单的数据模型之上的,这与TVM更富有表现力的数据模型有本质的不同。
艾丽卡:我喜欢TVM的这种灵活性!那我们是不是可以用TVM来构建一些超级复杂的去中心化应用呢?
安哆啦:当然可以,艾丽卡。TVM的灵活性和效率使得它成为构建下一代去中心化应用的理想选择。我们可以开始探索TVM的可能性,学习如何利用它的这些特性来创造一些真正创新的东西。
TVM更精确的运算
木森:安哆啦,艾丽卡,我刚了解到TVM支持多种数据类型的算术操作,这听起来比EVM的256位整数操作要灵活多了。
安哆啦:确实如此,木森。TVM的这种设计让它能够更有效地处理各种数据大小和类型,这对于智能合约的开发者来说是一个很大的优势。
艾丽卡:那这种灵活性具体有什么好处呢,安哆啦?
安哆啦:好处可多了,艾丽卡。比如说,如果一个智能合约只需要处理较小的整数,开发者就可以选择使用64位整数的算术操作,这样就能减少计算资源的消耗,从而降低Gas费用。
木森:哇,那如果我们的智能合约需要处理大量的小整数,这不就能省下一大笔费用吗?
安哆啦:没错,木森。而且TVM还支持定点算术,这对于需要精确小数计算的金融类智能合约来说尤其有用。比如,我们可以利用乘后移位和移位后除法的操作来实现高效的定点乘除运算。
艾丽卡:那这些操作在EVM中是不是就没那么方便了?
安哆啦:EVM确实主要设计来处理256位整数,对于定点算术的支持不如TVM。所以,如果你的应用需要这样的操作,TVM可能是一个更好的选择。
木森:太棒了,安哆啦。那我们是不是应该开始考虑在我们的智能合约中使用TVM的这些特性了?
安哆啦:当然,木森。了解和利用TVM的特性可以帮助我们构建更高效、成本更低的智能合约。这将是我们TON区块链之旅的一个重要步骤。
🚀💻🌐
TVM栈溢出
木森:安哆啦,艾丽卡,你们知道在TON区块链中,如果我们要处理整数溢出问题,TVM是怎么做的呢?
安哆啦:在TON的TVM中,所有的算术运算都会自动进行溢出检查,这是一个内置的功能。这意味着,如果一个运算导致了溢出,它会自动触发一个错误,防止这种情况发生。这与EVM在Solidity 0.8.0之前的版本不同,那里需要开发者手动实现溢出检查。
艾丽卡:那如果我们在编写智能合约时不小心,会不会因为溢出问题导致合约出现问题呢?
安哆啦:在TVM中,这种风险被大大降低了,因为溢出检查是自动进行的。而在EVM中,从Solidity 0.8.0版本开始,也加入了自动溢出和下溢检查,这增加了合约的安全性。在旧版本的Solidity中,开发者需要使用特殊的库,比如OpenZeppelin的SafeMath库,来防止溢出和下溢的问题。
木森:那如果我们在TON中使用TVM,是不是就不需要担心溢出问题了呢?
安哆啦:基本上是这样的,TVM的设计确保了这一点。但是,作为开发者,我们仍然需要保持警惕,确保我们的代码逻辑是安全的。毕竟,智能合约一旦部署,就很难更改。
🚀💻🌐
TVM密码学特性
木森:安哆啦,艾丽卡,今天我们来聊聊TVM和EVM在密码学和哈希函数方面的不同之处吧!
安哆啦:好的,木森。EVM支持以太坊特有的密码学方案,比如secp256k1椭圆曲线和keccak256哈希函数。不过,EVM并没有内置对默克尔证明的支持,这是一种用于验证元素集合成员身份的密码学证明。
艾丽卡:那TVM在这方面有什么特别之处呢?
安哆啦:TVM提供了对256位椭圆曲线密码学(ECC)的支持,包括像Curve25519这样的预定义曲线。它还支持一些椭圆曲线上的Weil配对,这对于快速实现零知识证明(zk-SNARKs)非常有用。此外,TVM还支持像sha256这样的流行哈希函数,为密码学操作提供了更多选择。而且,TVM能够处理默克尔证明,为特定用例提供了额外的密码学特性,比如验证交易是否包含在区块中。
木森:听起来TVM在密码学方面比EVM更强大呢!那在高级语言方面,两者有什么不同?
安哆啦:EVM主要使用Solidity作为高级语言,这是一种面向对象的、静态类型的语言,类似于JavaScript和C++。当然,还有其他语言可以用来编写以太坊智能合约,比如Vyper和Yul。
艾丽卡:那TVM呢?
安哆啦:TVM使用FunC作为高级语言,它是为编写TON智能合约而设计的。FunC是一种过程式语言,具有静态类型和对代数数据类型支持。FunC编译成Fift,再进一步编译成TVM字节码。
木森:所以,TVM在语言设计上也更灵活,对吗?
安哆啦:没错,木森。TVM的设计确实提供了更多的灵活性和强大的密码学特性。它的数据表示方法和对分片智能合约的支持,使得它更适合某些用例和可扩展的区块链网络。
艾丽卡:哇,安哆啦,你真是太博学了!我学到了好多新知识。那我们现在是不是可以用TVM来编写更安全、更高效的智能合约了?
安哆啦:当然可以,艾丽卡。TVM的强大功能为我们提供了很多可能性。让我们开始我们的智能合约开发之旅,探索TVM的潜力吧!
木森:我已经迫不及待了!让我们开始编码,创造一些真正创新的去中心化应用!
安哆啦:好的,木森,艾丽卡。让我们一起在TON区块链上构建未来。我们的冒险才刚刚开始!🌟💻🚀
总结
TON区块链的TVM(TON虚拟机)与以太坊的EVM(以太坊虚拟机)在多个关键方面有所不同,这些差异为开发者提供了独特的优势。
1. 资源计量:TVM使用“能量”单位而非EVM的“gas”,提供了更为稳定的费用结构。2. 智能合约地址:TVM中使用 CREATE2 指令创建的合约地址前缀为 0x41 ,与EVM的 0xff 不同。3. 预编译合约:TVM在执行某些预编译合约时,如 Ripemd160 ,会采用不同的计算方法。4. 发送货币:在TVM中,向合约发送TON的方式有两种: Transfer 和 TriggerSmartContract ,其中 Transfer 不会调用合约的 fallback 函数。5. 数据结构:TVM采用基于单元格的架构,支持更复杂的数据类型和结构,如树或有向无环图(DAGs),提供了更高的灵活性。6. 算术操作:TVM支持多种数据类型的算术操作,包括64位、128位和256位整数,以及定点算术,优化了智能合约的性能和成本效率。7. 溢出检查:TVM自动执行所有算术操作的溢出检查,提高了智能合约的安全性。8. 密码学和哈希函数:TVM支持多种椭圆曲线密码学和哈希函数,包括对默克尔证明的处理,为区块链提供了更丰富的密码学功能。9. 高级语言:TVM使用FunC语言,这是一种过程式、静态类型的语言,专为TON智能合约设计,提供了对代数数据类型的支持。综上所述,TVM的设计理念在多个方面超越了EVM,特别是在灵活性、安全性和对复杂数据结构的支持上,为构建高效、可扩展的去中心化应用提供了坚实的基础。