什么是以太坊
以太网是“世界的计算机”,这是以太坊平台的一种常见描述。这是什么意思呢?让我们首先从关注计算机科学的描述开始,然后对以太坊的功能和特性进行更实际的解读,并将其与比特币和其他分布式账本技术(简单起见,我们将经常使用“区块链”指代)进行对比。
从计算机科学的角度来说,以太坊是一种确定性但实际上无界的状态机,它有两个基本功能,第一个是全局可访问的单例状态,第二个是对状态进行更改的虚拟机。
从更实际的角度来说,以太坊是一个开源的,全球的去中心化计算架构,执行成为 智能合约 的程序。它使用区块链来从同步和存储系统 状态,以及称为 ether 的加密货币来计量和约束执行资源成本。
以太坊平台使开发人员能够利用内置的经济学方法构建强大的去中心化应用程序。在保证持续正常运行时间的同时,还可以减少或消除审查机构,第三方接口和对手方风险。
与比特币的比较
很多之前有一些加密货币的经验人会加入以太坊,特别是比特币。以太坊与其他开放区块链共享许多通用元素:连接参与者的对等网络,用于状态同步(工作证明)的共识算法,数字货币(以太)和全局账本(区块链)。
区块链的组件
开源、公开的区块链通常包括以下组件:
-
一个连接参与者,并传播交易和包含已验证交易的区块的点对点网络,基于标准的“gossip“协议。
-
状态机中实现的一系列共识规则。
-
消息,以交易的形式表示,代表状态转移。
-
根据共识规则处理交易的状态机。
-
分布式数据库,区块链,记录所有状态转移的日志。
-
共识算法(例如,Proof-of-Work),通过强制参与者竞争并使用共识规则约束他们,来分散区块链的控制权。
-
上述内容的一个或多个开源软件实现。
所有或大部分这些组件通常组合在一个软件客户端中。例如,在比特币中,参考实现由 Bitcoin Core 开源项目开发,并作为 bitcoind 客户端实现。在以太坊中,没有参考实现,而是 参考规范,是在 [yellowpaper] 中对系统的数学描述。有许多客户端根据参考规范建造。
过去,我们使用术语“区块链”来表示上述所有组件,作为包含上述所有特性的技术组合的简称。然而,今天,区块链这个词已经被营销商和奸商所淡化,他们期待炒作他们的项目并为其创业公司实现不切实际的估值。它自己实际上是毫无意义的。我们需要限定词来帮助我们理解这些区块链的特征,例如 _开源,公开,全球,分散,中立和抗审查_等,以确定这些组件给予“区块链”系统的重要涌现特征。
并不是所有的区块链都是相同的。当你被告知某样东西是区块链时,你还没有得到答案,你需要问很多问题来澄清“区块链”是什么意思。首先询问上面组件的描述,然后询问这个“区块链”是否显示了 开源、公开 等特性。
以太坊的开发
以太坊的目标和构建在很多方面都和之前的开源区块链有所不同,包括比特币。
以太坊的目的主要不是数字货币支付网络。但数字货币_ether_对于以太坊的运作来说既是不可或缺的也是必要的,以太也被视为一种_实用货币_来支付以太坊平台的使用。
与具有非常有限的脚本语言的比特币不同,以太坊被设计成一个通用可编程区块链,运行一个_虚拟机_,能够执行任意和无限复杂的代码。比特币的脚本语言故意被限制为简单的真/假消费条件判断,以太坊的语言是_图灵完备的_,这意味着它相当于一台通用计算机,可以运行理论图灵机可以运行的任何计算。
以太坊的诞生
所有伟大的创新都解决了真正的问题,以太坊也不例外。当人们认识到比特币模型的力量,并试图超越加密货币应用,转向其他项目时,人们构思出了以太坊。但开发人员面临着一个难题:要么在比特币之上构建,要么启动一个新的区块链。以比特币为基础意味着处于网络的有意约束之中,并试图找到解决方法。数据存储的有限类型和大小似乎限制了可以在其上作为第二层解决方案运行的应用程序的类型。程序员需要构建仅使用有限的变量,交易类型和数据集的系统。对于需要更多自由度和更大灵活性的项目,启动新的区块链是唯一的选择。但开始一个新的区块链意味着要构建所有的基础设施元素,测试等。
2013年底,年轻程序员和比特币爱好者Vitalik Buterin开始考虑进一步扩展比特币和Mastercoin(一种扩展比特币,提供基本智能合约的叠加协议)的功能。 2013年10月,Vitalik向Mastercoin团队提出了一个更通用的方法,该方案允许用灵活且可编写脚本(但不是图灵完备的)的合约取代Mastercoin的专业合约语言。虽然Mastercoin团队印象深刻,但这一提议太过激进,无法适应他们的发展路线图。
2013年12月,Vitalik开始分享一份白皮书,描述了以太坊背后的想法:一个图灵完备的可编程和通用区块链。几十个人看到了这个早期的草案,并向Vitalik提供了反馈,帮助他逐渐提出提案。
本书的两位作者都收到了白皮书的初稿,并对其进行了评论。Andreas M. Antonopoulos 对这个想法很感兴趣,并向Vitalik询问了很多关于使用单独的区块链实施智能合约执行的共识规则以及图灵完备语言的影响等问题。Andreas非常关注以太坊的进展,但他正在写作“Mastering Bitcoin”一书的早期阶段,直到很久以后才直接参与以太坊。然而,Gavin Wood博士是第一批接触Vitalik并提供帮助提供C ++编程技能的人员之一。Gavin成为了以太坊的联合创始人,联合设计师和CTO。
正如Vitalik在他的 "Ethereum Prehistory" 中所述:
当时的以太坊协议完全是我自己的创作。然而,从这里开始,新的参与者开始加入。迄今为止协议方面最突出的是Gavin Wood。
…
将以太坊视为构建可编程金钱的平台而带来的微妙变化也可以归功于Gavin,基于区块链的合约可以保存数字资产并根据预设规则将其转移到通用计算平台。这起始于着重点和术语的细微变化,随着对“Web 3”体系的日益重视,这种影响变得更加强烈,这种体系将Ethereum看作是一套去中心化技术的组成部分,另外两个是Whisper和Swarm。
从2013年12月开始,Vitalik和Gavin完善并发展了这个想法,共同构建了形成以太坊的协议层。
以太坊的创始人们正在考虑一个并非针对特定目的的区块链,而是通过成为_可编程的_来支持各种各样的应用。这个想法是,通过使用像以太坊这样的通用区块链,开发人员可以编写他们的特定应用程序,而不必开发对等网络,区块链,共识算法等底层机制。以太坊平台旨在抽象这些详细信息并为去中心化区块链应用程序提供确定性和安全的编程环境。
就像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" - 引入指数级难度增长的一个难题,激励了到权益证明的过渡。
- Block #1,150,000
-
"Homestead" - 以太坊的第二阶段,2016年3月启动。
- Block #1,192,000
-
"DAO" - 恢复被破坏的DAO合约的硬分叉,导致以太坊和以太坊经典分成两个竞争系统。
- Block #2,463,000
-
"Tangerine Whistle" - 改变某些IO密集操作的燃气计算方法和清除拒绝服务攻击(利用这些操作的低燃气成本)累积状态的硬分叉。
- Block #2,675,000
-
"Spurious Dragon" - 解决更多拒绝服务攻击向量和另一种状态清除的硬分叉,还包括转播攻击保护机制。
当前状态
我们目前位于_Metropolis_阶段,该阶段计划为两个次级版本的硬分叉 (参见 [hard_fork]) ,代号 Byzantium 我 Constantinople。拜占庭于2017年10月生效,君士坦丁堡预计将在2018年中期。
- Block #4,370,000
-
“大都会拜占庭” - 大都会是以太坊的第三阶段,正是撰写本书的时间,于2017年10月启动。拜占庭是Metropolis的两个硬分叉中的第一个。
未来的计划
在大都会拜占庭硬分叉之后,大都会还有一个硬分叉计划。大都会之后是以太坊部署的最后阶段,代号为Serenity。
- Constantinople
-
- 大都会阶段的第二部分,计划在2018年中期。预计将包括切换到混合的工作证明/权益证明共识算法,以及其他变更。
- Serenity
-
以太坊的第四个也是最后一个阶段。宁静尚未有计划的发布日期。
以太坊:通用的区块链
原始区块链(比特币的区块链)追踪比特币单位的状态及其所有权。你可以将比特币视为分布式共识 状态机,其中交易引起全局的_状态转移 _,从而更改比特币的所有权。状态转移受共识规则的制约,允许所有参与者(最终)在开采数个区块后在系统的共同(共识)状态上汇合。
以太坊也是一个分布式状态机。但是,不仅仅追踪货币所有权的状态,以太坊追踪通用数据存储的状态转换。通常我们指的是任何可以表示为 键值对 key-value tuple_的数据。键值数据存储简单地存储任何通过某个键引用的值。例如,存储由“Book Title”键引用的值“Mastering Ethereum”。在某些方面,这与通用计算机使用的 _Random访问存储器(RAM) 的数据存储模型具有相同的用途。以太坊有 memory 存储代码和数据,它使用以太坊区块链来跟踪这些内存随着时间的变化。就像通用的存储程序的计算机一样,以太坊可以将代码加载到其状态机中并运行该代码,将结果状态更改存储在其区块链中。与通用计算机的两个重要差异在于,以太坊状态的变化受共识规则的支配,并且状态通过共享账本全球分布。以太坊回答了这样一个问题:“跟踪任何状态并对状态机进行编程,以创建一个在共识之下运行的全球计算机会怎样?”。
以太坊的组件
在Ethereum中,区块链的组件 中描述的区块链系统组件包括:
- P2P Network
-
以太坊在 以太坊主网 上运行,可以通过TCP端口30303访问,运行称作 ÐΞVp2p 的协议。
- Consensus rules
-
以太坊的共识规则,在参考规范,即 [yellowpaper] 中定义。
- Transactions
-
Ethereum交易(参见[transactions])是网络消息,包括发送者,接收者,值和数据负载等。
- State Machine
-
以太坊的状态转移由 Ethereum虚拟机(EVM) 处理,这是一个执行 bytecode(机器语言指令)的基于栈的虚拟机。称为“智能合约”的EVM程序以高级语言(如Solidity)编写,并编译为字节码以便在EVM上执行。
- Blockchain
-
以太坊的区块链作为 database(通常是Google的LevelDB)存储在每个节点上,该区块链在称作 梅克尔帕特里夏树 Merkle Patricia Tree 的序列化哈希数据结构中包含交易和系统状态,。
- Consensus Algorithm
-
以太坊目前使用名为_Ethash_的工作量证明算法,但有计划在不久的将来将过渡到称为_Casper_的权益证明(Proof-of-Stake)系统。
- Clients
-
以太坊有几个可互操作的客户端软件实现,其中最突出的是 Go-Ethereum(Geth)_和_Parity。
其他参考文献
以太坊黄皮书: https://ethereum.github.io/yellowpaper/paper.pdf
褐皮书”:为更广泛的读者以不太正式的语言重写了“黄皮书”: https://github.com/chronaeon/beigepaper
ÐΞVp2p 网络协议: https://github.com/ethereum/wiki/wiki/%C3%90%CE%9EVp2p-Wire-Protocol
以太坊状态机 —— 一个“Awesome”资源列表 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 权益证明 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继续提供了一个来回答(否定的)关于 通用可计算性(是否可以解决所有问题)问题的数学基础。他证明了存在一些不可计算的问题。具体来说,他证明 停机问题 Halting Problem(试图评估程序是否最终会停止运行)是不可解决的。
Alan Turing进一步将系统定义为_Turing Complete_,如果它可以用来模拟任何图灵机。这样的系统被称为 通用图灵机 Universal Turing Machine(UTM)。
以太坊在一个名为以太坊虚拟机的状态机中执行存储程序,在内存中读写数据的能力,使其成为一个图灵完整系统,因此是一台通用图灵机。对于有限的存储,以太坊可以计算任何图灵机可以计算的算法。
以太坊的突破性创新是将存储程序计算机的通用计算架构与去中心化区块链相结合,从而创建分布式单状态(单例)世界计算机。以太坊程序“到处”运行,但却产生了共识规则所保证的共同(共识)状态。
图灵完备是一个“特性”
听说以太坊是图灵完备的,你可能会得出这样的结论:这是一个图灵不完备系统中缺乏的功能。相反,情况恰恰相反。需要努力来限制一个系统,使它不是 Turing Complete 的。即使是最简单的状态机也会出现图灵完备性。事实上,已知最简单的Turing Complete状态机(Rogozhin,1996)具有4个状态并使用6个符号,状态定义只有22个指令长。
图灵完备不仅可以最简单的系统中实现,而且有意设计为受限制的图灵不完备的系统通常被认为是“意外图灵完备的”。图灵不完备的约束系统更难设计,必须仔细维护,以保持图灵不完备。
关于“意外图灵完备的”的有趣的参考资料可以在这里找到: http://beza1e1.tuxen.de/articles/accidentally_turing_complete.html
以太坊是图灵完备的事实意味着任何复杂的程序都可以在以太坊中计算。但是这种灵活性带来了一些棘手的安全和资源管理问题。
图灵完备的含义
图灵证明,你无法通过在计算机上模拟程序来预测程序是否会终止。简而言之,我们无法预测程序的运行路径。图灵完备系统可以在“无限循环”中运行,这是一个用于描述不终止程序的术语(过分简化地说)。创建一个运行永不结束的循环的程序是微不足道的。但由于起始条件和代码之间存在复杂的相互作用,无意识的无限循环可能会在没有警告的情况下产生。在以太坊中,这提出了一个挑战:每个参与节点(客户端)必须验证每个交易,运行它所调用的任何智能合约。但正如图灵证明的那样,以太坊在没有实际运行(可能永远运行)时,无法预测智能合约是否会终止,或者运行多久。可以意外,或有意地,创建智能合约,使其在节点尝试验证它时永久运行,实际上是拒绝服务攻击。当然,在需要毫秒验证的程序和永远运行的程序之间,存在无限范围的令人讨厌的资源浪费,内存膨胀,CPU过热程序,这些程序只会浪费资源。在世界计算机中,滥用资源的程序会滥用世界资源。如果以太坊无法预测资源使用情况,以太坊如何限制智能合约使用的资源?
为了应对这一挑战,以太坊引入了称为 燃气 _gas_的计量机制。随着EVM执行智能合约,它会仔细考虑每条指令(计算,数据访问等)。每条指令都有一个以燃气为单位的预定成本。当交易触发智能合约的执行时,它必须包含一定量的燃气,用以设定运行智能合约可消耗的计算上限。如果计算所消耗的燃气量超过交易中可用的天然气量,则EVM将终止执行。Gas是以太坊用于允许图灵完备计算的机制,同时限制任何程序可以使用的资源。
2015年,攻击者利用了一个成本远低于应有成本的EVM指令。这允许攻击者创建使用大量内存的交易,并花几分钟时间进行验证。为了解决这一攻击,以太坊必须在不向前兼容(硬分叉)的更改中改变特定指令的燃气核算公式。但是,即使有这种变化,以太坊客户端也不得不跳过验证这些交易或浪费数周的时间来验证这些交易。
从通用区块链到去中心化应用 (DApps)
以太坊作为一种可用于各种用途的通用区块链的方式开始。但很快,以太坊的愿景扩展为编程 去中心化应用(DApps) 的平台。DApps代表比“智能合约”更广阔的视角。DApp至少是一个智能合约和一个web用户界面。更广泛地说,DApp是一个基于开放的,去中心化的,点对点基础架构服务的Web应用程序。
DApp至少由以下部分组成:
-
区块链上的智能合约
-
一个Web前端用户界面
另外,许多DApp还包括其他去中心化组件,例如:
-
去中心化(P2P)存储协议和平台。
-
去中心化(P2P)消息传递协议和平台。
Tip |
你可能会看到DApps拼写为 ÐApps. Ð 字符是拉丁字符,称为“ETH”,暗指以太坊。"ETH", 要显示此字符,请在HTML中使用十进制实体 #208,并使用Unicode字符 0xCE(UTF-8)或 0x00D0(UTF-16)。 |
万维网的进化
2004年,“Web 2.0”一词引人注目,描述了网络向用户生成内容,响应接口和交互性的演变。Web 2.0不是技术规范,而是描述Web应用程序新焦点的术语。
DApps的概念旨在将万维网引入其下一个自然演进,将去中心化对等协议引入Web应用程序的每个方面。用于描述这种演变的术语是 Web3,意思是网络的第三个“版本”。由Gavin Wood首先提出,_web3_代表了Web应用程序的新愿景和焦点:从集中拥有和管理的应用程序到基于去中心化协议的应用程序。
在后面的章节中,我们将探索Ethereum + web3js + JavaScript库,它将你的浏览器中运行的JavaScript应用程序与以太坊区块链连接起来。web3.js 库还包含一个名为 Swarm 的P2P存储网络接口和一个称为 Whisper 的P2P消息传递服务。通过在你的Web浏览器中运行的JavaScript库中包含这三个组件,开发人员可以使用完整的应用程序开发套件来构建web3 DApps:
Figure 1. Web3: A suite of decentralized application components for the next evolution of the web
以太坊的开发文化
到目前为止,我们已经谈到了以太坊的目标和技术与其他区块链之前的区别,比如比特币。以太坊也有非常不同的开发文化。
在比特币中,开发以保守原则为指导:所有变化都经过仔细研究,以确保现有系统都不会中断。大部分情况下,只有在向后兼容时才会执行更改。允许现有客户“选择加入”,但如果他们决定不升级,将继续运作。
相比之下,在以太坊中,开发文化的重点是速度和创新。这个咒语是“快速行动,解决事情”。如果需要进行更改,即使这意味着使之前的假设失效,破坏兼容性或强制客户端进行更新,也会执行更改。以太坊的开发文化的特点是快速创新,快速进化和愿意参与实验。
这对开发者来说意味着什么,就是你必须保持灵活性,随着一些潜在的假设变化,准备重建你的基础设施。不要以为任何东西都是静态的或永久的。以太坊开发人员面临的一个重大挑战是将代码部署到不可变账本与仍在快速发展的开发平台之间的内在矛盾。你不能简单地“升级”你的智能合约。你必须准备部署新的,迁移用户,应用程序和资金,并重新开始。
具有讽刺意味的是,这也意味着构建具有更多自主权和更少集中控制的系统的目标是无法实现的。在接下来的几年中,自治和分权要求平台中的稳定性要比以太坊可能获得的稳定性要高一点。为了“发展”平台,你必须准备好取消并重启你的智能合约,这意味着你必须保留一定程度的控制权。
但是,在积极的一面,以太坊正在快速发展。“自行车脱落”的机会很小 - 这个表达意味着争论一些小细节,比如如何在大楼后面建造自行车棚。如果你开始骑脚踏车,你可能会突然发现其他的开发团队改变了计划,并且抛弃了自行车,转而使用自动气垫船。在以太坊有很少的神圣原则,最终标准或固定接口。
最终,以太坊核心协议的开发速度将会放慢,其接口将会变得固定。但与此同时,创新是推动原则。你最好跟上,因为没有人会为你放慢速度。
为什么学习以太坊?
区块链具有非常陡峭的学习曲线,因为它们将多个学科合并到一个领域:编程,信息安全,密码学,经济学,分布式系统,对等网络等。以太坊使得这一学习曲线不再陡峭,因此你可以很快就开始了。但就在一个看似简单的环境表面之下,还有更多。当你学习并开始更深入的观察时,总会有另一层复杂性和奇迹。
以太坊是学习区块链的绝佳平台,它构建了一个庞大的开发者社区,比任何其他区块链平台都快。相比其他区块链,以太坊是开发者为开发者开发的_开发者的区块链_。熟悉JavaScript应用程序的开发人员可以进入以太坊并开始快速生成工作代码。在以太坊的头几年,通常看到T恤衫宣布你可以用五行代码创建一个代币。当然,这是一把双刃剑。编写代码很容易,但编写_good_代码和_secure_代码非常困难。
本书将教你什么?
这本书深入以太坊的每一个组成部分。你将从一个简单的交易开始,分析它的工作原理,建立一个简单的合约,使其更好,并跟踪它在以太坊系统中的路径。
你将了解以太坊的工作方式,以及为什么这样设计。你将能够理解每个组成部分的工作方式,它们如何组合在一起以及为什么。