第一章 什么是以太坊
Q7nl1s admin

以太坊又被称为“世界计算机”,那么它究竟是什么,可以从两个角度解释:

  • 计算机科学角度:一个具备确定性但实际上没有边际的状态机。它有两个特点:具有一个全球范围可访问的单体状态;还有一个执行状态更改的虚拟机(EVM)。
  • 更加实际的角度:一个开源的、全球去中心化的计算基础架构,可以执行称为智能合约的程序。

以太坊与比特币的比较

共同点:

  • 一个连接参与各方的P2P网络
  • 一个用于同步状态的拜占庭容错共识算法(工作量证明POW)
  • 使用数字签名和哈希等密码学原理
  • 一种数字货币(在以太坊中为以太币)

不同点:

  • 以太币主要用于支付使用以太坊所产生的花费,比特币主要目的是称为数字货币的支付网络。
  • 比特币的脚本语言只能进行对简单支付条件的真/假判断,而以太坊的语言是图灵完备的,能够直接用做通用目的地计算机。

区块链的组件

一个公开的公共区块链通常包含以下组件:

  • 一个连接各方的点对点网络
  • 一个共识规则
  • 一个状态机
  • 一个共识算法
  • 在博弈论上合理的激励方案(例如:工作量证明、区块奖励)
  • 一个或多个开源软件实现(“客户端”)
  • 以交易形式体现的消息——代表状态的转换。

以上的组件一般都包含在一个单独的客户端软件中,因为在去中心化区块链的软件实现中,没有所谓“服务器端”的概念。

以太坊的诞生

以太坊的诞生是基于区块链开发者们想在比特币基础上构建新区块但遇到了规则限制和复杂的处理。2013年末Vitalik Buterin分享了一份白皮书,包含了以太坊背后的思想:一个图灵完备的通用目的的区块链。至此以太坊开始发展起来。

Gavin Wood在以太坊早期发展的协议层的贡献是最显著的,他相信以太坊将是一个通用目的的计算平台。随着“Web 3”概念的深入人心,这一观点显得更具有影响力。Web 3把以太坊视为去中心化技术的一部分,去中心化技术的另外两个重要组成部分分别是Whisper和Swarm。

2015年7月30日,第一个以太坊区块被挖矿成功。“世界计算机”开始为全世界提供服务。

以太坊的四个开发阶段

以太坊每个阶段都以“硬分叉”的方式发布,硬分叉意味着这次发布所做出的改变将无法向后兼容之前的旧版本。

四个主要发展阶段的代号为FrontierHomesteadMetropolisSerenity

到目前为止(或计划)发生过的过渡性硬分叉代号为Ice AgeDAOTangerine WhistleSpurious DragonByzantiumConstantinople

下面以区块高度编号的形式为时间轴对所有的硬分叉进行排序:

区块高度 硬分叉代号 详情
0 Frontier 以太坊的初始阶段,持续时间为2015年7月30日至2016年3月。
200000 Ice Age 引入指数难度增加的硬分叉,以便在准备就绪时激励过渡到权益证明(PoS)。
1150000 Homestead 以太坊的第二阶段,于2016年3月发布。
1192000 DAO 一次硬分叉,用于补偿被攻击的DAO合约的受害者,并导致“以太坊”和“以太坊经典”分成两个互相竞争的系统。
2463000 Tangerine Whistle 一次硬分叉,用于改变某些I/O密集型操作的gas计算,并消除能够利用这些操作的低gas成本的拒绝服务(DoS)攻击。
2675000 Spurious Dragon 一个用于解决更多DoS攻击途径的硬分叉,以及另一次状态清除。同时也提供了针对重放攻击的保护机制。
4370000 Metropolis Byzantium 这是以太坊的第三个阶段,于2017年10月推出。Byzantium是Metropolis计划的两个硬分叉中的第一个。

在Byzantium(拜占庭)分叉之后,还有一个Metropolis(大都会)阶段规划的硬分叉:Constantinople。Metropolis阶段之后将是以太坊部署的最后阶段,代号为Serenity(宁静阶段)。

以太坊:一个通用目的的区块链

最初的区块链,也就是比特币背后的区块链,是用于跟踪比特币及其所有权状态的。你可以把比特币看作一个分布式的共识状态机,交易导致以此全局范围的状态转变,改变了比特币的所有权。状态转换受公式规则所限,在若干个区块被挖矿之后,允许所有的参与方(最终)对系统的状态达成一致的共识。

以太坊也是一个分布式状态机。到那时不同于跟踪数字货币所有权的状态,以太坊跟踪的是一个通用目的的数据存储的状态转变。通用目的的意思是任何可以表示为键值元组的数据。

以太坊相比于通用计算机的两个主要差异体现在:

  • 状态转换是由共识规则控制的
  • 状态是全局分布在一个共享的账本之上

如果能基于共识规则来创建一台全局计算机,那么可以追踪任何复杂的状态变化并对状态机进行编程,这会带来什么?以太坊对这个问题给出了它的答案。

以太坊的组件

根据前文“区块链的组件”所描述的内容,以太坊中所对应的组件如下:

  • P2P网络
  • 共识规则
  • 交易(消息)
  • 状态机
  • 数据结构
  • 共识算法(由PoW->PoS)
  • 经济安全:当前的工作量证明算法为Ethash,迟早会被PoS代替。
  • 客户端(Go-Ethereum(Geth)和Parity等)

扩展阅读

·以太坊黄皮书: https://ethereum.github.io/yellowpaper/paper.pdf

·黄皮书的“浅黄”版本,这是面向普通读者、不含大量数学公式的黄皮书修订版: https://github.com/chronaeon/beigepaper

