主页 > imtoken钱包哪个版本好 > 以太坊源码学习之路(一):什么是以太坊虚拟机

以太坊源码学习之路(一):什么是以太坊虚拟机

imtoken钱包哪个版本好 2023-09-03 05:07:56

【区块链】以太坊源码学习之道(一):

什么是以太坊虚拟机

连一鸣着

Michael I 技术评审员

2017年10月11日下午,在蚂蚁金服科技领域最高级别的峰会ATEC大会上,蚂蚁金服CTO李程首次披露了蚂蚁金服面向未来的技术布局:“BASIC “ 战略。 “B”代表Blockchain(区块链)技术,在五个领域中排名第一,而其他四个分别对应于Artificial Intelligence(人工智能)、Security(安全)、IoT(物联网)和Cloud Computing(云计算) ). 不仅如此,IBM、摩根大通、德勤等公司也在积极投资区块链。 这波热潮也带动了越来越多的同学关注区块链。

然而,区块链技术涉及面广、协议复杂,涉及分布式系统、密码学、网络协议、博弈论等领域,初期学习曲线比较陡峭。 与人工智能等同样热门的领域相比,中国互联网上完整的区块链开发入门教程很少,而且大多是自媒体泛泛而谈。 本系列将基于最重要的区块链开发平台——以太坊,深入浅出地分享区块链开发的核心知识。 本文适合有基础开发经验的区块链初学者。

从虚拟机开始

“区块链1.0是以比特币为代表的加密货币架构,而区块链2.0是以以太坊为代表的可编程分布式信用基础设施。以太坊具有图灵完备的语言Solidity和独立运行环境是以太坊虚拟机,支持智能合约的执行和部署在区块链上。”

相信对区块链领域稍有了解的人,对上面的文字都不会陌生。 然而,刚开始学习以太坊时,看到这段话的笔者有很多疑问——

“什么是 EVM(以太坊虚拟机)?”

“以太坊的模型架构是什么?”

“我需要了解虚拟机内核之类的东西才能编写一个小应用程序吗?”

“但是为什么以太坊有虚拟机,而比特币却从来没有听说过呢?”

“等等,什么是虚拟机?”

所谓虚拟机,是指由软件模拟出的一个完整的计算机系统,具有完整的硬件系统功能,能够运行在一个与世隔绝的环境中。 除了系统级的虚拟机实现(基于VMware或Virtual Box等),还有一个很重要的就是计算机编程语言的虚拟机:它在实际计算机上模拟各种计算机功能,赋予计算机语言平台无关紧要。 其中最著名的是Java的JVM(Java Virtual Machine)。

Java虚拟机是Java跨平台特性的关键,使Java代码能够“一次编译,到处运行”。 Java虚拟机包括一组字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法字段,屏蔽了与特定平台相关的信息,使得Java语言编译器只需要生成在虚拟机平台上运行的字节码(而不是机器码)可以在多个平台上不加修改地运行。 它是不同底层平台和开发者之间的桥梁和中间件。

这一点在工程开发中具有很强的适用性。 举个例子,很多操作系统中C语言的INT(整数)类型是双字节(16位),扣除符号位后的整数范围是2的15次方; 但是,在最新的64位运算系统中,INT是四个字节,它的范围是2的31次方。 不同的系统有不同的API定义,不同的用法,不同的软中断向量。 任何使用系统 API 创建线程和进程的代码都不会通用。 在这种情况下,相同的代码在不同的环境中会产生不同的输出。

有了虚拟机,这个问题就可以轻松解决。 无论你是基于Windows系统还是Unix系统; 您使用的是手机还是个人电脑; 无论你是基于 X86 还是 X64 CPU,工程师都不需要关注操作系统的 API 和底层硬件的指令集以太坊代码是什么,只要你使用相同的代码,相同的输出。 这个特性在区块链场景下尤为重要。 根据共识机制,网络要求每个人都对智能合约代码的计算结果达成一致,但区块链节点(挖矿)的设备除了CPU和操作系统外,各不相同。 还有各种架构的显卡,所以以太坊选择用虚拟机开发区块链编程语言,就是现在的Solidity。

比特币脚本引擎

了解了什么是虚拟机后,我们开始思考一个更具体的问题——为什么以太坊需要虚拟机,而比特币不需要? 这个问题是关于比特币和以太坊的核心区别。 正如维特根斯坦所说:“语言的边界就是世界的边界”。 一句话通俗的解释是:在去中心化的场景下,比特币解决的是赚钱不出错的问题,而以太坊(希望)的解决方案是执行代码不出错。 理解比特币的转账模型对于宏观理解区块链至关重要。 本节将简要介绍比特币的脚本引擎。

交易是区块链世界的核心操作。 转账是交易,记录一条信息是交易,合约的签发和执行也是交易。 在加密货币应用中,一笔交易可以狭义地理解为不同地址之间货币金额的转移。

对于传统的中心化转账,如果Alice(A账户)要转x元给Bob(B账户),在验证A账户的身份和可用性以及B账户的可访问性后,银行的数据库会执行一个Pen原子操作“balance” [A] -= x,余额[B] += x”。 这样就完成了传输。

