Skip to content

Latest commit

 

History

History
272 lines (132 loc) · 24.7 KB

1_以太坊概述.markdown

File metadata and controls

272 lines (132 loc) · 24.7 KB

什么是以太坊

以太坊通常被描述为"世界计算机"。但这意味着什么?让我们从一个以计算机科学为重点的描述开始,然后尝试通过对以太坊的功能和特征进行更实际的分析来破译它,同时将其与比特币和其他去中心化信息交换平台(或简称"区块链")进行比较。

从计算机科学的角度来讲,以太坊是一个确定性但实际上无限的状态机,由一个全局可访问的单例状态和一个将更改应用与该状态的虚拟机组成。

从更实用的角度来看,以太坊是一个开源的、全球分散的计算基础设施,执行称为智能合约的程序。它使用区块链来同步和存储系统的状态变化,以及一种称为以太币的加密货币来计量和限制执行资源的成本。

以太坊平台使开发人员能够构建具有内置经济功能的强大去中心化应用程序。在提供高可用性、可审计性、透明度和中立性的同时,它还减少或消除了审查只读,并降低了某些交易的风险。

与比特币的区别

许多人会带着一些加密货币的经验来到以太坊,特别是比特币。以太坊与其他开放式区块链共享许多共同元素:连接参与者的点对点网络、用于同步状态更新的拜占庭容错共识算法(工作量证明区块链,目前转化为权益证明机制)、使用加密原语、例如数字签名和哈希,以及数字货币(以太币)。

然而,在许多方面,以太坊的目的和构建与之前的开放区块链(包括比特币)截然不同。

以太坊的主要目的不是称为数字货币支付网络。虽然数字货币以太币是以太坊运行不可或缺的一部分,但以太币旨在作为一种实用货币,用于支付使用以太坊平台作为世界计算机的费用

与脚本语言非常有限的比特币不同,以太坊被设计成一个通用的可编程区块链,运行一个能够执行任意和无限复杂代码的虚拟机。比特币的脚本语言有意限制对支出条件进行简单的真假评估,而以太坊的语言是图灵完备的,这意味着以太坊可以直接充当通用计算机。

区块链的组成

开放的公共区块链的组成部分通常是:

  • 基于标准化"八卦"协议的(p2p)网络连接参与者并传播交易和验证交易块。

这里的八卦的意思是,每个p2p节点非常乐意收到与之在同一个网络使用同一个协议的p2p节点的信息。

  • 消息以事务的形式,代表了状态转换
  • 一组共识规则,管理交易的构成以及有效的状态转换
  • 根据共识规则处理交易的状态机
  • 一个加密安全的区块充当所有已验证和接收的状态转换的日志
  • 一种通过强制参与者合作执行共识规则来分散对区块链控制的共识算法
  • 一种博弈论合理的激励方案(例如,工作量证明成本加上区块奖励),以在开放环境中经济地保护状态机。
  • 上述的一个或多个开源软件实现("客户端")
  • 所有或大部分这些组件通常组合在一个软件客户端中。例如,在比特币中,参考实现由 Bitcoin Core 开源项目开发并作为 bitcoind 客户端实现。在以太坊中,没有参考实现,而是参考规范,黄皮书中对系统的数学描述(参见进一步阅读)。有许多客户端,它们是根据参考规范构建的。
  • 过去,我们使用术语“区块链”来表示刚刚列出的所有组件,作为包含所描述的所有特征的技术组合的简写参考。然而,今天有各种各样具有不同属性的区块链。我们需要限定符来帮助我们理解所讨论的区块链的特征,例如开放、公共、全球、去中心化、中立和抗审查,以确定这些组件允许的“区块链”系统的重要涌现特征。
  • 并非所有的区块链都是平等的。当有人告诉你某物是区块链时,你还没有得到答案;相反,当他们使用“区块链”这个词时,你需要开始问很多问题来澄清他们的意思。首先要求对前面列表中的组件进行描述,然后询问这个“区块链”是否表现出开放、公共等特征。

以太坊的诞生

所有伟大的创新都解决了实际问题,以太坊也不例外。以太坊实在人们认识到比特币模型的力量并试图超越加密货币应用程序的时候构想出来的。但开发人员面临一个难题:他们要么需要在比特币之上构建;要么需要启动一个新的区块链。建立在比特币之上意味着需要在比特币的规范之上去找到解决方案。有限的交易类型、数据类型和数据存储大小似乎限制了可以直接在比特币上运行的应用程序的种类;任何其他东西都需要额外的链下层,这立即否定了使用公共区块链的许多优势。对于在链上需要更多自由和灵活性的项目,新的区块链是唯一的选择。但这意味着大量的工作:引导所有基础架构元素、详尽的测试等。

