基本概念
EVM(ETHereum Virtual Machine)是「以太坊虚拟机」缩写。如果你有软件开发的背景,你一定听说过java虚拟机。流行的解释java虚拟机是:
我们写的java代码(不仅仅是java,groovy,scala等也可以)会被编译成字节码,但是字节码计算机是没办法识别的。 java虚拟机的功能是将字节码编译成计算机系统可识别的机器代码指令,然后在计算机上运行。如下图所示:
好吧,再说回来EVM。EVM存在是为了让我们使用它Solidity
编写的合同代码在以太坊环境中运行。以太坊相当于计算机环境,EVM将合同代码编译成以太坊可以识别的机器代码。现在可能不止以太坊,市场上出现了许多兼容的新公共链EVM(下面的章节将讨论)。让我们改变上图,类比如下:
EVM与公链有什么关系?
目前市场上主流公链大多兼容EVM。所谓的兼容性是,如果你在以太坊上写了一份智能合同,你也可以迁移到任何兼容链。
为什么要做这些链?EVM兼容呢?核心当然是以太坊在公链领域的影响力。目前市场上的各种公链此起彼伏,但是以太坊依然是公链领域的龙头。这些新兴的公链需要利用以太坊引流,如果开发者可以把智能合约直接无缝迁移到自己的链上,那就是最好的引流方式。
以太坊生态在这些公链出现之前,EVM已经部署了大量的应用。如果你不兼容这些应用,前进的道路必然是举步维艰。就好像咱们的鸿蒙系统,是可以兼容安卓全部应用的,这也是鸿蒙其中一个最重要的战略。
下图是全球公链的市场份额:
然后你可以在下面的网站上看到所有兼容性EVM的公链,
https://www.coincarp.com/zh/chainlist/
你会发现这些市场份额最高的公链基本兼容EVM的。
技术细节
如果你觉得很无聊,你可以跳过这部分。
大多数了解以太坊的人只是认为它是一个分布式账本,可以交易,有自己的货币、余额等。这种理解是正确的,但以太坊不仅如此,它还支持一种叫做智能合约的更强大功能。在这种情况下,我们可能更适合将以太坊比作分布式。它可以根据预定义的一组规则在不同的块之间更改,并执行任何机器代码。 区块中改变状态的具体规则是由 EVM 定义。
我们可以将以太坊视为基于交易的状态机器:当给定输入时,它会产生确定性输出。 因此,将以太坊更正式地描述为具有状态转换函数非常有帮助:
Y(S, T)= S'
给定旧的有效状态 (S)> 与一组新的有效交易 (T),以太坊状态转换函数 Y(S,T) 产生新的有效输出状态 S’。
看起来像电脑吗?
智能合同将被编译成遵守字节码的字节码EVM的opcodes可以执行指令。xor,and,add,sub等等。关于一切opcodes有兴趣的可以看以下说明:
https://ethereum.org/zh/developers/docs/evm/opcodes/
我们前面提到了两个关键词:交易和状态。交易触发了状态的变化,那么状态是什么呢?
在以太坊,状态实际上是一克尔树的数据结构。几年前,我写了一篇关于默克尔树的文章,如下:
Merkle Tree与区块链
这里我再简单总结两句话。
在默克尔树中,区块数据的哈希由叶节点保存,子节点的哈希由非叶节点保存。这种数据结构有两个重要特征:
- 只需要判断根节点的哈希值,就可以判断两个默克尔数是否相同。
- 可以快速判断默克尔树中是否存在数据。
以太坊有一个叫做世界状态的概念,它的数据结构是默克尔树。账户的映射关系保存在世界状态中,这些状态会随着交易的进行而不断变化。
以太坊有两种账户,一种是硬币交易账户,另一种是合同账户。后者是在我们创建智能合同时建立的。因此,智能合同的数据也存储在账户中,其状态也随交易而变化。
总结
人们经常讨论,EVM和非EVM哪个好。我们其实可以看到排名靠前的公链里其实也有不兼容EVM是的。哪个好?谁能统一未来的世界?
我个人的看法是,目前兼容EVM是主流。不兼容EVM公共链需要依靠创造力和着陆场景来创造自己的世界。目前,各方竞争非常激烈,一切尚未确定,时间是最好的见证人。
参考:
- https://www.footprint.network/dashboards
- https://ethereum.org/zh/developers/docs/evm/
- https://zhuanlan.zhihu.com/p/203347169