·DΞVp2p网络协议:https://github.com/ethereum/wiki/wiki/%C3%90%CE%9EVp2p-Wire-Protocol

·以太坊虚拟机相关的精彩资源:https://github.com/ethereum/wiki/wiki/Ethereum-Virtual-Machine-(EVM)-Awesome-List

·LevelDB数据库(用于在本地保存区块链数据的数据库服务):http://leveldb.org

·Merkle Patricia Tree(MPT)规范:https://github.com/ethereum/wiki/wiki/Patricia-Tree

·Ethash工作量证明算法: https://github.com/ethereum/wiki/wiki/Ethash

·Casper权益证明第一版实现指导:https://github.com/ethereum/research/wiki/Casper-Version-1-Implementation-Guide

·Go-Ethereum(Geth)客户端: https://geth.ethereum.org

·Parity以太坊客户端: https://parity.io

以太坊和图灵完备

“图灵完备”一词来自于阿兰·图灵。图灵探索通用可计算性这个问题的过程中证明了有一类问题是不可解的,特别是著名的停机问题(即给定任意程序和输入,视图证明程序最终是否会停止运行)是不可解的。

阿兰·图灵随后定义了一个名为图灵完备的系统,这个系统可以用来模拟所有的图灵机。这类系统被称为通用图灵机。

以太坊通过EVM的状态机执行存储在区块链上的程序,能够从存储中读取和写入数据让这个状态机成为图灵完备的系统。相较以往的计算机,以太坊把存储程序计算机这样的通用目的的计算架构与去中心化区块链相结合,因此创建了一个分布式的单体状态世界计算机。无论以太坊的程序运行在任何地方,都能够产生一致的共识状态,通过共识状态则确保安全。

图灵完备作为一项“功能”

实现“图灵完备”其实相当简单,相反的实现“图灵不完备”才是极具挑战性的。即使是最简单的状态机,都是满足图灵完备要求的。目前已知的最简单的图灵完备机只需要4个状态,使用6种符号,其中的状态定义只有22个指令长度。

图灵完备的隐含意义

简单来说,在真正运行程序之前,人们无法预测程序的执行路径。图灵完备的系统可以在无限循环中运行,这是对一个不终止程序的极简描述方式。这对以太坊来说意味着一个挑战——每一个参与以太坊的节点(客户端)都必须验证每一个交易,智能合约可能在一个节点试图验证它的时候永远不停地执行下去,这也就造成了一种DDoS攻击的后果,一个节点的瘫痪,甚至可能会蔓延到所有节点上。

为了应对这个问题,以太坊引入了名为gas的计量机制。EVM在执行智能合约时会判断执行过程中的资源开销量是否达到交易中指定的gas上限,如果超过了,那么EVM就会主动终止这个合约的执行。

需要注意的是gas只能作为以太坊上交易的一部分购买,并且只能通过以太币购买。以太币要与交易一起发送,并且需要明确标记gas,以及可接受的gas价格。就如在加油站一样,最后能否交易上链取决于矿工的选择。

从通用目的的区块链到DApp

以太坊开启了通用目的区块链用于构建多种应用的道路。其中DApp就是一个典型的例子,它代表了更广泛的“智能合约”。而DApp本身是一个后见与开放的、去中心化的、点对点的基础设施之上的Web应用程序。

DApp至少包含:

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

有很多DApp还包含其它去中心化组件,如:

  • 去中心化(P2P形式)的存储协议和平台
  • 去中心化(P2P形式)的消息协议和平台

有时候人们会用what_is_ethereum_0来表示DApp。what_is_ethereum_1是一个拉丁语字符,称为“ETH”,代表Ethereum。为了显示这个字符,可以使用Unicode 0xD0,如果需要在HTML中使用,就是十进制数字#208。

互联网的第三次浪潮

2004年,“Web 2.0”的概念日渐引起人们关注,它描述了面向用户生成内容、响应式界面和交互式的Web革命。

与此同时DApp的概念正引导着万维网走向下一个革命,即在每一个Web应用中都引入了带有点对点协议的去中心化能力。人们用Web3这个属于来描述这场革命,意味着Web的第三个“版本”。它代表着Web应用新的愿景和关注点:从集中化和同一管理的应用,到构建于去中心化协议之上的应用。

以太坊的开发文化

move fast and break things.

如果需要一项更改,那就实现它,即使这意味着废弃之前的假设、破坏兼容性,或者导致客户端被迫更新。

对于以太坊开发者而言,最大的挑战是,把自己的代码部署到不可变的系统上,还是部署到不断发展和演化的平台上,这是一对固有的矛盾。这意味着你需要随时做好从头开始的准备。

为什么要学习以太坊

区块链的学习曲线非常陡峭,它集结了众多领域的知识:编程、信息安全、密码学、经济学、分布式系统、点对点网络,等等。以太坊让这条学习路线变得不那么陡峭,让你可以体验由浅入深的奇迹。

熟悉JavaScript应用的开发者可以很快掌握以太坊并开发出可用的代码。在以太坊早期,“只需要五行代码就能创建一个以太坊代币”这样的口号也并不少见,当然这也是一柄双刃剑,代码的质量和安全性完全无法保证。

这本笔记将会教你什么内容?

笔记将根据原书深入介绍以太坊的每一个组件,从简单的交易开始,剖析它的工作方式,构建简单的合约,逐步优化合约,然后开始更精彩的深入探索以太坊之旅。

你会学习以太坊的工作原理,同时也会理解它的设计理念。你会理解每一个部分的工作方式,也会掌握它们如何集成在一起,以及集成的原因。

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View