2013 年底,年轻的程序员和比特币爱好者 Vitalik Buterin 开始考虑进一步扩展比特币和 Mastercoin(一种扩展比特币以提供基本智能合约的覆盖协议)的功能。同年 10 月,Vitalik 向 Mastercoin 团队提出了一种更通用的方法,该方法允许灵活且可编写脚本(但不是图灵完备)的合约取代 Mastercoin 的专用合约语言。虽然 Mastercoin 团队印象深刻,但这个提议过于激进,不适合他们的发展路线图。

2013 年 12 月,Vitalik 开始分享一份白皮书,概述了以太坊背后的理念:一个图灵完备的通用区块链。几十个人看到了这份早期草案并提供了反馈,帮助 Vitalik 完善了提案。

本书的两位作者都收到了白皮书的早期草稿并对其进行了评论。 Andreas M. Antonopoulos 对这个想法很感兴趣,并向 Vitalik 问了很多关于使用单独的区块链来强制执行智能合约执行的共识规则以及图灵完备语言的含义的问题。 Andreas 继续以极大的兴趣关注以太坊的进展,但他的著作《精通比特币》处于写作的早期阶段,直到很久以后才直接参与以太坊。然而,Gavin Wood 博士是第一批联系 Vitalik 并愿意帮助他提高 C++ 编程技能的人之一。成为以太坊的联合创始人、代码设计者和首席技术官。

正如 Vitalik 在他的“以太坊史前史”帖子中所述:

那时候以太坊协议完全是我自己创造的。然而,从这里开始,新的参与者开始加入。到目前为止,协议方面最突出的是 Gavin Wood……Gavin 也主要归功于愿景的微妙变化,从将以太坊视为构建可编程货币的平台,基于区块链的合约可以持有数字资产并根据预设规则转移它们,到通用计算平台.这始于重点和术语的细微变化,后来随着对“Web 3”整体的日益重视,这种影响变得更加强烈,它将以太坊视为一套去中心化技术的一部分,另外两个是 Whisper 和 Swarm。

从 2013 年 12 月开始,Vitalik 和 Gavin 完善并发展了这个想法,共同构建了成为以太坊的协议层。

以太坊的创始人正在考虑没有特定用途的区块链,它可以通过编程支持广泛的应用程序。这个想法是,通过使用像以太坊这样的通用区块链,开发人员可以编写他们的特定应用程序,而无需实现对等网络、区块链、共识算法等的底层机制。以太坊平台旨在抽象这些细节并为去中心化的区块链应用程序提供确定性和安全的编程环境。

就像中本聪一样,Vitalik 和 Gavin 不只是发明了一项新技术;他们以新颖的方式将新发明与现有技术相结合,并交付原型代码以向世界证明他们的想法。

创始人工作多年,构建和完善愿景。 2015 年 7 月 30 日,第一个以太坊区块被开采出来。世界计算机开始为世界服务。

关于vitalik buterin的文章"以太坊史前史"于2017年9月发表,以第一人称的视角介绍了以太坊的早期历史,详细可查看https://vitalik.ca/general/2017/09/14/prehistory.html

以太坊四个阶段的发展

以太坊的发展计划分为四个不同的阶段,每个阶段都会发生重大变化。一个阶段可能包括子版本,称为"硬分叉",以不向后兼容的方式更改功能。

四个主要的开发阶段代号为边境、家园、大都会、宁静。迄今为止发生的中间硬分叉代号为冰河时代、dao、tangerine whistle、spurious dragon、byzantium、constantinople/st.petersburg、pertersburg、istanbul、muirblacier。开发阶段和中间的应分擦汗都显示在以下时间表中,按区块编号作为"日期":

  • 区块:0

frontier(边境)--以太坊的初始阶段。从2015年7月30日持续到2016年3月。

  • 区块: 200000

ice age(冰河时代)--一个引入指数级难度增加的硬分叉,以准备好激发向pos的过渡。

  • 区块: 1150000

homestead(家园)--以太坊的第二阶段,于2016年3月推出。

  • 区块: 1192000

dao--一个硬分叉,补偿了被黑客攻击的dao合约的受害者,并导致以太坊和以太坊经典分裂成两个相互竞争的系统。

  • 区块: 2463000

tangerine whistle--一个硬分叉,用于更改某些IO密集型操作的gas计算,并清除利用这些操作的低gas成本的拒绝服务攻击的累积状态。

  • 区块: 2675000

