原文:What is Ethereum?
以太坊是“世界计算机”。这是以太坊平台最常见的描述之一。但是,这是什么意思?让我们尝试以计算机科学为重点的描述开始,然后尝试通过对以太坊的功能和特性进行更实际的分析来解读,同时将其与比特币和其他分布式分类帐本技术进行比较(为简单起见,我们经常会参考作为“区块链”)。
从计算机科学的角度来看,以太坊是一个确定性但实际上无界的状态机,具有两个基本功能; 第一个是全局可访问的单例状态,第二个是将更改应用于该状态的虚拟机。
从更实际的角度来看,以太坊是一个开源的、全球分布的计算基础设施,执行称为智能合约的程序。它使用区块链来同步和存储系统状态以及名为ether的加密货币,以计量和约束执行资源成本。
以太坊平台使开发人员能够构建具有内置经济功能的强大去中心化应用程序。在提供持续正常运行时间的同时,它还减少或消除了审查,第三方界面和交易对手风险。
与比特币对比
很多人会带着加密货币的先前经验来到以太坊,特别是比特币。以太坊与其他开放区块链共享许多共同元素:连接参与者的P2P网络,状态同步的共识算法(工作量证明),数字货币(ether)和全局分类账本(区块链)。
区块链的组成部分
开放的公共区块链的组成部分(通常)是:
- 基于标准化的“gossip”协议,连接参与者和传播交易以及验证交易区块的P2P网络。
- 在状态机中实现的一组共识规则。
- 以交易形式表示状态转换的消息。
- 根据共识规则处理交易的状态机。
- 分布式数据库,即区块链,记录所有状态转换的日志。
- 一种共识算法(例如,工作证明),强制参与者通过共识规则进行竞争和约束来分散对区块链的控制。
- 上面的一个或多个开源软件实现。
所有或大多数这些组件通常组合在一个软件客户端中。例如,在比特币中,参考实现由Bitcoin core
开源项目开发,并作为比特币客户端实现。在以太坊中,不是参考实现,而是有一个参考规范,黄皮书中系统的数学描述。有许多客户端是根据参考规范构建的。
在过去,我们使用术语“区块链”来表示上述所有组件,作为包含上述所有特征的技术组合的简写参考。然而,今天,区块链这个词已被营销人员和奸商所稀释,他们希望炒作他们的项目,并为他们的初创公司获得不切实际的估值。它本身实际上毫无意义。我们需要限定符来帮助我们理解所讨论的区块链的特征,例如开放、公共、全球、去中心化、中立和审查制度,以确定这些组件允许的“区块链”系统的重要新兴特征。
并非所有区块链都生而平等。当你被告知某些东西是区块链时,你还没有得到答案,而是你需要开始提出很多问题来澄清“区块链”的含义。首先询问上述组件的描述,然后询问这个“区块链”是否具有开放、公共等特征。
以太坊的发展
在许多方面,以太坊的目的和构造都与之前的开放区块链(包括比特币)截然不同。
以太坊的目的主要不是数字货币支付网络。虽然数字货币ether对于以太坊的运营而言都是不可或缺的,但ether是用作支付使用以太坊平台的公用事业货币。
与具有非常有限的脚本语言的比特币不同,以太坊被设计为通用可编程区块链,其运行能够执行任意和无限复杂代码的虚拟机。比特币的脚本语言被故意限制为对支出条件的简单真/假评估,以太坊的语言是图灵完备,这意味着它等同于可以运行理论图灵机可以运行的任何计算的通用计算机。
以太坊的诞生
所有伟大的创新都解决了实际问题,以太坊也不例外。以太坊是在人们认识到比特币模型的力量,并试图超越加密货币应用程序的应用,进入其他项目的时候构思出来的。但开发人员面临一个难题:他们要么需要建立在比特币之上,要么开始新的区块链。以比特币为基础意味着生活在网络的故意限制之内并试图找到变通方法。数据存储的有限类型和大小似乎限制了可以作为第二层解决方案运行的应用程序类型。程序员需要构建仅使用有限变量集,交易类型和数据的系统。对于需要更多自由,更大灵活性的项目,启动新的区块链是唯一的选择。
2013年底,年轻的程序员和比特币爱好者Vitalik Buterin开始考虑进一步扩展比特币和Mastercoin(一种将比特币扩展到提供基本智能合约的覆盖协议)的功能。2013年10月,Vitalik为Mastercoin团队提出了一种更为通用的方法,即允许灵活且可编写脚本(但不是图灵完备)的合约取代Mastercoin的专业合约语言。虽然Mastercoin团队留下了深刻的印象,但这个提议过于激进,无法适应他们的发展路线图。
2013年12月,Vitalik开始分享一份白皮书,概述了以太坊背后的理念:图灵完备可编程和通用区块链。几十人看到了这个早期的草案,并向Vitalik提供了反馈,帮助他逐步改进提案。
本书的两位作者都收到了白皮书的早期草稿并对其进行了评论。Andreas M. Antonopoulos对这个想法很感兴趣,并向Vitalik询问了许多关于使用单独的区块链来强制执行关于智能合约执行的共识规则以及图灵完备语言含义的问题。Andreas继续非常感兴趣地关注以太坊的发展,但是在撰写他的著作“精通比特币”的早期阶段,直到很久以后才直接参与以太坊。然而,Gavin Wood博士是第一批接触Vitalik并提供帮助他的C++编程技能的人之一。Gavin成为以太坊的联合创始人,联合设计师兼首席技术官。
正如Vitalik在他的"Ethereum Prehistory"中所述:
这是以太坊协议完全是我自己创造的时候。然而,从现在开始,新的参与者开始加入这一行列。
到目前为止,协议方面最突出的是Gavin Wood。
...
通过将以太坊作为构建可编程货币的平台,以及基于区块链的合约,可以保存数字资产并根据预先
设定的规则将其转移到通用计算平台,Gavin也可以在很大程度上归功于视觉的细微变化。
这开始于重点和术语的微妙变化,随后越来越强调“Web 3”集合,将以太坊视为
一组去中心化技术的一部分,另外两个是Whisper和Swarm,这种影响变得更强。
从2013年12月开始,Vitalik和Gavin一起完善和改进了这个想法,共同构建了成为以太坊的协议层。
以太坊的创始人正在考虑不是针对特定目的的区块链,而是通过编程支持各种各样的应用程序。这个想法是通过使用像以太坊这样的通用区块链,开发人员可以编程他们的特定应用程序,而无需引导P2P网络,区块链,共识算法等的底层机制。以太坊平台旨在抽象这些详细信息并为去中心化的区块链应用程序提供确定性和安全的编程环境。
就像Satoshi,Vitalik和Gavin不仅仅发明了一项新技术一样,他们以一种新颖的方式将新发明与现有技术相结合,并提供源代码以向世界证明他们的想法。
创始人工作多年,建立和完善愿景。2015年7月30日,第一个以太坊区块被开采。“世界计算机”开始为世界服务......
Vitalik Buterin的文章“以太坊的前史”于2017年9月出版,为以太坊最早的时刻提供了一个迷人的第一人称视角。
你可以在https://vitalik.ca/general/2017/09/14/prehistory.html上阅读。
以太坊的四个发展阶段
以太坊的诞生是第一阶段的发布,名为“Frontier”。以太坊的发展计划分为四个不同的阶段,每个新阶段都会发生重大变化。每个阶段可能包括子版本,称为“硬分叉”,以不向后兼容的方式更改功能。
四个主要发展阶段是代号为Frontier,Homestead,Metropolis和Serenity。中间硬分叉代号为“Ice Age”,“DAO”,“Tangerine Whistle”,“Spurious Dragon”,“Byzantium”和“Constantinople”。下面列出了硬分叉发生的区块编号:
Block #0
"Frontier" - 以太坊的初始阶段,持续时间为2015年7月30日至2016年3月。
Block #200,000
"Ice Age" - 引入指数难度增加的硬分叉,促使向 Proof-of-Stake 过渡。
Block #1,150,000
"Homestead" - 以太坊的第二阶段,于2016年3月推出。
Block #1,192,000
"DAO" - 扭转了被攻击的DAO合约并导致以太坊和以太坊经典分裂成两个竞争系统的硬分叉。
Block #2,463,000
"Tangerine Whistle" - 改变某些IO运算的gas计算,并从拒绝服务攻击中清除累积状态,该攻击利用了这些操作的低gas成本。
Block #2,675,000
"Spurious Dragon" - 一个解决更多拒绝服务攻击媒介的硬分叉,以及另一种状态清除。此外,还有重播攻击保护机制。
现在的状态
我们目前处于“Metropolis”阶段,计划作为代号为Byzantium和Constantinople的两个硬分叉。Byzantium于2017年10月生效,预计到2018年中期Constantinople。
Block #4,370,000
"Metropolis Byzantium" - Metropolis是以太坊的第三个阶段,目前在撰写本书时,于2017年10月推出.Byzantium是Metropolis的两个硬分叉中的第一个。
未来的计划
在Metropolis'Byzantium硬叉之后,还有一个为Metropolis计划的硬叉。大都会之后是以太坊部署的最后阶段,代号为Serenity。
Constantinople
Metropolis阶段的第二部分,计划于2018年中期。预计将包括切换到混合POW/POS共识算法,以及其他变更。
Serenity
以太坊的第四个也是最后一个阶段。Serenity尚未有计划的发布日期。
以太坊:通用区块链
原始区块链(比特币的区块链)跟踪比特币的单位状态及其所有权。你可以将比特币视为分布式共识状态机,其中交易导致全局状态转换,从而改变硬币的所有权。状态转换受到共识规则的约束,允许所有参与者在挖掘几个区块之后(最终)收敛于系统的共同(共识)状态。
以太坊也是一个分布式状态机。但是,以太坊不仅仅跟踪货币所有权状态,而是跟踪通用数据存储的状态转换。一般来说,我们指的是任何可以表示为键值元组的数据。键值数据存储只存储由某个键引用的任意值。例如,存储值“Mastering Ethereum”,由“Book Title”键引用。在某些方面,这与通用计算机使用的随机存取存储器(RAM)的数据存储模型具有相同的目的。以太坊有记忆它存储代码和数据,并使用以太坊区块链来跟踪内存随时间的变化情况。与通用存储程序计算机一样,以太坊可以将代码加载到其状态机中并运行该代码,将结果状态更改存储在其区块链中。与通用计算机的两个关键区别在于,以太坊状态变化由共识规则控制,并且状态全局分布在共享分类账上。以太坊回答了这样一个问题:“如果我们能够跟踪任意状态并对状态机进行编程,创建一个在共识下运行的全球计算机怎么办?”。
以太坊的组成部分
在以太坊中,描述的区块链系统中的组件更具体地说:
P2P网络
以太坊在以太坊主网络上运行,该网络可在TCP端口30303上寻址,并运行一个名为ÐΞVp2p的协议。
共识规则
以太坊的共识规则,在参考规范中定义。
交易
以太坊交易是网络消息,包括(其中包括)发送者,接收者,值和数据的有效载荷。
状态机
以太坊状态转换由以太坊虚拟机(EVM)处理,这是一个执行字节码(机器语言指令)的基于堆栈的虚拟机。称为“智能合约”的EVM程序是用高级语言编写的(例如Solidity),并编译为字节码以便在EVM上执行。
Blockchain
以太坊的区块链作为数据库(通常是Google的LevelDB)本地存储在每个节点上,该数据库包含称为Merkle Patricia Tree的序列化哈希数据结构中的交易和系统状态。
共识算法
以太坊目前使用名为Ethash的Proof-of-Work算法,但有计划在不久的将来过渡到代号为Casper的Proof-of-Stake系统。
客户端
以太坊有几种可互操作的客户端软件实现,其中最突出的是Go-Ethereum(Geth)和Parity。
进一步参考
以太坊黄皮书:https://ethereum.github.io/yellowpaper/paper.pdf
“Beige Paper”:用不太正式的语言为更广泛的受众重写“黄皮书”:https://github.com/chronaeon/beigepaper
ÐΞVp2p网络协议:https://github.com/ethereum/wiki/wiki/%C3%90%CE%9EVp2p-Wire-Protocol
以太坊虚拟机Awesome List:https://github.com/ethereum/wiki/wiki/Ethereum-Virtual-Machine-(EVM)-Awesome-List
LevelDB数据库(最常用于存储区块链的本地副本):http://leveldb.org
Merkle Patricia Trees:https://github.com/ethereum/wiki/wiki/Patricia-Tree
Ethash工作证明共识算法:https://github.com/ethereum/wiki/wiki/Ethash
Casper Proof-of-Stake v1实施指南:https://github.com/ethereum/research/wiki/Casper-Version-1-Implementation-Guide
Go-Ethereum(Geth)客户:https://geth.ethereum.org/
Parity以太坊客户:https://parity.io/
以太坊和图灵完备性
一旦你开始阅读以太坊,你会立即听到“图灵完备”一词。他们说,以太坊与比特币不同,是“图灵完备”。这到底是什么意思呢?
术语“图灵完备”以英国数学家艾伦·图灵(Alan Turing)的名字命名,他被认为是计算机科学之父。1936年,他创建了一个计算机的数学模型,该计算机由一个操纵符号的状态机组成,通过在顺序存储器上读取和写入它们(类似于无限长的磁带)。通过这种结构,Alan Turing继续提供数学基础来回答(否定的)关于通用可计算性的问题,这意味着是否所有问题都是可解决的。他证明了存在一些无法计算的问题。具体来说,他证明了停机问题(试图评估程序是否最终会停止运行)是不可解决的。
Alan Turing进一步将系统定义为Turing Complete,如果它可用于模拟任何图灵机。这种系统称为通用图灵机(UTM)。
以太坊能够在称为以太坊虚拟机的状态机中执行存储程序,同时向内存读取和写入数据,使其成为图灵完备系统,因此成为通用图灵机。考虑到有限存储器的限制,以太坊可以计算任何可由任何图灵机计算的算法。
以太坊的突破性创新是将存储程序计算机的通用计算体系结构与去中心化的区块链相结合,从而创建分布式单状态(单例)世界计算机。以太坊程序“无处不在”,但产生一个共识状态,由共识规则保证。
图灵完备性作为“特征”
听说以太坊是图灵完备,你可能会得出结论,这是一个在图灵不完整的系统中某种程度上缺乏的功能。相反,它恰恰相反。需要非常集中精力来约束系统,使其不是图灵完备。即使是最简单的状态机,也会出现图灵完备性。实际上,已知的最简单的图灵完备状态机(Rogozhin,1996)有4个状态并使用6个符号,状态定义只有22个指令长。
图灵完备性不仅可以在最简单的系统中实现,而且被设计为受限制的系统使得它们是图灵不完备的,通常被发现是“意外图灵完备”。图灵不完备的约束系统设计起来比较困难,必须小心维护才能保持图灵不完备。
可以在此处找到“意外图灵完备”系统的有趣参考:http://beza1e1.tuxen.de/articles/accidentally_turing_complete.html
以太坊是图灵完备的事实意味着任何复杂程序都可以在以太坊中计算出来。但这种灵活性带来了一些棘手的安全和资源管理问题。
图灵完备性的含义
图灵证明,你无法通过在计算机上模拟程序来预测程序是否会终止。简单来说,我们无法在不运行程序的情况下预测程序的路径。图灵完备系统可以在“无限循环”中运行,这是一个术语(过度简化)用于描述不终止的程序。创建一个运行永不结束的循环的程序是微不足道的。但是由于起始条件和代码之间的复杂交互,无意中永无止境的循环可以在没有警告的情况下出现。在以太坊中,这提出了一个挑战:每个参与节点(客户端)必须验证每个交易,运行它调用的任何智能合约。但正如图灵所证明的那样,以太坊无法预测智能合约是否将终止,或者它将运行多长时间而不实际运行(可能永远运行)。无论是偶然的,或者有目的的,可以创建智能合约,使其在节点尝试验证它时永远运行,实际上是拒绝服务攻击。当然,在需要一毫秒验证的程序和一个永远运行的程序之间存在无限范围的令人讨厌的资源占用、内存膨胀、CPU过热程序,这些程序只会浪费资源。在世界计算机中,滥用资源的程序会滥用世界资源。如果无法预先预测资源使用情况,以太坊如何限制智能合约使用的资源?
为了应对这一挑战,以太坊引入了一种称为gas的计量机制。当EVM执行智能合约时,它会仔细考虑每条指令(计算,数据访问等)。每条指令都有一个以gas为单位的预定成本。当交易触发智能合约的执行时,它必须包含一定量的gas,用于设置运行智能合约时可以消耗的计算上限。如果计算消耗的gas量超过交易中可用的gas,则EVM将终止执行。gas是以太坊用来允许图灵完备计算同时限制任何程序可以消耗的资源的机制。
2015年,攻击者开发了EVM指令,其成本远远低于应有的成本。这允许攻击者创建使用大量内存的交易并花费几分钟来验证。为了解决这一攻击,以太坊不得不改变其gas核算公式,以便在向后不兼容(硬分叉)变化中获得某些指令。但是,即使进行了这项更改,以太坊客户也必须跳过验证这些交易或浪费数周时间来验证这些交易。
从通用区块链到去中心化应用(DApps)
以太坊开始作为一种制作通用区块链的方法,该区块链可以被编程用于各种用途。但很快,以太坊的愿景扩展到成为去中心化应用程序(DApps)编程的平台。DApps代表了比“智能合约”更广泛的视角。DApp至少是智能合约和Web用户界面。更广泛地说,DApp是一个基于开放、去中心化、p2p基础设施服务构建的Web应用程序。
DApp至少由以下组成:
- 区块链上的智能合约。
- Web前端用户界面。
此外,许多DApps还包括其他去中心化的组件,例如:
- 去中心化(P2P)存储协议和平台。
- 去中心化(P2P)消息传递协议和平台。
Tip | 你可能会看到DApp拼写为ÐApps。Ð字符是拉丁字符,称为“ETH”,暗指以太坊。要显示此字符,请在HTML中使用十进制实体#208,并使用Unicode字符0xCE(UTF-8)或0x00D0(UTF-16)。 |
---|
发展万维网
2004年,“Web 2.0”这个术语变得突出,描述了Web向用户生成内容,响应式界面和交互性的演变。Web 2.0不是技术规范,而是描述Web应用程序新焦点的术语。
DApps的概念旨在使万维网进入下一个自然发展阶段,将对等协议的去中心化引入Web应用程序的各个方面。用于描述这种演变的术语是Web 3,意思是Web的第三个“版本”。Web 3首先由Gavin Wood提出,代表了Web应用程序的新愿景和重点:从集中拥有和托管应用程序到基于去中心化协议的应用程序。
在后面的章节中,我们将探索以太坊web3.js JavaScript库,它将浏览器中运行的JavaScript应用程序与以太坊区块链联系起来。web3.js库还包括一个名为Swarm的P2P存储网络接口和一个名为Whisper的P2P消息服务。通过在Web浏览器中运行的JavaScript库中包含这三个组件,开发人员可以使用完整的应用程序开发套件来构建web3 DApp:
图1. Web3:一套去中心化的应用程序组件,用于Web的下一代发展
以太坊的发展文化
到目前为止,我们已经讨论过以太坊的目标和技术与之前的其他区块链有何不同,比如比特币。以太坊也有着截然不同的发展文化。
在比特币中,开发遵循保守原则:所有变更都经过仔细研究,以确保没有任何现有系统中断。在大多数情况下,只有在向后兼容时才会实施更改。允许现有客户“选择加入”,但如果他们决定不升级,则会继续运营。
相比之下,在以太坊,发展文化的重点是速度和创新。口头禅是“快速行动,破坏事物”。如果需要进行更改,则会实现更改,即使这意味着使先前的假设无效,破坏兼容性或强制客户端更新。以太坊的发展文化的特点是快速创新,快速发展和愿意参与实验。
这对您作为开发人员意味着,您必须保持灵活性并准备好重建您的基础架构,因为一些基本假设会发生变化。不要假设任何东西是静态的或永久的。以太坊开发人员面临的一大挑战是,将代码部署到不可变的分类帐本与仍在快速发展的开发平台之间存在固有的矛盾。你不能简单地“升级”智能合约。您必须准备好部署新的,迁移用户、应用程序和资金,然后重新开始。
具有讽刺意味的是,这也意味着无法实现构建具有更多自主权和更少集中控制的系统的目标。在未来几年内,自主权和去中心化需要在平台上获得比在以太坊中更多的稳定性。为了“发展”平台,您必须准备好废弃并重新启动智能合约,这意味着您必须对它们保持一定程度的控制。
但是,从积极的方面来看,以太坊正在快速前进。“自行车掉链子”的机会很少 - 这种表达意味着争论一些细节,例如如何在建筑物后面建造自行车棚。如果你开始自行车掉链子,你可能会突然发现开发团队的其他人改变了计划,并放弃了自行车,转向自主气垫船。以太坊中的神圣原则,最终标准或固定界面非常少。
最终,以太坊核心协议开发将变慢并且其接口将变得固定。但与此同时,创新是驱动原则。你最好跟上,因为没有人会为你减速。
为什么要学习以太坊?
区块链的学习曲线非常陡峭,因为它们将多个学科组合成一个领域:编程、信息安全、密码学、经济学、分布式系统、p2p网络等。以太坊使这一学习曲线不那么陡峭,所以你可以快点开始吧。但是,在一个看似简单的环境的表面之下,还有更多。当你学习并开始更深入地思考时,总会有另一层复杂性和奇迹。
以太坊是学习区块链的绝佳平台,它正在建立一个庞大的开发者社区,比任何其他区块链平台都要快。除了任何其他区块链,以太坊是为开发人员构建的区块链。熟悉JavaScript应用程序的开发人员可以进入以太坊并开始非常快速地生成工作代码。在以太坊的头几年,通常会看到T恤宣布你可以用五行代码创建一个token。当然,这是一把双刃剑。编写代码很容易,但编写好的代码和安全代码非常困难。
这本书会教你什么?
这本书潜入以太坊并检查每个组成部分。你将从一个简单的交易开始,剖析它的工作原理,建立一个简单的合同,使其更好,并通过以太坊系统跟随它的旅程。
你将了解以太坊的工作原理,以及它为何如此设计。你将能够理解每个部分的工作原理,以及它们如何组合在一起以及原因。