对于去中心化的比特币转账,转账之间的差异主要体现在对数据库的验证和修改上。 如果Alice(账户A)要转x元给Bob(账户B),Alice需要在网络中广播“地址A转X单位到地址B”和自己的公钥publicKeyA,并用自己的私钥privateKeyA进行签名. 节点收集广播信息后,首先会根据公钥验证签名,验证无误后将“balance[A] -= x, balance[B] += x”记录在各自的数据库中。 这里的“各自的数据库”是本地区块链数据的完整副本。

比特币交易的模型称为UTXO(Unspent Transaction Output):在比特币系统中,每个地址(账户)的当前余额并不直接存储在区块链中,而是通过其他人转账到账户中的未花费交易输出计算得出的。 在查询addressA的余额时,实际得到的是所有接收地址为addressA的UTXO数量之和。 广播内容类似于“addressA(combining UTXO1...UTXO3) gives X units to addressB”。 交易在网络中确认后以太坊代码是什么,B 账户将多出一笔可用的 UTXO。 如果他要花这笔钱,他需要证明他拥有addressB对应的privatekeyB。 私钥签名后,交易就变成了签名链。

验证交易时,没有必要返回整个区块链。 因为区块链遵循默克尔树的结构,这意味着区块链中的查询操作会非常低效(写操作效率更高)。 UTXO 专门存储在 leveldb 数据库 chainstate 中并缓存在内存中。 每当一个新的区块产生时,UTXOs 集合就会更新; 当一个节点进行链重构时,该过程将被回滚。 这里需要注意的是,UTXOs集合并不是待确认交易池(TxMemPool),而是所有待确认交易的输入源; 理论上可以通过 --reindex 从整个区块链重建 UTXO。

比特币的脚本引擎(Script)基于UTXO模型处理比特币交易。 上图展示了验证交易签名时的脚本操作和堆栈信息。 Script 是一种类似 Forth 的、基于堆栈的、无状态的、非图灵完备的语言。 它的操作码分为常量、过程控制、栈操作、算术操作、位操作、密码操作、保留字等,还包括3条内部使用的伪指令。 例如:OP_DUP负责复制栈顶元素入栈; OP_SHA256负责弹出栈顶元素,进行sha-256加密运算并将结果压入栈中; OP_CHECKSIG 会弹出栈顶元素和第二个栈顶元素(这里分别是 sig 和 pubkey),内部的 VerifySignature 函数会验证签名和公钥是否匹配。

综上所述,比特币模型精炼,场景简单,核心转账可以通过无状态、非图灵完备的脚本语言完成,因此比特币不需要专有的比特币虚拟机。 比特币脚本引擎的详细介绍可以参考官方代码和Hugh Parker的专栏,这里不再赘述。

以太坊虚拟机

经过以上两节的讨论,我们终于可以将注意力转回前三个问题。 我们强烈建议每一位区块链学习者深入了解以太坊虚拟机的原理,因为区块链应用与普通计算机应用完全不同。 本节主要阐述以太坊虚拟机及其正式定义。 限于篇幅,以太坊的交易模型和数据结构将在下一篇文章中详细讨论。

Gavin Wood 在以太坊黄皮书中将区块链系统抽象为基于交易的状态机。 这个数学模型不仅是以太坊的基础,也是目前大多数基于共识的去中心化交易系统的基础:

其中,式(1)中的S为系统内部状态集合,f为交易状态转移函数,T为交易信息,初始状态为Gensis状态; 式(2)中,F为块级状态转移函数,B为区域块信息; 式(3)将B定义为一系列交易区块,每个区块包含多笔交易; 式(4)中的G为区块终结函数,包括叔块验证、以太坊矿工奖励、POW验证等。

以太坊和比特币的本质体现在这个范式中的f和s上。 其核心思想——具有图灵完备性和无限内部交易存储空间的区块链。 对应于:

1] 强大的函数f,可以进行任何计算,比特币不支持循环;

2]状态S记录任何类型的数据(包括代码),而比特币的UTXO模型只能计算该地址的可花费金额。

基于上述范式,Vatalik Buterin 和 Gavin Wood 设计了以太坊虚拟机(EVM)。 EVM是一个完全独立的沙箱,合约代码可以与外界完全隔离,在EVM内部运行。 由于 EVM 分散存储在每个节点的计算机上,希望创建智能合约的公司可以使用 JavaScript 和 Python 等编程语言来创建运行在 EVM 上的应用程序; 同时,以太坊虚拟机可以与主网的其余部分隔离,运行时不影响主链的运行。 出于这个原因,以太坊有时被描述为“世界计算机”。

为了减少资源消耗,保证系统性能,以太坊虚拟机没有采用模拟完整计算机的模式,而是采用了更轻量级的虚拟机架构。 理论上,以太坊是图灵完备的,其虚拟机为智能合约的实现提供了基础,可以实现任意复杂度的操作。 但是它也有缺陷,比如缺乏EVM常用的Solidity语言的标准库,基于栈的架构易于优化但需要更多的操作码。 QTUM推出的量子链x86虚拟机是EVM衍生出来的虚拟机,旨在修改后者的不足。

结语

了解以太坊虚拟机是深入以太坊区块链开发的第一步。 本文从区块链初学者的角度,首先回顾了虚拟机的概念及其在分布式、跨平台场景下的优势,分析了比特币的脚本引擎和交易模型,探讨了比特币为什么不需要虚拟机。 最后,本文讨论了以太坊区块链系统的正式定义和以太坊虚拟机的原理。 在下一篇文章中,我们将详细介绍以太坊的交易模型和数据结构,敬请期待。