spurious dragon--解决更多dos攻击向量的硬分叉和另一个状态清除。此外,重放攻击保护机制。

  • 区块: 4370000

metropolis byzantium--metropolis是以太坊的第三个阶段。byzantium于2017年10月退出,是metropolis的第一个部分,增加了底层功能并调整了出块奖励和难度。

  • 区块: 7280000

constantinople/st.petersburg 君士坦丁堡计划称为metropolis(大都会)的第二个部分,并进行类似的改进。在激活前几个小时,发现了一个严重的错误。硬分叉因此被推迟并更改为st.petersburg(圣彼得堡)

  • 区块: 9069000

istanbul(伊斯坦布尔)--一个额外的硬分叉,与前两个硬分叉具有相同的方法和命名约定。

  • 区块: 9200000

muri glacier--一个硬分叉,其唯一目的是由于冰河时代引入的指数增长再次调整难度。

berlin和london两个硬分叉也已经宣布,我们正在处于以太坊开发的最后阶段,代号为宁静,宁静涉及基础设施的深刻重组,这将使以太坊更具可扩展性、更安全和更可持续。它被称为以太坊的第二个版本,“Ethereum 2.0”

以太坊: 一条通用的区块链

原始区块链,即比特币的区块链,跟踪比特币单位的状态及其所有权。您可以将比特币视为分布式共识状态机,其中交易会导致全局状态转换,从而改变btc的所有权。状态转换受到共识规则的约束,允许所有参与者在挖掘多个区块后收敛于系统的共同共识状态。

以太坊也是一个分布式状态机。但是以太坊不是只跟踪发货币所有权的状态,而是跟踪通用数据存储的状态转换,即可以保存任何可表示为key-value元组的数据的存储。key-value存储包含任意值,每个值都由某个键引用;例如,key:"book title"->value: "mastering ethereum"。在某些方面,这与大多数通用计算机使用的随机存取存储器(RAM)的数据存储目的具有相同的目的。以太坊拥有存储代码和数据的内存,它使用以太坊区块链来跟踪内存随时间的变化情况。与通用存储程序计算机一样,以太坊可以将代码加载到其状态机中并运行该代码,将由此产生的状态变化存储在其区块链中。与大多数通用计算机的两个关键区别是,以太坊状态更改受共识规则约束,并且状态分布在全球范围内。以太坊回答了这个问题:"如果我们可以跟踪任何任意状态并对状态机进行编程以创建一个在共识下的全球计算机该怎么办?"

以太坊的组件

在以太坊中,区块链组件中描述区块链系统的组件更具体地来说有以下几个:

  • P2P network(p2p网络)

以太坊在以太坊主网络上运行,可在TCP端口30303上寻址,并运行一个名为ÐΞVp2p 的协议。

  • consensus rules(共识规则)

以太坊的公式规则在参考规范黄皮书中定义(参见进一步阅读)

  • transactions(交易)

以太坊交易是网络消息,包括(除其他外)发送者、接收者、价值和数据有效负载。

  • state machine(状态机)

以太坊状态转换由以太坊虚拟机(EVM)处理,EVM是一种基于堆栈地虚拟机,可执行字节码(机器语言指令).EVM程序,称为智能合约,用高级语言(solidity)编写,并编译为字节码,以便在EVM上执行

  • data structure(数据结构)

