首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

什么是以太坊虚拟机

连奕明 I 文

Michael I 技术审稿

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

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

从虚拟机说起

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

相信每一个对区块链领域稍有了解的人都不会对上述的文字感到陌生。然而,在初学以太坊时,看到这段话的笔者却有着诸多的疑问——

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

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

“我写个小应用也需要了解虚拟机这么内核的东西吗?”

“可是为什么以太坊有虚拟机,比特币却没听说过有这个玩意?”

“等一下虚拟机是啥啊?”

所谓的虚拟机,是指通过软件模拟且具备完整硬件系统功能,并能在隔离环境下运行的完整计算机系统。除了系统级的虚拟机实现(基于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系统; 无论你是使用手机还是使用PC; 无论你是基于X86还是X64的CPU,工程人员皆无需关注操作系统的API和底层硬件的指令集,只要你使用的是相同的代码,就可以得到相同的输出。此特性在区块链场景下尤为重要,根据共识机制,网络要求所有人对于智能合约代码的计算结果达到一致,可是区块链节点(挖矿)的设备却彼此不同,除了CPU与操作系统,还有各种不同架构的显卡,因此以太坊选择去开发一套拥有虚拟机的区块链编程语言,也就是现在的Solidity。

比特币脚本引擎

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

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

对于传统的中心式转账而言,如果Alice (A账户)要向Bob (B账户)转账x元,在验证了A账户的身份与可用性及B账户的可达性后,银行的数据库会执行一笔原子化的操作“balance[A] -= x, balance[B] += x”。这样转账就完成了。

对于去中心化的比特币转账而言,转账的不同主要发生在数据库的验证与修改环节。如果Alice (A账户)要向Bob (B账户)转账x元,Alice需要在网络中广播“addressA transfers X units to address B”以及自己的公钥publicKeyA,并使用自己的私钥privateKeyA签名,网络中的节点在收集到广播信息后,会首先根据公钥验证签名,验证无误后则在各自的数据库中记录“balance[A] -= x, balance[B] += x”。此处“各自的数据库”为本地的区块链数据的完整拷贝。

比特币交易的模型被称为UTXO(Unspent Transaction Output):在比特币系统中,每一个地址(账户)的当前余额并不是直接存储在区块链里的,而是通过别人给该账户转账的未花费交易输出计算得到的。查询addressA的余额时,实际得到的是所有收款地址是adressA的UTXOs的额度的求和。广播内容类似“addressA(combining UTXO1...UTXO3) gives X units to addressB”。交易在网络中被确认后,B账户就会多了一个可用UTXO。如果他想花费这笔钱,需要证明自己拥有addressB对应的privatekeyB,在私钥签后交易就成了一串签名的链条。

在验证交易时,并不需要回溯整个区块链。因为区块链依循merkel tree的结构,这就意味着在区块链中做查询操作会非常低效(写入操作较为高效)。UTXOs专门存储在leveldb的数据库chainstate中,并且缓存在内存中。每当一个新的block生成,就会更新UTXOs集;当某个节点发生链重建现象,会回滚该过程。这里需要注意的是,UTXOs集不是待确认交易池(TxMemPool),而是所有待确认交易的input来源;UTXOs理论上也可以通过--reindex从整个区块链中重建。

比特币的脚本引擎(Script)正是基于UTXO模型处理比特币交易,上图给出了验证交易签名时的脚本操作与栈上信息。Script是一种类Forth、基于栈式模型、无状态的、非图灵完备的语言。其操作码opcodes分为常量、流程控制、栈操作、算术运算、位运算、密码学运算、保留字等若干类,还包括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是一系列交易的区块,每个区块都包括多个transaction;公式(4)中G是区块定稿函数,在以太坊中包括uncle块校验、奖励矿工、POW校验等。

以太坊与比特币本质体现在这个范式中的f和S。它的核心理念——具备图灵完备和不受限制的内部交易存储空间的区块链。分别对应:

1】功能强大的函数f,能够执行任何计算,比特币不支持loop;

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

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

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

结语

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

本文版权归作者所有。

新加坡南洋理工CAP组

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181002G0BNTO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券