以太坊的状态作为数据库(通常是Google地levelDB存储在每个节点上,该数据库将交易和系统状态以被称为Merkel patricia tree地序列化散列数据结构存储。

  • consensus algorithm(共识算法)

以太坊使用比特币地共识模型(中本聪共识)。该模型使用顺序的单签名区块,通过pow的重要性加权来确定最长的链,从而确定当前状态。但是,有计划在不久的将来转向代号为casper的pos加权投票系统。

  • economic security

以太坊目前使用一种名为Ethash的pow算法,但最终将在未来某个时候随着pos的迁移而放弃。

  • clients

以太坊有几个可互操作的客户端软件实现,其中最突出的是Go-Ethereum(Geth)和parity

进一步阅读参考

以太坊和图灵完备性

一旦开始阅读有关以太坊的内容,你就会立即遇到"图灵完备"一词。他们说,与比特币不同,以太坊是图灵完备的。这到底是什么意思呢?

该术语指的是英国数学家图灵,他被公认为是计算机科学之父。1936年,他创建了一个由状态机组成的计算机数学模型,该状态机通过在顺序存储器(类似于无限长的纸带)上读取和写入符号来操纵符号。有了这个构造,图灵继续提供数学基础来回答关于普遍可计算性的问题,这意味着是否所有问题都可以解决。他证明了有些问题是不可计算地。具体来说,他证明了停机问题(给定一个任意程序及其输入,是否有可能确定该程序最终是否会停止运行)是不可解决的。

图灵进一步定义了一个系统如果可以用来模拟任何图灵机,那么它就是图灵完备的。这样的系统统称为通用图灵机(UTM)。

以太坊在称为以太坊虚拟机的状态机中执行存储程序的能力,同时在内存中读取和写入数据使其成为图灵完备的系统,因此成为UTM。考虑到有限内存的限制,以太坊可以计算任何图灵机可以计算的算法。

以太坊的突破性创新是将存储程序计算机的通用计算架构与去中心化的区块链相结合,从而创建分布式单态(singleton)世界计算机。以太坊程序“无处不在”,但会产生一个受共识规则保护的共同状态。

图灵完备性作为一个"特征"

听说以太坊是图灵完备的,您可能会得出这样的结论:这是一个图灵不完备的系统所缺少的功能。相反,它恰恰相反。图灵完备性很容易实现;事实上,已知的最简单的图灵完备状态机有 4 个状态并使用 6 个符号,状态定义只有 22 条指令长。事实上,有时系统被发现是“意外的图灵完备”。

可以在http://bit.ly/2Og1VgX找到此类系统的有趣参考

然而,图灵完备性是非常危险的,特别是在像公共区块链这样的开放访问系统中,因为我们之前提到的停机问题。例如,现代打印机是图灵完备的,可以提供要打印的文件,使它们进入冻结状态。以太坊是图灵完备的事实意味着任何复杂的程序都可以由以太坊计算。但这种灵活性带来了一些棘手的安全和资源管理问题。可以关闭并重新打开无响应的打印机。这对于公共区块链是不可能的。

图灵完备性的含义

图灵证明,您无法通过在计算机上模拟来预测程序是否会终止。简单来说,我们无法在不运行程序的情况下预测程序的路径。图灵完备系统可以在“无限循环”中运行,这个术语用于(过于简单化)描述不会终止的程序。创建一个运行永不结束的循环的程序是微不足道的。但由于起始条件和代码之间的复杂交互,可能会在没有警告的情况下出现意想不到的永无止境的循环。在以太坊中,这带来了挑战:每个参与节点(客户端)必须验证每笔交易,运行它调用的任何智能合约。但正如图灵所证明的那样,如果没有实际运行(可能永远运行),以太坊无法预测智能合约是否会终止,或者它会运行多长时间。无论是无意还是有意,都可以创建一个智能合约,使其在节点尝试验证它时永远运行。这实际上是 DoS 攻击。当然,在一个需要一毫秒来验证的程序和一个永远运行的程序之间是无限范围的讨厌的、占用资源的、内存膨胀的、CPU 过热的程序,它们只会浪费资源。在世界计算机中,滥用资源的程序会滥用世界资源。如果以太坊无法提前预测资源使用情况,它如何限制智能合约使用的资源?

为了应对这一挑战,以太坊引入了一种称为gas的计量机制。当 EVM 执行智能合约时,它会仔细考虑每条指令(计算、数据访问等)。每条指令都有一个预先确定的成本,以 gas 为单位。当交易触发智能合约的执行时,它必须包含一定数量的气体,以设置运行智能合约可以消耗的上限。如果计算消耗的气体量超过交易中可用的气体量,则 EVM 将终止执行。 Gas 是以太坊用来允许的机制

从通用区块链到去中心化的应用程序(DApps)

以太坊最初是一种制作通用区块链的方式,可以针对各种用途进行编程。但很快,以太坊的愿景扩展为一个DApps编程平台。**DApps代表了比智能合约更广阔的视角。DAPP至少是一个智能合约和一个网络用户界面。**更广泛地说,DApps是一种构建在开放、去中心化、点对点基础设施服务之上的网络应用程序。

一个DApps至少由以下部分组成:

  • 区块链上的智能合约
  • web前端用户界面

此外,许多 DApps 还包括其他去中心化组件,例如:

  • 去中心化 (P2P) 存储协议和平台
  • 去中心化 (P2P) 消息传递协议和平台

提示:你可能会看到DApps拼写为ÐApps。Ð 字符是称为“ETH”的拉丁字符,暗指以太坊。要显示此字符,请使用 Unicode 代码点 0xD0,或在必要时使用 HTML 字符实体 eth(或十进制实体 #208)。

互联网的第三个时代

2004 年,“Web 2.0”一词开始流行,它描述了网络向用户生成内容、响应式界面和交互性的演变。 Web 2.0 不是技术规范,而是描述 Web 应用程序新焦点的术语。

DApps 的概念旨在将万维网带入下一个自然进化阶段,将点对点协议的去中心化引入网络应用程序的各个方面。用于描述这种演变的术语是 web3,意思是网络的第三个“版本”。最初由 Gavin Wood 博士提出,web3 代表了 Web 应用程序的新愿景和焦点:从集中拥有和管理的应用程序,到构建在去中心化协议上的应用程序。

在后面的章节中,我们将探索以太坊 web3.js JavaScript 库,它将浏览器中运行的 JavaScript 应用程序与以太坊区块链连接起来。 web3.js 库还包括一个名为 Swarm 的 P2P 存储网络接口和一个名为 Whisper 的 P2P 消息服务。通过在 Web 浏览器中运行的 JavaScript 库中包含这三个组件,开发人员拥有一个完整的应用程序开发套件,允许他们构建 web3 DApps。

以太坊发展文化

到目前为止,我们已经讨论了以太坊的目标和技术与之前的其他区块链(如比特币)有何不同。以太坊也有非常不同的开发文化。

在比特币中,开发遵循保守原则:所有更改都经过仔细研究,以确保现有系统不会受到干扰。在大多数情况下,只有在向后兼容的情况下才会实施更改。现有客户可以选择加入,但如果他们决定不升级,将继续运营。

相比之下,在以太坊中,社区的发展文化着眼于未来而不是过去。 (并非完全严肃的)口头禅是“快速行动并打破常规”。如果需要更改,就会实施,即使这意味着使先前的假设无效、破坏兼容性或强制客户端更新。以太坊的发展文化的特点是快速创新、快速进化和部署前瞻性改进的意愿,即使这是以牺牲一些向后兼容性为代价的。

这对作为开发人员的您意味着,您必须保持灵活性,并准备好在某些基本假设发生变化时重建您的基础架构。以太坊开发人员面临的一大挑战是将代码部署到不可变系统与仍在发展的开发平台之间的内在矛盾。您不能简单地“升级”您的智能合约。您必须准备好部署新的、迁移用户、应用程序和资金,然后重新开始。

具有讽刺意味的是,这也意味着构建具有更多自主权和更少集中控制的系统的目标仍未完全实现。自治和去中心化要求平台比未来几年你在以太坊中可能获得的稳定性更高。为了“发展”平台,您必须准备好废弃并重新启动您的智能合约,这意味着您必须对它们保持一定程度的控制。

但是,从积极的方面来看,以太坊发展得非常快。 “bike-shedding”的机会很少,这个表达方式意味着通过争论一些小细节来阻碍发展,例如如何在核电站后面建造自行车棚。如果你开始放弃自行车,你可能会突然发现,当你分心时,开发团队的其他成员改变了计划,放弃了自行车,转而使用自主气垫船。

最终,以太坊平台的发展会放缓,其接口也会变得固定。但与此同时,创新是驱动原则。你最好跟上,因为没有人会为你放慢速度。

为什么要学习以太坊

区块链的学习曲线非常陡峭,因为它们将多个学科结合到一个领域:编程、信息安全、密码学、经济学、分布式系统、点对点网络等。以太坊使这条学习曲线变得不那么陡峭,所以你可以快速上手。但就在一个看似简单的环境的表面之下,隐藏着更多。当您学习并开始深入了解时,总会有另一层复杂性和奇迹。

以太坊是学习区块链的绝佳平台,它正在建立一个庞大的开发者社区,速度比任何其他区块链平台都要快。与其他任何区块链相比,以太坊是开发者的区块链,由开发者为开发者构建。熟悉 JavaScript 应用程序的开发人员可以进入以太坊并很快开始生成工作代码。在以太坊诞生的最初几年,经常可以看到T-shirts 宣称您可以仅用五行代码创建一个代币。当然,这是一把双刃剑。编写代码很容易,但很难编写出良好且安全的代码。

这本书能给你带来什么

本书深入研究了以太坊并检查了每个组件。您将从一个简单的交易开始,剖析它的工作原理,构建一个简单的合约,让它变得更好,并跟随它在以太坊系统中的旅程。

您不仅会学习如何使用以太坊——它是如何工作的——还会学习为什么它是这样设计的。您将能够理解每个部分的工作原理,以及它们如何组合在一起以及为什么组合在一起。