banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.

区块链、以太坊和智能合约

以太坊的主要工作原理就是接受账户发出的交易,更新它们的状态,然后维持该状态,直到另外的交易更新它们为止。在以太坊上,整个交易接受、执行和写入的流程分成两个阶段。以太坊接受交易和交易执行并写入账本之间是解耦的。对于去中心化和分布式架构来说,这种解耦才能够有效地支撑系统正常运行。

区块链主要有以下三种用途。

・信任:区块链可以用于创建去中心化应用,实现数据由多人集体控制,其中的任何一个人都没有权力去更改或删除以前的记录。即使有人确实做到了,他产生的数据也不会被其他参与者接受。

・自治性:对于区块链上的应用来说,没有唯一的所有者。由于没有唯一的所有者,也就没有人能够单独控制它,但是每个人却都可以通过它的行为来参与治理过程,这就有利于建立一个不能被操控或不易诱发腐败的解决方案。

・去中介化:基于区块链的应用能够消除现有流程的中间环节。例如在车辆登记、驾照发放等场景中,一般会存在一个中间角色,它承担着车辆登记和驾照发放的职责。如果基于区块链来设计流程,那么这个中间角色就没有存在的必要了,因为区块链上的数据在被确认后,驾照就会自动签发,车辆就会被自动登记。区块链将开启一个新的时代,很多业务不再需要中间的权威机构进行背书了。

密码学是一门科学,它将易懂的、直白的内容转换成秘密的、隐藏的、无意义的内容,同样道理,解密就是反过来操作。加密技术有助于传输和保存数据,而且不能轻易地解密。

在计算机领域有两种类型的加密技术:对称加密和非对称加密。

・对称加密和解密:对称加密指的是在加密和解密过程中使用同一个密钥。如果使用这种技术交换信息,那么,这意味着很多人将使用同一个密钥。

・非对称加密和解密:在加密和解密过程中使用两个密钥。任一密钥都可以用于加密和解密。使用公钥加密的信息,可以使用私钥解密。使用私钥加密的信息,可以使用公钥解密。下面用一个例子来说明,Tom 使用 Alice 的公钥去加密一个信息,然后发送给 Alice,然后 Alice 可以使用她的私钥解密并从中提取原始信息。简单地说,使用 Alice 的公钥加密的信息只能被她自己独有的私钥解密,这就是非对称加密的常见应用场景。非对称加密还有一个用途就是后面会介绍的数字签名。

散列是将输入的数据转换成一个固定长度的随机字符串(散列值)的过程,但是不能从结果反向生成或识别出原始数据,因此,散列也被称为数据指纹。几乎不可能基于其散列值导出输入数据哪怕原始数据发生了一点点的变化,也将产生完全不同的散列值,这样就确保了没有人敢在原始数据上做手脚。散列还有另外一个特征:虽然输入的字符串数据可能长短不同,但产生的散列值长度是固定的。例如,使用 SHA256 散列算法,不论输入数据的长度大小如何,总会产生一个 256 个字节的散列值。当数据量很大时,这一点就非常有用了,它总能产生一个 256 个字节的散列值,这样可以保存下来作为证据。以太坊在很多地方使用了散列技术,它会对每一笔交易进行散列,会对两个交易的散列值进行再次散列,最终为同一区块内的每个交易产生一个根散列值。

散列还有一个重要特征,就是从数学上来看,两个不同的输入数据不会产生同一个散列值。同样的道理,从计算上和数学上来说都不可能由散列值反推出输入值。

以太坊使用 Keccak256 作为它的散列算法。

下面的截图显示了散列的一个例子。输入的 Ritesh Modi 产生了一个散列值,如下图所示:

即使对输入数据进行轻微的变化 [1],也将产生一个完全不同的散列值,如下图所示:

[1] 这里两个单词之间去掉了空格。—— 译者注

非对称加密,它的一个重要应用就是在数字签名创建和验证时使用非对称密钥。数字签名类似于一个人在纸上手写的签名。与手写签名的作用一样,数字签名有助于识别一个人,还有助于确保信息在传递过程中不被篡改。让我们举个例子来理解数字签名。

Alice 准备给 Tom 发送一条信息。那么问题来了,Tom 如何确保收到的信息是由 Alice 发出来的,如何确保信息在传递过程中没有被篡改过?解决方案就是不能发送原始的信息 / 交易,Alice 首先需要取得发送的信息的散列值,然后用她的私钥对散列值进行加密,最后,她把这个刚产生的数字签名附加在散列值后发送给 Tom。Tom 收到信息后,他使用 Alice 的公钥提取出数字签名并解密,找到原始散列值。同时,他从实际接收到的信息中提取散列值,并对两个散列值进行比较,如果两个散列值一致,那么说明信息在传递过程中没有被篡改过。

数字签名通常用于资产或加密数字货币(例如以太币)的所有者对交易进行签名确认。

以太币是以太坊上的货币。以太坊的每次活动都需要消耗以太币作为费用,成功产生区块的矿工也会获得以太币作为奖励,以太币通过交易平台很容易兑换成法定货币。

以太币采用十进制的计量体系,其最小的单位是 wei。下面列出了一些计量单位,可以在网站https://github.com/ethereum/web3.js/blob/0.15.0/lib/utils/utils.js#L40 上查到更多信息。

在以太坊上执行任务需要消耗以太币。由于以太币在交易所进行公开买卖,因此它的价格会上下波动。在支付费用时,如果直接使用以太币,那么,由于其价格不固定,同一个服务所花费的成本可能会忽高忽低。这样的话,人们会选择当以太币价格处于低谷时再去执行交易。对于一个平台来说,出现这种情况并不理想 [1]。gas(燃料)的作用就是缓解这个问题,它是以太坊当前的内部货币。使用 gas 进行计价,用户能够预先确定一个交易的执行成本,这就是 gas 成本。采取这种方法,当以太币价格暴涨时,gas 价格可以适当调低,当以太币价格暴跌时,gas 价格可以适当提高。例如,使用智能合约里面的函数去修改一个字符,这个交易将会消耗一定的 gas,由于 gas 的使用成本已经事先确定,因此用户就可以有规律地执行智能合约了。

[1] 会形成峰谷效应,价格低的时候,执行量过大,平台会超负荷运行。—— 译者注

区块链是一种包含多个组件的体系结构,区块链独特的地方在于这些组件的功能和相互作用。重要的组件包括:EVM(Ethereum Virtual Machine 以太坊虚拟机)、矿工、区块、交易、共识算法、账户、智能合约、挖矿、以太币和 gas。在本章中,我们将介绍这些组件。

一个区块链网络是由大量的节点构成的,其中一部分是属于矿工的挖矿节点,另一部分节点不挖矿但会帮助执行智能合约和交易。这些节点统称为 EVM。网络上的各个节点之间互相连接,节点之间通过 P2P 协议进行通信,默认情况下使用 30303 端口。

每个节点都维护着一个账本的实例(副本),包含链上的全部区块。由于网络上存在大量矿工节点,为了避免节点之间的区块数据存在差异,这些节点会持续同步区块,确保账本数据一致。

在后续的章节中,我们将会更详细地讨论账本、区块和交易。

智能合约也运行在 EVM 上。智能合约通过编写个性化的业务功能扩展以太坊的能力。智能合约执行的时候,是作为交易的一部分按照前面提到的挖矿流程进行的。

在网络上有账户的用户可以发送信息来完成账户之间的以太币交易,或者发送消息来调用合约中的一个函数。对以太坊来说,这两种方式实质上都是交易。在交易确认和更改账户余额时,账户所有人必须用私钥对交易进行数字签名,这样才能确定发送者的身份。以太坊的结构如下图所示。

在区块链和以太坊中,每个区块都连接着另外一个区块。两个区块之间是一对父子的关系,并且是一对一的关系,这样首尾相接就组成了一个链条。本章后面会讲到区块,在接下来这张图中,我们用 3 个区块(区块 1、区块 2、区块 3)来示意。区块 1 是区块 2 的父区块,区块 2 是区块 3 的父区块。在每个区块的头部都存储了父区块的散列值,这样就建立了父子关系。

区块 2 在头部存储了区块 1 的散列值,区块 3 在头部存储了区块 2 的散列值,那么,问题来了,第一个区块的父区块是谁?以太坊有个创世区块的概念,它就是第一个区块。这个区块是在链初次发起时自动创建的。你也可以这样认为,整个链条是由创世区块(通过 genesis.json 文件来生成)作为第一个区块而开始启动的,

知道区块是互相连接在一起的,你可能想知道交易是如何与区块绑定在一起的。在以太坊中,交易是存储在区块里面的,交易在执行时需要消耗一定数量的 gas,由于每个区块都有一个 gas 上限,待执行的交易消耗的 gas 总数不能超过上限,这样可以避免将所有交易存储在一个区块里面。当达到 gas 上限时,其他交易就不能再写入这个区块,此时,节点开始挖矿。

一个交易在产生散列值之后,就被存储到区块中,接着,挖矿程序会选取两个交易的散列值进行再次散列,再产生一个新的散列值。很显然,区块里面的所有交易最终会产生一个唯一的散列值,它就是 Merkle 根散列值,保存在区块头上。如果区块里面的任何一个交易发生了改变,这个交易的散列值也会随之变化,最终会导致根交易散列值发生变化。当区块的散列值发生变化后,由于子区块保存了父区块的散列值,因此,它的子区块的散列值也需要随之变化,这样会引发连锁反应,使得整个区块链都要变化才行,因此,区块链的不可篡改才成为可能。

节点就是计算机,它们之间通过 p2p 协议互相连接,组成了以太坊网络。

以太坊有两种类型的节点:

·EVM

・挖矿节点

需要注意的是,这种分类只是为了对概念进行细分,在大多数场景中,并没有专门的 EVM,相反的是,所有的矿工节点都承担了 EVM 的职能。

矿工的日常工作与财务会计很相似,会计的主要工作就是在财务账本上记录数据,同样的道理,矿工的主要职责就是向以太坊写入交易数据。驱动他这样工作的原因是可以获得奖励,矿工的奖励有两种:第一种是向区块链写入区块的奖励,第二种是能够获得区块内的交易所支付的 gas 费用。一般情况下,区块链上存在很多矿工,它们之间互相竞争,然而,最终只有一个矿工能够获胜并向账本写入区块,其他矿工则无权写入。判断矿工获胜是通过破解一道难题的方式。在挖矿时,每个矿工需要解决的难题是一样的,矿工们只能通过自己的机器计算能力去破解。第一个解决了这个难题的矿工会把含有交易的区块写入自己本地的账本,然后发送区块和 Nonce 值 [1] 给其他矿工进行确认,其他矿工接收区块并验证该答案是否正确,通过后,区块就会被矿工写入到自己的账本中。在这个过程中,赢得挑战的矿工也会得到 5 个以太币的回报。每个节点都维护了一套以太坊账本的副本,矿工的职责就是通过数据同步使得本地账本处于最新的状态,最终各个矿工之间的账本实现了一致性。

矿工或者挖矿节点有三个重要的功能:

・挖矿或打包交易产生新的区块并写入到以太坊账本

・向其他矿工发送最新的区块,并通知他们接收

・接收其他矿工的区块,并更新本地的账本

挖矿节点指的是那些属于矿工的节点,它们和 EVM 节点都是整个网络的一部分。在某一时刻,矿工将产生新的区块,然后从交易池中收集交易,打包到新创建的区块中。最终,这个区块被添加到区块链上。

下面将解释一些其他概念,如共识和破解难题。

[1] 破解的答案。—— 译者注

网络上的全部矿工而言,挖矿程序是相同的,它们需要做的就是按照程序中的规则不断地执行挖矿任务。矿工一方面拼命计算程序以便挖到新的区块,另外,也在时刻接侦听交易池中新的交易,接收、验证和转发其他矿工的区块。正如前面所说,首先矿工创建一个区块,然后从交易池中收集交易并添加到区块中,在添加之前,会检查交易是否已经被其他矿工写入到了区块中,如果已经被写入,就去掉它。

为了获得挖矿奖励,矿工需要添加自己的币基(coinbase)交易(译者注:区块中第一笔交易是挖矿的回报交易),接着,产生区块头并执行下列步骤:

1. 矿工抓取两个交易的散列值,进行再次散列并产生一个新的散列值,直到对所有交易完成散列后,将得到唯一的散列值,这就是根交易散列值或 Merkle 根交易散列值,它将被添加到区块头。

2. 矿工也需要确定上一个区块的散列值,因为它是当前区块的父区块,父区块的散列值要保存在当前区块头中。

3. 矿工计算交易的 state 和 receipts 根散列值 [1],然后写入区块头。

4.Nonce 和时间戳记录到区块头。

5. 产生整个区块(包括区块头和区块体)的散列值。

6. 挖矿流程开始,矿工持续变换 Nonce 值,直到发现该散列值能够解决难题为止,需要记住的是,对网络上的矿工而言,执行过程是一样的。

7. 很显然,某一矿工最终能够找到这个难题的答案,它会将结果发送给网络上的其他矿工。其他矿工会先确认该答案是否正确,如果是正确的,将开始验证每个交易,然后接受该区块,并添加到他们的本地账本中。

上面的整个挖矿流程,因为矿工提供了经过不断计算而获得了解题答案的证明,所以,被称之为工作量证明(PoW)。另外,还有其他一些算法,如:权益证明 PoS)和权威证明(PoA),由于以太坊没有用到这些算法,本书暂不展开讨论。区块头和它的组成部分如下图所示:

[1] 这里的 state 和 receipts 指的是另外两个 Merkle 树。以太坊有三棵 Merkle 树,即:交易 Merkle 树,state Merkle 树和收据 Merkle 树。

账户是以太坊体系的主要组成部分。以太坊将交易保存到账本上的过程,其实就是账户之间进行交互的过程。以太坊有两种类型的账户:外部账户和合约账户。每个账户默认有一个余额属性,可以查看该账户以太币的当前余额。

以太坊上的用户所拥有的账户。在以太坊中,账户不能使用名称来调用。当你在以太坊上创建一个外部账户时,会产生一对公钥和私钥。私钥需要你保存在安全的地方,而公钥就是你对账户持有所有权的证明。公钥一般是 256 个字符,但是以太坊只使用前面 160 个字符来标识身份。

例如,Bob 在以太坊网络上(无论是公开网络还是私有网络)新建一个账户,私钥留给自己使用,而公钥的前 160 位字符将成为它的身份标识,其他账户就可以向这个账户发送以太币或者其他基于以太的加密货币。

外部账户能够持有以太币,但是不能执行任何代码。它能够与其他外部账户执行交易,也可以借助于智能合约中的函数执行交易。

交易是买方和卖方、供应商和消费者、提供方和消费方之间使用货币、加密数字货币或者其他资产换取对方的资产、产品或服务的协议。以太坊为交易顺利执行提供了保障,下面是以太坊上支持的三种交易类型:

1. 从一个账户向另外一个账户发送以太币:这个账户可能是外部账户或者合约账户。下面的场景都可能发生:

・在交易中,一个外部账户向另外一个外部账户发送以太币

・在交易中,一个外部账户向一个合约账户发送以太币

・在交易中,一个合约账户向另外一个合约账户发送以太币

・在交易中,一个合约账户向一个外部账户发送以太币

2. 智能合约部署:外部账户在 EVM 上部署合约是通过交易的方式实现的。

使用或借助合约内的函数:如果需要执行合约内的函数去改变一个状态,就需要一个交易,如果执行函数没有改变任何一个状态,就不需要交易。

下面介绍与交易有关的一些重要属性:

From 账户属性说明了这个账户是交易的发起方,发送 gas 或以太币。前面章节我们介绍过以太币和 gas 的概念。From 账户可以是外部账户或合约账户。

To 账户属性指的是接收以太币或其他收益的账户,它可以是外部账户或合约账户。如果是部署合约的交易,则 To 字段为空。

Value 账户属性指的是账户之间转移的以太币数量。Input 账户属性指的是合约编译后被部署在 EVM 上的字节码。input 也用于保存有关智能合约函数带参调用的信息。下图展示了在典型的以太坊交易中使用智能合约函数的地方,从这个截图上看,请注意 Input 字段中包含了带有参数的函数调用。

BlockHash 账户属性指的是该交易所属的区块的散列值。

BlockNumber 账户属性指的是交易所属的区块序号。

Gas 账户属性指的是交易的发送方支付的 gas 数量。

GasPrice 账户属性指的是发送方支付的 gas 价格,以 wei 为单位(在本章前面介绍以太币的地方,提到过 wei 的概念)。总的 gas 消耗 = gas 数量 * gas 价格。

Hash 账户属性指的是交易的散列值。

Nonce 账户属性指的是交易的编号,它由发送方在当前交易之前产生。

TransactionIndex 账户属性指的是区块中当前交易的流水号。

Value 账户属性指的用 wei 计算的传递的以太的数量

V、r 和 s 属性指的是数字签名和交易的签名。

下面是以太坊上的一个常见的交易,外部账户向另外一个外部账户发送以太币(注意这里没有使用 input 字段)。截图的交易中转移了 2 个以太币,其中的 value 字段就是用 wei 来计量的。

外部账户之间转移以太币也可以使用下面的代码来实现,它基于的是 web3 JavaScript 框架,本书后面会介绍。

下图展示了部署了智能合约的交易,注意 input 字段中包含了合约编译后的字节码

区块是以太坊的一个重要概念。区块是交易的容器,它由多个交易组成。因为受区块的 gas 上限(后面我们会介绍 gas 上限)和区块大小限制,每个区块包含的交易数量并不相同。区块连接在一起形成了区块链,除了第一个区块(也叫作创世区块)没有父区块外,其他区块都有一个父区块,父区块的散列值存储在区块头上。

下图显示了区块的结构:

区块有很多属性,为了便于掌握关键内容,下面只介绍一些重要的部分:

Difficulty 属性指的是矿工为了挖到这个区块而需要面对的计算难度。

GasLimit 属性指的是区块允许的 gas 总量上限。它决定了区块中能包含多少个交易。

GasUsed 属性指的是区块中的交易实际消耗的 gas 数量。

Hash 属性指的是这个区块的散列值。

Nonce 属性指的是一个数字,它是解决难题的答案。

Miner 属性指的是矿工的账户,可以用 coinbase 或 etherbase 的地址。

Number 属性指的是该区块在区块链上的序号。

ParentHash 属性指的是父区块的散列值。

ReceiptsRoot、stateRoot 和 TransactionsRoot 属性指的是在前面的挖矿流程中提到的 merkle 树

Transactions 属性指的是区块中的交易组成的一个数组。

TotalDifficulty 属性指的是区块链的整体难度

端到端的交易#

Sam 打算发送一个数字资产(如:美元)给 Mark。首先,Sam 新建了一个交易,里面包括了 from、to、value 等字段数据,然后发送到以太网络上,该交易并没有立即写入到账本中,而是暂存到交易池中。

挖矿节点新建了一个区块,然后按照 gas 上限标准,从交易池中提取交易(Sam 的交易也将被提取),并添加到区块中,网络上的全体矿工都在执行相同的任务。

接下来,矿工们开始争先恐后地去计算难题,在一段时间(或几秒)后,获胜者(第一个解决难题的人)会发出通知,声称他找到了答案,赢得了比赛,需要向区块链写入区块,与此同时,获胜者将答案添加到区块上并发送给其他矿工。其他矿工收到通知后,首先验证这个答案,一旦认定该答案确实有效,就立即停止自己的计算,接收这个包含了 Sam 的交易的区块,然后添加到他们的本地账本中。这样下来,就在链上产生了一个新的区块,它将一直跨越时间和空间而永久的存在下去。在这期间,双方的账户余额都会得到更新,最后,区块被分发复制到网络上的全部节点。

什么是合约#

合约是经过双方或多方同意,约定立即执行或在将来执行一项交易的法律文件。因为合约是法律文件,所以它具有强制性和可执行性。合约应用的场景很多,例如:一个人和保险公司签订合同购买健康险,一个人从另外一个人手里购买一块土地,一个公司出售股权给另外一家公司。

什么是智能合约#

智能合约是按照用户的需求编写的代码,并部署和运行在以太坊虚拟机上。智能合约是数字化的,它在代码中固化了账户之间交易的规则。智能合约有利于通过原子化交易来实现数字资产的转移,也可以用于存储重要数据,这些数据可以用来记录信息、事件、关系、余额、以及现实世界中的合同中需要约定的信息。智能合约类似于面向对象的 class 类,因此,一个合约可以调用另外一个合约,就像我们可以在类对象之间进行互相调用和实例化。我们也可以这样认为,智能合约就是由函数构成的小程序。你可以新建一个合约,借助合约里面的函数去查看区块链上的数据,以及按照一些规则去更新数据。

如何编写智能合约#

彼特・托德(Peter Todd)是比特币核心开发者之一。他总结了智能合约(Smart contract)的现状,认为 “智能合约讨论的结论是:没有人理解智能合约究竟是什么。如果我们要实施智能合约,应该需要预言机(oracles)”。

确实,要想阐明智能合约的理念和本质并非易事。

我们从智能合约理念的起源开始。“智能合约” 概念由计算机科学家、加密大师尼克・萨博(Nick Szabo)于 1993 年左右提出来。1994 年他写成了《智能合约》(Smart contracts)论文,是智能合约的开山之作。

尼克・萨博对智能合约的阐述以一个自动售货机的例子开始。我们可以认为智能合约的原始祖先,是不起眼的自动售货机。在经过潜在的、损失有限的评估后,自动售货机使钱箱里的钱远远少于破坏者付出的代价。售货机根据显示的商品价格收取投币,通过一个简单的机制形成了最初的计算机设计科学,并且有限自动、根据投币金额传递变化和产品。自动售货机是一种搬运合约:任何持有硬币的人都可以与供应商交易。锁定钱箱和其他安全机制保护售货机储藏的硬币和货物不被破坏,从而支撑在各种各样的区域部署自动售货机,并且产生盈利。

在自动售货机概念的基础上,尼克・萨博给出智能合约的定义如下:

“智能合约超越了自动售货机中嵌入各种有价属性的范畴,通过数字方式控制合约。智能合约涉及具有动态性、频繁主动执行属性的财产,且提供更好的观察和验证点,其中主动积极的措施必须丝毫不差。”

尼克・萨博告诉我们的是,智能合约本质上的抽象概念是在个人、机构和财产之间形成关系的一种公认工具,是一套形成关系和达成共识的协定。智能合约的条款(如抵押品、产权划分等)可以嵌入到处理硬件和软件中,以这样的方式使违约成本非常昂贵(甚至令人望而却步)。例如,为房屋而设计出的数字保障智能合约,根据智能合约设计策略,持续完善房屋抵押品协议以便其更充分地嵌入到处理合约条款中。根据合约条款,这些协议将使加密密钥完全控制在具有操作属性的人手中,而此人也将正当地拥有该房屋财产。最简单地,为了防止偷窃,使用者需要完成正确的解锁过程,否则房屋将切换至不可使用状态,比如门禁失效和设施失效等。在传统方式中,如果房屋被用做还贷,有一个令债权人头痛的问题是很难查收赖账的房屋,需要通过频繁沟通才能收回房屋钥匙等。为了解决这一问题,我们可以创建一个智能扣押权协议:如果物主不交费,智能合约调用扣押权协议,把房屋钥匙的控制权交给银行。该协议可能会比雇佣追债人更便宜、更有效。

同时,尼克・萨博提出了智能合约的三要素:

①一把可以允许业主同时排除非法第三方的锁;

②一个允许债权人秘密接入的后门;计算机设计科学,并且有限自动、根据投币金额传递变化和产品。自动售货机是一种搬运合约:任何持有硬币的人都可以与供应商交易。锁定钱箱和其他安全机制保护售货机储藏的硬币和货物不被破坏,从而支撑在各种各样的区域部署自动售货机,并且产生盈利。

在自动售货机概念的基础上,尼克・萨博给出智能合约的定义如下:

“智能合约超越了自动售货机中嵌入各种有价属性的范畴,通过数字方式控制合约。智能合约涉及具有动态性、频繁主动执行属性的财产,且提供更好的观察和验证点,其中主动积极的措施必须丝毫不差。”

尼克・萨博告诉我们的是,智能合约本质上的抽象概念是在个人、机构和财产之间形成关系的一种公认工具,是一套形成关系和达成共识的协定。智能合约的条款(如抵押品、产权划分等)可以嵌入到处理硬件和软件中,以这样的方式使违约成本非常昂贵(甚至令人望而却步)。例如,为房屋而设计出的数字保障智能合约,根据智能合约设计策略,持续完善房屋抵押品协议以便其更充分地嵌入到处理合约条款中。根据合约条款,这些协议将使加密密钥完全控制在具有操作属性的人手中,而此人也将正当地拥有该房屋财产。最简单地,为了防止偷窃,使用者需要完成正确的解锁过程,否则房屋将切换至不可使用状态,比如门禁失效和设施失效等。在传统方式中,如果房屋被用做还贷,有一个令债权人头痛的问题是很难查收赖账的房屋,需要通过频繁沟通才能收回房屋钥匙等。为了解决这一问题,我们可以创建一个智能扣押权协议:如果物主不交费,智能合约调用扣押权协议,把房屋钥匙的控制权交给银行。该协议可能会比雇佣追债人更便宜、更有效。

同时,尼克・萨博提出了智能合约的三要素:

①一把可以允许业主同时排除非法第三方的锁;

②一个允许债权人秘密接入的后门;

③后门只在违约且没有付款的一段时间被打开;最后的电子支付完成后将永久地关闭后门。

从本质上讲,这些智能合约的工作原理类似于计算机程序的 if-then 语句。智能合约以这种方式与真实世界的财产进行交互。当一个预先定义的条件被触发时,智能合约就执行相应的合同条款。尼克・萨博关于智能合约的工作理论迟迟没有实现,是因为缺乏天生能够支持可编程合约的数字系统。如果金融机构仍然需要手动批准资产的转移,那么智能合约的目标就没有实现。瑞波实验室的市场和交易主管菲利・拉波波特(Phil Rapoport)说,“实现智能合约的一大障碍是现在计算机程序不能真正地触发支付”。区块链技术的出现和被广泛使用,正在改变阻碍智能合约实现的现状,从而使尼克・萨博的理念有了实现的机会。智能合约技术现在正建立在区块链基础之上,因为区块链本身就是一个计算机程序,智能合约能够与它进行交互,就像它能与其他程序进行交互一样。

在已提出智能合约理念的基础上,结合近几年区块链技术的不断发展,我们将试图给出对智能合约更为具体和详细的阐述

智能合约是一套以数字形式定义的承诺,承诺控制着数字资产并包含了合约参与者约定的权利和义务,由计算机系统自动执行。

承诺定义了智能合约的本质和目的。以一个销售合约为例:卖家承诺发送货物,买家承诺支付合理的货款。数字形式意味着合约需要被写入计算机可执行的代码中,只要参与者达成协定,智能合约建立的权利和义务,就由一台计算机或者计算机网络执行。

我们举个简单的例子,形象化地描述智能合约。

If Event_X_Happened:

Send (爱丽丝,1000$)

Else:

Send (鲍伯,1000$)

意思是:如果事件 X 发生,则合约给爱丽丝发送 1000 美元;否则,给鲍伯发送 1000 美元。

这就是最简单的合约。

如图所示是一个智能合约模型示意,其中各组成部分的定义如下。

①合约参与者:执行智能合约的相关参与者。

②合约资源集合:智能合约执行涉及的参与者资源,比如参与各方账户、拥有的数字财产等。

③自动状态机:智能合约下一步执行的关键,包括当前资源状态判断、下一步合约事务执行选择等。

④合约事务集合:智能合约的下一步动作或行为集合,控制着合约资产并对接收到的外界信息进行回应。

image

编写智能合约的工具有很多种,如:Visual Studio。其中,最简单和最快速的开发方法是使用基于浏览器的开发工具,例如:Remix。打开http://remix.ethereum.org 网页就可以直接使用。Remix 是一个新名字,以前被叫做 browser-solidity。Remix 提供了丰富的 Solidity 集成开发环境,可以在浏览器上进行智能合约的创建、开发、部署和调试。合约维护有关的操作(如:创建、发布、调试)都可以在同一个环境下完成,而不需要切换到其他的窗口或页面。

有些人不习惯使用 Remix 的在线版本。由于 Remix 是个开源工具,可以从 https//github.com/ethereum/browser-solidy 下载软件包,经过编译,Remix 就可以在本地使用。使用本地工具的另外一个好处是它能够连接到你自己搭建的私有网络,否则的话,你在网页上编写完代码后,还需要把文件拷贝到本地,经过编译后才能发布到私有网络上。下面我们来逐步了解 Remix。

1. 打开 remix.ethereum.org 网址,在浏览器中默认打开一个智能合约

如果你不需要,可以删掉它。

2. 新建一个合约,选择左边菜单栏中的 +。

3. 对这个 Soldiy 文件进行命名,以.sol 作为后缀。输入合约名字 HelloWorld,点击 “OK”,就创建了一个空白合约,如下图所示:

4. 在制作栏内的空白处,输入下面这段代码,就能创建你的第一个合约。

合约的细节会在第三章讲解。现在,先简单理解一下,你可以使用关键词 contract 创建合约,声明全局状态变量和函数,保存合约为后缀名。是 sol 的文件。在下面的源代码片段中,当 GetHelloWorld 函数调用 HelloWorld 合约时,将返回 Hello World 字符。

Remix 的右面是操作窗口,有很多标签页面:编译、运行、设置、调试、分析和支持。这些操作用于对合约进行编译、发布、调试和调用。调试标签会把合约编译成字节码(以太坊能够理解的代码),这里会显示调试时出现的警告和错误信息,对于这些信息,你要足够重视,解决这些信息会增强合约的健壮性。运行页面与编写合约页面相比,你需要花费更多的时间。在 “环境” 选项中,由于 Remix 在浏览器中绑定了以太坊的运行环境,所以允许你使用 JavaScript 虚拟机对合约进行发布,Injected Web3 选项用于使用 Mist 和 MetaMask 工具(下一章会提到),Web3 Provider 选项是在本地使用 Remix 连接私有链时使用的。在本章的例子中,默认使用 JavaScript 虚拟机选项。在第三章介绍 Solidity 时,再讨论剩下的选项。

5. 然而,发布合约最重要的操作就是使用新建按钮,如下图所示:

6. 点击新建按钮,就可以在浏览器中运行以太坊,在新建按钮下面显示了合约内的函数。由于例子中只有唯一的函数 GetHelloWorld,所以这里只有这一个选项。如下图所示:

7. 点击 GetHelloWorld 按钮,就可以调用和执行这个函数。执行的结果显示在 Remix 下面的栏位,如下图所示:

恭喜!你的第一个合约已经创建、发布和执行成功了。如果你不喜欢直接敲代码的话,本章中的 HelloWorld 合约代码可以拷贝到 Remix 中直接使用。

Remix 让发布过程变得简单了,但是系统后台还是执行了很多程序。了解这些步骤有助于我们更好地掌控发布过程。

image

①自动化维度。智能合约可以自动判断触发条件,从而选择相应的下一步事务;而传统合约需要人工判断触发条件,在条件判断准确性、及时性等方面均不如智能合约。

②主客观维度。智能合约适合客观性请求的场景,传统合约适合主观性请求的场景。智能合约中的约定、抵押及惩罚需提前明确;而主观性判断指标很难纳入合约自动机中进行判断,也就很难指导合约事务的执行。

③成本维度。智能合约的执行成本低于传统合约,合约执行权利、义务条件被写入计算机程序中自动执行,在状态判断、奖惩执行、资产处置等方面均具有低成本优势。

④执行时间维度。智能合约属于事前预定、预防执行模式;而传统合约采用的是事后执行,根据状态决定奖惩的模式。

⑤违约惩罚维度。智能合约依赖于抵押品、保证金、数字财产等具有数字化属性的抵押资产,一旦违约,参与者的资产将遭受损失;而传统合约的违约惩罚主要依赖于刑罚,一旦违约,可以采用法律手段维权。

⑥适用范围维度。智能合约技术可全球采用,适用于全球范围;而传统合约受限于具体辖区,不同国际地区的法律、人文等因素均影响着传统合约的执行过程。

如何部署合约#

第一步是使用 Solidity 编译器进行合约编译(下一章我们将介绍如何下载和使用 Solidity 编译器)。

编译后主要有两种输出物:

・ABI 规范

・合约字节码

ABI(Application Binary Interface)是一个接口,由带有参数的外部函数和公共函数组成。合约和其他使用者如果准备调用合约里面的函数,就可以使用 ABI 来实现。

字节码是合约的体现形式,它运行在以太坊上面。在发布时,字节码是必须的,ABI 只有在调用合约里面的函数时才会用到。你可以使用 ABI 创建一个新的合约实例。

合约的发布本身就是一个交易。因此,为了发布合约,你需要新建一个交易。在发布时,需要提供字节码和 ABI。由于交易在运行时需要消耗 gas,这些 gas 就需要由合约来提供。一旦交易被打包写入到区块链上后,你就可以通过合约地址来使用合约了,调用方也可以通过新地址来调用合约里面的函数。

对区块链和以太坊的工作原理深入理解,会有助于你使用 Solidity 编写更为健壮、安全和高效的智能合约。本章介绍了区块链的基本概念,解释了区块链是什么,区块链为什么这么重要,对于构建去中心化和分布式应用有哪些价值。本章也简要地介绍了区块链的体系结构,以及一些重要的概念,如:交易、区块、gas、以太币、账户、密码学和挖矿。本章也初步涉及智能合约的一些内容,例如使用 Remix 去编写智能合约,以及如何运行它。本章介绍的比较简单,因为后面会进一步详细的阐述,那时候你就能利用 Solidity 开发智能合约了。

你会注意到本章并没有提及以太坊的一些工具。下一章将介绍安装以太坊和相关工具,以太坊的生态十分丰富,有很多工具可以利用。我们将选取一些重点进行介绍,如:web3.js、TestRPC、Geth、Mist 和 MetalMask。

智能合约与区块链#

尼克・萨博关于智能合约的工作理论迟迟没有实现,一个重要原因是因为缺乏能够支持可编程合约的数字系统和技术。区块链技术的出现解决了该问题,不仅可以支持可编程合约,而且具有去中心化、不可篡改、过程透明可追踪等优点,天然适合于智能合约。因此,也可以说,智能合约是区块链技术的特性之一。

如果说区块链 1.0 是以比特币为代表,解决了货币和支付手段的去中心化问题,那么区块链 2.0 就是更宏观地对整个市场去中心化,利用区块链技术转换许多不同的数字资产而不仅仅是比特币,通过转换创建不同资产的价值。区块链技术的去中心化账本功能可以被用来创建、确认、转移各种不同类型的资产及合约。几乎所有类型的金融交易都可以被改造成在区块链上使用,包括股票、私募股权、众筹、债券和其他类型的金融衍生品如期货、期权等。

智能合约看上去就是一段计算机执行程序,满足可准确自动执行即可,那么为什么用传统的技术很难实现,而需要区块链技术等新技术呢?传统技术即使通过软件限制、性能优化等方法,也无法同时实现区块链的特性:一是数据无法删除、修改,只能新增,保证了历史的可追溯,同时作恶的成本将很高,因为其作恶行为将被永远记录;二是去中心化,避免了中心化因素的影响。

基于区块链技术的智能合约不仅可以发挥智能合约在成本效率方面的优势,而且可以避免恶意行为对合约正常执行的干扰。将智能合约以数字化的形式写入区块链中,由区块链技术的特性保障存储、读取、执行整个过程透明可跟踪、不可簒改。同时,由区块链自带的共识算法构建出一套状态机系统,使智能合约能够高效地运行。

智能合约工作原理#

基于区块链的智能合约包括事务处理和保存的机制,以及一个完备的状态机,用于接受和处理各种智能合约,而且事务的保存和状态处理都在区块链上完成。事务主要包含需要发送的数据,而事件则是对这些数据的描述信息。事务及事件信息传入智能合约后,合约资源集合中的资源状态会被更新,进而触发智能合约进行状态机判断。如果自动状态机中某个或某几个动作的触发条件满足,则由状态机根据预设信息选择合约动作自动执行。

智能合约系统根据事件描述信息中包含的触发条件,当满足触发条件时,从智能合约自动发出预设的数据资源,以及包括触发条件的事件;整个智能合约系统的核心就在于智能合约以事务和事件的方式经过智能合约模块的处理,输出还是一组事务和事件;智能合约只是一个事务处理模块和状态机构成的系统,它不产生智能合约,也不会修改智能合约;它的存在只是为了让一组复杂的、带有触发条件的数字化承诺能够按照参与者的意志,正确执行。

基于区块链的智能合约构建及执行分为如下几步。

①多方用户共同参与制定一份智能合约。

②合约通过 P2P 网络扩散并存入区块链。

③区块链构建的智能合约自动执行。

步骤①“多方用户共同参与制定一份智能合约” 的过程,包括如下步骤:

A. 用户必须先注册成为区块链的用户,区块链返给用户一个公钥和私钥;公钥作为用户在区块链上的账户地址,私钥作为操作该账户的唯一钥匙。

B. 两个以及两个以上的用户根据需要,共同商定了一份承诺,承诺中包含了双方的权利和义务;这些权利和义务以电子化的形式,编程机器语言;参与者分别用各自私钥进行签名,以确保合约的有效性。

C. 签名后的智能合约,将会根据其中的承诺内容,传入区块链网络中。

步骤②“合约通过 P2P 网络扩散并存入区块链” 的过程,包括如下步骤:

A. 合约通过 P2P 的方式在区块链全网中扩散,每个节点都会收到一份;区块链中的验证节点会将收到的合约先保存到内存中,等待新一轮的共识时间,触发对该份合约的共识和处理。

B. 共识时间到了,验证节点会把最近一段时间内保存的所有合约,一起打包成一个合约集合(set),并算出这个合约集合的 Hash 值,最后将这个合约集合的 Hash 值组装成一个区块结构,扩散到全网;其他验证节点收到这个区块结构后,会把里面包含的合约集合的 Hash 取出来,与自己保存的合约集合进行比较;同时发送一份自己认可的合约集合给其他的验证节点;通过这种多轮的发送和比较,所有的验证节点最终在规定的时间内对最新的合约集合达成一致。

C. 最新达成的合约集合会以区块的形式扩散到全网,如图 4-2 所示。每个区块包含以下信息:当前区块的 Hash 值、前一区块的 Hash 值、达成共识时的时间戳以及其他描述信息;同时区块链最重要的信息是带有一组已经达成共识的合约集;收到合约集的节点,都会对每条合约进行验证,验验证通过的合约才会最终写入区块链中,验证的内容主要是合约参与者的私钥签名是否与账户匹配。

image

步骤③“区块链构建的智能合约自动执行” 的过程,包括如下步骤:

A. 智能合约会定期检查自动机状态,逐条遍历每个合约内包含的状态机、事务以及触发条件;将条件满足的事务推送到待验证的队列中,等待共识;未满足触发条件的事务将继续存放在区块链上。

B. 进入最新轮验证的事务,会扩散到每一个验证节点,与普通区块链交易或事务一样,验证节点首先进行签名验证,确保事务的有效性;验证通过的事务会进入待共识集合,等大多数验证节点达成共识后,事务会被成功执行并通知用户。

C. 事务执行成功后,智能合约自带的状态机会判断所属合约的状态,当合约包括的所有事务都顺序执行完后,状态机会将合约的状态标记为完成,并从最新的区块中移除该合约;反之将标记为进行中,继续保存在最新的区块中等待下一轮处理,直到处理完毕;整个事务和状态的处理都由区块链底层内置的智能合约系统自动完成,全程透明、不可簒改

假设用户爱丽丝(Alice)与用户鲍伯 (Bob) 需要构建一个区块链智能合约,目的是爱丽丝将其房屋租赁给鲍伯,租金为 1000 元一个月,每月支付,租期为一年。假设爱丽丝房屋门锁可通过互联网控制,其开锁密钥为 Key(每月生成一次),爱丽丝的银行账户为 MA,鲍伯的银行账户为 MB。智能合约的执行包括如下步骤:

①爱丽丝与鲍伯提交合约构建申请给智能合约服务器,生成合约并由服务器发布到区块链生效。

②爱丽丝将 Key 以及 MA 提供给智能合约服务器。

③鲍伯通过 MB 向智能合约服务器支付 1000×12=12000 元的资金作为抵押,或者鲍伯通过第三方机构的担保,仅向智能合约服务器支付少量资金。

④合约开始执行,智能合约服务器将 Key 发送到鲍伯,并从鲍伯的抵押资金中扣除 1000 元,发送到爱丽丝的账户,并生成参与对象记录存入区块链。

⑤每个月智能合约都会定期检查,如果合约未到期,则继续从鲍伯的抵押资金中扣除 1000 元发送到爱丽丝的账户并发送 Key 给鲍伯,并生成参与对象记录存入区块链。

⑥整个过程受到第三方机构的监控,所有参与者、第三方机构都可以通过区块链查询合约执行情况。

⑦租约期限到后,智能合约服务器生成一条合约记录,标示合约终止并发布到区块链,合约执行即终止。

智能合约的发展可能需要经历漫长的道路,但是更多的智能合约机制正在被设计出来,更多领域的人才正在加入。目前为止,对来自截然不同的领域,如经济学、密码学、网络科学、金融学的自动化合约执行来说,共同设计研究合约准则是必经之路。如果缺少交叉沟通,无论是对技术的缺乏还是对商业用途模式意识的缺乏,都将造成智能合约的低效。

目前 Orisi、Codius、Symboint、Hedgy、BitHalo、Mirror、Hyperledger、Eris Industries、Ethereum、智能坊、小蚁、Colored Coin、IBM 等已经致力于智能合约的平台开发及相关研究,相信智能合约的应用前景一片光明。

参考资料

[1]http://www.fastcolabs.com/3035723/app-economy/smart-contracts-could-be-cryptocurrencys-killer-app

[2]https://medium.com/@heckerhut/whats-a-smart-contract-in-search-of-a-consensus-c268c830a8ad

[3] http://www.wtoutiao.com/p/14dyEMP.html

[4]http://www.coindesk.com/smart-contract-myths-blockchain/

[5]http://8btc.com/article-1921-1.html

[6]http://wangxiaoming.com/blog/2016/03/03/blockchain-2-0-he-yue/

以太坊网络#

以太坊网络是一个创建和部署分布式应用的开源平台,依靠大量计算机(节点)支撑,它们之间相互交互,并在分布式账本中存储数据。在这里,分布式账本的含义是网络上的每个节点都拥有一个账本的副本。对开发者来说,有多种网络部署方式可供选择,在部署解决方案和智能合约时,可以根据实际需求和场景,选择一个适合自己的网络,这样就不会支付真实的以太币或发生其他支出。当然,也有免费的网络可以使用,也有网络需要用户支付以太币或其他货币。

以太坊主网是全球性的公开网络,人人都可以使用,通过账户就能进入网络。对于任何人来说,创建账户、部署解决方案和合约都是免费的。主网的使用费用以 gas 来计量。它的代号是 homestead(以前叫做 Frontier)。通过互联网,人们能连接上主网,并可以查看上面的数据和交易。

测试网络#

测试网络的目的是帮助人们快速适应和使用以太坊环境,是从主网精确复制而来。在测试网络上,部署和使用合约,都不会发生真实的费用,这是因为测试用的以太币都是任意产生的,只能在测试网上使用。在笔者编写此书时,存在多个测试网络可以使用,例如:Ropsten、Kovan 和 Rinkeby。

Ropsten 是第一个使用 PoW 共识算法产生区块的测试网络。以前被叫做:Morden。正如上面所说的,你可以无偿使用它构建和测试合约。在 Geth 中加入 ——testnet 参数就可以进入测试网络了。在后面会介绍 Get 的用法。Ropsten 是目前为止最受欢迎的测试网络。

Rinkeby 是另外一个以太坊测试网络,它使用的是 PoA 共识机制。PoW 和 PoA 在矿工间建立共识时的机制是不同的。PoW 在维护不可篡改性和去中心化方面更强壮,然而它的缺陷是不能有效地控制矿工。PoA 具备了 PoW 的优点,也能对矿工具有一定的控制能力。

Kovan 测试网络只能在少部分用户之间使用,因此,更多的信息可以访问:https://kovan-testnet.github.io/website/。

私有网络#

私有网络是在用户自有的网络上建立和运行的,控制权掌握在一个组织手里。出于测试的考虑,人们并不希望将解决方案、合约和场景放到公共网络上,这样就需要建立一个开发、测试和生产的环境,因此,用户应该搭建一个私有网络,这样就能够全盘进行掌控。

联盟网络#

联盟网络也是一个私有网络,只是有一点区别,联盟网络的节点是由不同组织所管理的。实际上,联盟链上也没有哪个组织能够单独地控制网络和数据,而是由全体组织和组织里面具有查看和修改权限的人共同进行控制的。联盟链可以通过互联网或 VPN 网络接入。

Geth#

目前存在多种语言编写的以太坊客节点和客户端工具,包括:Go、C++、Python、javaScript、Java 和 Ruby 等。这些功能不受语言限制,开发者可以选择最适合自己的。本书使用 Go 语言,它被称为 Geth,可以作为客户端连接到公共的和测试的网络上,它也可以在私有网络上运行挖矿和 EVM(交易节点)。

Geth 是使用 Go 语言编写的命令行工具,可以使用它在私有网络上创建节点和矿工。Geth 可以在 Windows、Linux 和 Mac 环境下安装。

在 Windows 下安装 Geth#

在搭建私有网络前,需要下载和安装 Geth(goethereum)工具。

下面介绍下载和安装步骤:

1. 可以访问https://ethereum.github.io/go-ethereum/downloads/ 页面下载,有 32 位和 64 位两个版本。在本书中,操作系统使用 Azure 云上的 windows Server 2016 版本。

2. 下载后,执行安装文件,接下来按照默认配置一步步进行,完成开发环境设置。

3. 安装完成后,就可以在 CMD 和 Powershell 中使用了。

4. 打开命令行,输入 geth–help

需要注意的是,在输入 geth 后,get 会连接到主网上,然后开始同步和下载区块和交易数据。目前,整个以太坊区块已经超过 30GB [1]。help 命令执行后,屏幕上会显示 geth 可用的命令,包括版本号。

Geth 是基于 JSON RPC 的协议。它定义了采用 JSON 格式的代码远程调用规范。Geth 可以使用下面三种 JSON RPC 协议进行连接:

・内部进程通信(IPC,Inter Process Communicatiion):内部通讯,通常用于一台电脑内。

・远程程序调用(RPC,Remote Procedure Calls):跨计算机的通讯。通常使用 TCP 和 HTTP 协议。

・WS,Web sockets:使用 sockets 连接 Geth。

・配置 Geth 有很多命令、开关参数和选项,包括:

・配置 IPC、RPC 和 WS 协议

・配置网络连接的类型 —— 私有网络、Rostper 和 Rinkeby

・挖矿选项

・控制台和 API

・网络

・调试和日志

其中,在创建私有网络时用到的一些选项,将在下一部分提到。

Geth 可以直接使用 Geth(不带选项)直接连接公链。Homestead 就是当前公链的名称。它的 Networkid 和 ChainID 是 1。

在不同的网络上,其 Chain ID 是不同的。其中:

・chain ID 1 是主网公链

・chain ID 2 是 Morden 网络(仅对部分人开放)

・chain ID 3 是 Ropsten 网络

chain ID 4 是 Rinkeby 网络

・chain ID 大于 4 的是私有网络。

另外,可以使用 Geth--testnet 连接到 Ropsten 网,——rinkeby 连接到 Rinkeby 网,Geth 也可以与 chain ID 配合使用。

搭建一个私有网络#

Geth 安装好后,可以先在本地进行配置,这时不需要连接到互联网。每个网络都有一个创世区块,它是整个网络的第一个区块,没有父区块。创世区块由 genesis.json 文件产生。下面的代码显示了 genesis.json 的内容。

按照下面的步骤,我们开始搭建一个私有网络。

1. 在网络初始化时,Geth 需要使用 genesis.json 文件,同时,需要提供保存区块数据和账户私钥(keystore)的目录。

2. 输入 geth init 命令、genesis.json 文件、存储区块数据和 keystore 的文件夹,进行初始化。

输出结果如下:

3. 在上面的截图中,我们可以看到创世区块已经产生了,Geth 节点可以启动了。Geth 启动时默认使用 IPC 协议。为了确保 Geth 节点可以通过 RPC 协议访问,命令中需要带上 RPC 参数。

4. 为了搭建节点运行的环境,接下来执行以下命令:

执行结果如下:

在执行命令中,我们可以看出,命令使用了 datadir 参数,启用了 RPC,暴露给外部的模块和 API,Networkid 是 15,说明这是一个私有网络 [1]。从执行结果上看,我们会发现一些比较有价值的信息。首先,ehterbase 或 coinbase 没有设置,它在挖矿前需要设置好,目前,挖矿任务还没有启动(也可以使用命令行的方式去启动挖矿程序)。屏幕上显示了区块数据存储的位置,也显示了 ChainID,以及是否连接到了 Homestead 主网,数字为 0 表明没有连接到主网。屏幕上的 enode 的信息是节点在网络上的身份标志。如果其他节点准备加入这个网络中,就需要提供自己的 enode 值。

最后,屏幕上显示了 IPC 和 RPC 协议正在运行和接受请求。RPC 访问可以通过http://127.0.0.1:8545 或 http://localhost:854,IPC 访问可以通过 \\\\.\\pipe\\geth.ipc 命令如下:

5. 上面的命令将启动以太坊节点,细心的读者可能会发现,命令是以服务的形式持续运行的,这样会导致没有办法再执行其他命令了,所以,为了对这些运行中的节点进行管理,我们可以在本机上打开另外一个命令行窗口,输入 Geth attach ipc:\\.\pipe\geth.ipc 使用 IPC 协议连接到节点上,这样就可以执行其他命令了。如下图显示:

6. 连接本地的私有网络,可以使用 RPC 方式接入,输入命令 Geth attach rpc:http://localhost:8545 或 get attach rpc:http://127.0.0.1:8545。如果你看到的结果和上面显示的不同,那是因为在我这个例子中,coinbase 账户已经设置了。后面将介绍 coinbase 账户。

7. 默认的 RPC 接入端口是 8545,可以在命令行中使用 - rpcport 参数进行设置。IP 地址也可以通过参数 - rpcaddr 设置。

8. 连接到 Geth 节点后,接下来就需要设置 coinbase 或 etherbase 账户了。首先需要创建一个新账户,创建账户可以使用 personal 对象的 newAccount 方法。创建账户时,需要同时输入密码。下面的屏幕显示了账户创建后的 account ID 信息。

9. 账户创建完成后,需要确定使用 coinbase 账户或 etherbase 账户。如果需要更改原有的 coinbase 账户地址,可以通 address.miner 对象的 setEtherBase 函数进行操作。这个操作将使用新的账户替换原有的 coinbase 账户。更改结果将显示为 ture 或 false。

10. 执行下面的查询命令,你会发现刚才设置的地址已经生效了。

Coinbase 地址设置成功后,Geth 节点开始运行了,此时,挖矿可以启动了,因为我们只有一个矿工,所以它将获得全部的挖矿奖励,coinbase 账户的以太币会逐步增加。

11. 执行下列代码,启动挖矿:

也可以用下面的命令

上面的命令执行结果如下:

start 中的参数代表了用于挖矿的线程数量。该命令将启动挖矿程序,同样可以从屏幕上看到执行结果。

12. 如果需要停止挖矿,可以在另外一个窗口中执行 miner.stop () 命令。

[1] 前面提到过,ID 大于 4 就是私有网络。—— 译者注

ganache-cli#

在以太坊上,交易写入账本分为两个阶段:

・创建交易,然后将其放入交易池中。

・定期从交易池中获取交易,然后开始挖矿。挖矿意味着将这些交易写入以太坊数据库或账本的。

从上面这个过程可以看出,在以太坊上进行解决方案和智能合约的开发和测试,将十分浪费时间。ganache-cli(以前叫作:TestRPC)就是为了缓解这个问题,ganache-cli 包含了以太坊的交易处理流程和挖矿功能,但挖矿时不需要竞赛,交易产生后就会立即写入账本。对于开发者来说,使用 ganache-cli 可以作为以太坊节点,不需要挖矿交易就可以写入账本。

ganache-cli 是基于 Node.js 开发的,因此,在部署 ganache-cli 之前,需要安装 Node.js,可以从网址https://nodejs.org/en/download/ 上面下载,需要选择相应的 32 位或 64 位操作系统版本,点击下面屏幕上显示的链接就可以下载安装包:

现在,我们下载 64 位的 Windows 安装版本,可以用它来安装 node package manager(NPM)和 Node.js。

Solidity 编译器#

Solidity 是一种编写智能合约的语言。后面的章节会详细介绍智能合约。编写完 Solidity 代码后,需要使用 Solidity 编译器去编译,它将生成字节码和其他输出物,它们在部署智能合约时会用到。在以前,Solidity 是 Geth 安装包的一部分,现在已经脱离了 Geth 的安装过程,需要自行安装。Solidity 编译器被称之为 solc,可以使用 npm 命令进行安装:

web3 JavaScript 库#

web3 库是开源的 JavaScript 库,可以连接到本地或远程的以太坊节点,它使用的是 IPC 或 RPC 协议。web3 库是面向客户端的,可以和 Web 页面一起使用,以便向以太坊节点发起查询请求和交易提交请求。我们可以使用节点管理工具来进行安装,就像 Solidity 编译器的安装一样。在编写本书的时候,web3 的最新版本无法运行并提示没有正确安装,这是因为丢失了 BigNumber.js 文件。但是,以前的稳定版本可以连接到以太坊节点的后台。下面的步骤显示了如何安装 web3 JavaScript 库。

1. 使用下面的命令安装 web3

执行后,产生的结果如下:

2.web3 安装后,可以使用 Node.js 调用。在命令行模式下,如下图所示,执行 node 命令,将进入 node 模式。

3. 在 node 模式下,输入下面的命令就能连接到以太坊节点。以太节点是 TestRPC 或基于 Geth 的私有网络。web3 可以使用 WebSockets、IPC 或 RPC 协议连接到以太坊节点。下面的例子是 web3 使用 RPC 协议来连接到以太坊节点:

命令的第一行是加载 web3 模块,第二个命令是新建一个 HttpProvider 实例,用于连接到本地端口是 8545 的以太坊节点。

4. 为了验证 web3 是否连接到了以太坊节点,可以执行 isConnected 方法。如果返回值是 true,那么就说明 web3 已经连接上了。

Mist 钱包#

以太坊上面运行着以太币,因此,需要一个钱包来发送和接收以太币。Mist 就是这样一个接收和发送以太币的钱包,同时它也有利于用户在以太网络上(包括公有和私有网络)进行交易。在 Mist 上,用户可以创建账户、发送和接收以太币、部署和调用智能合约。

Mist 可以在https://github.com/ethereum/mist/releases 网站下载。用户需要根据自己的情况选择一个合适的安装包(在本例中,我们是在 windows 2016 环境下,所以,下载的是 Ethereum-Wallet-win64-0-9-2.zip),下载后解压缩。解压后,文件如下图所示,双击 Ethereum Wallet 图标。

Mist 就会启动。Mist 具有一定的智能性,如果本地运行了一个私有链,它就会识别到并连接上去。如果本地没有任何私有网络,它就会连接到主网或 Rinkeby 测试网络。

在本书中,前面已经搭建了一个私有网络,下图则显示了其连接的情况:

一旦连接成功,就可以与以太坊网络进行交互、发送和接收以太币、部署智能合约、调用智能合约里面的函数。

MetaMask#

MetaMask 是 Chrome 浏览器的一个轻量级插件,它能够与以太坊网络进行交互。它也是一个发送和接收以太币的钱包。MetaMask 可以从网址https://metamask.Io 处下载。因为 MetaMask 运行在浏览器里,因此,区块数据没有办法下载到本地,只能是存储在远程服务器上,用户通过浏览器去访问它。请看下面的操作步骤:

1.MetaMask 可以作为插件添加,如下图所示:

2. 确认隐私提醒和用户协议后,在 go 按钮旁边会显示一个小的图标。MetaMask 可以连接到多个网络,在下图显示了连接到本地的 Localhost 8545 的网络。

3. 在 MetaMask 中,为了验证身份,在创建一个密钥时,需要提供保护密码。这些信息存储在 MetaMask 服务器的密钥库里,如下图所示:

4. 点击 Account 图标,使用 Import Account 菜单,可以导入已经存在的账户:

5. 账户创建后,MetaMask 可以通过以太坊的交易从一个账户向另外一个账户转账。

6. 为了向另外一个账户发送以太币,首先选择一个发送账户,然后点击 Send 按钮,在弹出的窗口中,输入目标账户地址、金额,然后点击 Next 按钮:

7. 点击 submit 按钮,提交交易。此时交易将保存在交易池里,处于等待(Pending)状态。挖掘任务开始将此事务写入永久存储器。

8. 在 Geth 控制台启动挖矿任务,交易将会被打包,如下图所示:

过了一会,交易被写入账本,MetaMask 中的双方的账户余额就会发生变化

以太坊节点提供了 JSON RPC 的连接方式,我们可以使用 WebSockets、IPC、RPC 等多种方式进行连接。本章我们介绍了各种区块链网络:公共网、主网、测试网和私有网。本章也介绍了如何构建私有网络,同时,介绍了如何搭建一个开发环境,它会在下一章用到。本章重点介绍了在 windows 环境下如何安装各种工具。这些工具都有各种的用途。很显然,一些工具之间存在功能重叠之处。例如,基于 Geth 的私有网络和 ganache-cli 开发环境都能够创建以太节点,但还是存在一些差异。本章也介绍了如何安装 Geth、Solidity 编译器、ganache-cli、web3 库、JavaScript 框、Mist 和 MetaMask 钱包。

所以以太坊建立了一个可编程的、图灵完备的区块链。在这个区块链之上,你可以通过简单的程序实现各类数字资产的生产,也可以通过编写程序对以太坊上流通的区块链资产的状态进行精确地控制,比如这个资产是待支付还是被锁定还是有额度限制、这个账户是黑名单还是白名单、以太坊和其他数字资产的自动兑换等等。同时,以太坊是一个可以编程、图灵完备的区块链网络基础,在这个基础上,我们能够实现更多的非区块链资产的功能产品。比如说我用以太坊建立智能合约,应用在个人日常经济生活和企业经济活动中,这样的运用也是可以被实现的。

 

以太坊是建立在区块链和区块链资产的概念之上的一个全新开放的区块链平台。它允许任何人在平台上通过使用区块链技术建立和运行去中心化的应用。简单地说,以太坊技术就是区块链技术加上智能合约。

 

以太坊在创立之初就规划了比较详尽的发展路径和迭代版本,以太坊一共规划了四个迭代版本:

第一个版本 Frontier(前沿)

第二个版本 Homestead(家园)

第三个版本 Metropolis(大都会)

第四个版本 Serenity(宁静)

 

那么,我们就来细数一下以太坊的大事记吧:

2013 年末,创始人 Vitalik 发布了最初版的白皮书,启动了这个项目。

 

2014 年 7 月,以太坊进行第一批以太币的预售。这也是早期 ICO 中比较知名的一个案例。不过那时候没有 ICO 这个名词,那时候圈内人称这种代币发行叫 “币众筹”。通过为期 42 天的预售,以太坊团队募集了 3 万多个比特币,预售了 6000 万个以太币。

 

2014 年 10 月,以太坊将区块的出块时间从 60 秒缩减到了 12 秒,目前是基本稳定在 15 秒。

 

2015 年 7 月 30 日,以太坊的第一个版本 Frontire(前沿)发布,这也是以太坊的最初版本,只有命令行界面,没有图形界面,主要适用于开发者。

 

2016 年 3 月 14 日圆周率节,以太坊发布了第二个版本 HomeStead(家园)的版本,这也是目前正在运行的版本,易用性上得到了极大改善,有了图形界面,从此以后普通用户也可以体验以太坊的功能和开发了。

 

2016 年 7 月,以太坊进行硬分叉,分为以太坊 ETH 和以太坊经典 ETC。这个后面我们会详说。

 

近期,以太坊想要发布第三个版本大都会,在第三个版本 Metropolis(大都会)里,以太坊创始团队将会发布一个为非技术用户设计的浏览器,它的名字叫 Mist 浏览器。你可以把它想象成 Chrome 谷歌浏览器,在使用上非常便捷,还有强大完善的应用商店。Mist 浏览器也将包含去中心化应用商店、基础性应用,如果这样的浏览器能够被发布,将会十分有利于广大的互联网用户的参与并体验去中心化应用。根据目前以太坊团队公布的进度,第三个版本有望在 2017 年年底发布出来。

 

最后一个阶段 Serenity(宁静)的发布时间还没有确定。在前三个阶段,以太坊的共识机制采用工作量证明 (PoW) 共识机制,在第四阶段会切换到混合的共识机制。

 

混合共识机制是将比特币式的工作量证明 PoW 和 Vitalik 创建的权益证明机制 Casper 结合起来,使得矿工和持币者的权利和利益得到平衡。

 

说完版本迭代,我再列出来一些以太坊所涉及的名词,这样可以帮助你理解以太坊整个体系。

以太币

第一个名词是以太币。以太坊系统中的代币,简称 ETH。以太币(Ether)是以太坊内部的主要燃料,为在这个体系上运行各种数字资产交易提供主要的流动性,同时也是用于智能合约费用的的支付。它是以太坊内置的区块链资产,用来支付智能合约运行的。这个概念理解相对简单,我们之前学习了 Hash Cash 和工作量证明,不知道大家是否还记得。我们了解了,为了不让网络被垃圾邮件充斥,因此要求发送邮件的计算机要进行一些工作量计算。这样对于发送大量垃圾邮件的计算机就是一个巨大的负担。同样的道理,在以太坊网络上要进行智能合约的建立和运行,也需要一个小小的门槛,这个门槛对于认真想做开发的人员来说成本比较低,但是对于大量运行垃圾项目的发起者或者对于攻击者来说就是比较大的负担。不过以太坊的这个门槛不是工作量,而是燃料,我们叫 “Gas”,Gas 用以太币来兑换。

 

试想下,如果运行一个智能合约不需要花一些费用的话,在这条区块链上就会出现很多的垃圾合约或者垃圾应用,这个区块链会遭到攻击,使整个网络陷入无法使用的而状态。所以呢,以太坊的区块链要求每次运行智能合约的时候,需要支付一定数量的 Gas,Gas 可以以太币来支付,来确保这个区块链的稳定和安全。

 

关于以太币的面值。我们熟悉的比特币的最小面值是一聪,是一亿分之一比特币。以太坊也一样,有自己的最小面值,命名为 1 “wei”,它有多小呢?一枚以太坊代币分割到小数点后 18 位,就是 1 wei。

 

还有,在 2016 年 7 月,以太坊区块链发生硬分叉,这次硬分叉将以太坊分成了两条区块链。由创始人 Vitalik 主导的、升级以后的以太坊叫 Ethereum,代币代号为 ETH。不接受这次升级的链称为 “Ethereum Classic” 原链上的以太坊代币代号为 ETC。

以太坊虚拟机 EVM

第二个概念就是以太坊虚拟机 EVM。在一个编程系统之上,通常会有一些编译和执行的虚拟机来去做支撑。JAVA 有 JVM,那么在以太坊里,也会有以太坊的虚拟机,可以执行任意复杂的算法代码。开发者可以使用现有的 JavaScript 或 Python 以及其他友好的编程语言,在以太坊上创造出自己想要的应用。

智能合约(Smart Contract)

 

第三个概念是智能合约(Smart Contract)。智能合约的理念并不新鲜,最早是由密码学家尼克・萨博(Nick Szabo)在 1995 年时候提出的,几乎与互联网同时出现,指的是由计算机程序定义并自动执行的承诺协议。虽然说它的理念提出已经由来已久,但是,直到以太坊的出现,智能合约才被广泛应用。一个重要原因是因为之前缺乏能够一个友好的、可编程的基础系统。

 

有了智能合约,任何人都能够在以太坊上创建自己想要做的去中心化的应用了。智能合约在以太坊上一旦被创建之后,就无需中间机构参与,就能自动执行,并且没有人能够阻止其运行。在以太坊上的智能合约,能够控制区块链上各种数字资产,进行复杂的算法和操作。

 

举个例子:我们经常乘坐飞机会购买飞机延误险,但是真正延误之后,你可能还要拨打客服电话了解流程、在线下开证明、找保险公司,才能执行完你的延误险赔付。这时候,如果有了智能合约,输入条件,连线航班数据,就能够确保保险公司在航班延误之后就自动为你打款了。合约的执行不需要第三方参与,是自动执行,是不是大大提高了社会经济活动的效率了呢?

 

在以太坊区块链上,你可以编写资产的代码,创建新的区块链资产,简单地说,你可以发行你自己的区块链代币,你使用什么样的发行机制、代币叫什么名字、发行多少数量、怎么样去发行都由你来决定,听起来是不是很有意思呢?同时,你也可以通过编写智能合约的代码,来创造非区块链资产的功能,比如投票、对赌、条件合同等等。

 

因为要支持智能合约,所以以太坊上有两种类型的账户地址:一种叫普通账户,一种叫合约账户。普通账户和比特币网络的账户差不多,合约账户主要用于智能合约。

 

好了,我们回顾一下这节课。我们介绍了第二类区块链项目智能合约平台,代表项目以太坊,我带你学习了以太坊的起源、版本迭代、重要的名词。

以太坊由俄罗斯开发者 Vitalik 在 2013 年创建的,它针对比特币区块链系统缺少图灵完备等缺点,以太坊建立了一个可编程、图灵完备的区块链,它帮助人们更方便地实现生产各类数字资产,更精确地控制区块链资产的状态。

以太坊的发展规划了 4 个阶段,分别是:前沿、家园、大都会、宁静。

「前沿」是以太坊的最初版本,只有命令行界面,主要使用者是开发者;

第二个版本「家园」增加了类似 Windows 系统那样的图形界面,普通用户也可以方便地体验以太坊的功能;

第三版本「大都会」加入了一个像谷歌浏览器那样的浏览器,除了使用方便之外,它还拥有一个强大的应用商店,可以安装插件实现更多功能。第三个版本有望在 2017 年年底发布出来;

第四个版本「宁静」目前还没有确定发布时间,预计它会将前三个版本采用的工作量证明 (PoW) 共识机制切换到混合的共识机制。

在说了 4 个以太坊版本之后,我们还学习了三个以太坊重要概念:「以太币」、「以太坊虚拟机」和「智能合约」,它们分别是以太坊系统中的代币、以太坊系统的运行环境和以太坊所代表的区块链项目。了解这些概念能帮助我们更好地学习以太坊。

在代币上,以太坊与比特币的最大的不同是它们的产量和总量的问题。比特币的产量每 4 年减半,而以太币的产量则是固定的。比特币的产量我们知道是 2100 万枚,而以太币的总量到底是多少呢?这是一个有意思的故事,让我给你慢慢道来。

以太坊发行总量 = X+0.99X+0.99X

在 2014 年的时候,以太坊团队讨论后做了这样一个规定:以太坊先进行预售,预售结果是多少,我们就将其定为一个基准数,来规定以太坊发行的总量和每年的产量。

假设在第一次预售中,预售了 X 枚以太坊,那么就会有另外 0.99X 会新增出来分配给在预售之前参与开发的早期贡献者,另外一个 0.99X 以太坊新增发行出来分配给长期项目研究者。故,在预售期就会有 X+2*0.99X 枚以太坊被发行出来了。

以太坊每年的发行量 = 0.26X

在以太坊发行预售之后,会采用工作量证明机制 PoW 来进行挖矿,它们规定每年发行的以太币数量是 0.26X。那么,这样的话就通过预售的这个 X 基准数决定了整个以太坊的总量和发行数量。

我们来去算一下,经过 2014 年 7 月 42 天的预售后,以太坊团队一共筹集了 31531 个比特币,按照当时的价格是 1843 万美元,成为当时第二大的币众筹项目。当时出售的这个 X 的数量是 6 千万左右(60102216 个以太币),也就是说在在预售阶段,就会有 6 千万 + 2*0.99*6 千万(60102216+60102216*0.99*2=72002454),大约是 7200 万枚以太币就被发行出来了。

那么在以太坊上线之后,每年会有多少以太币会被挖矿挖出来呢?那么,每年会有 6 千万 * 0.26(60102216*0.26=15626576),大约是 1 千五百六十万左右的以太币会被矿工所挖出。听到这么多数字,你是不是有点晕呢?不用怕,课后对了文字内容看一遍,你很快就会理解的。

那么,我们接着往下聊。你可能会好奇:每年产生那么多以太币,矿工要怎么分呢?按照区块平分吗?当然不是了。

以太坊的奖励机制:区块奖励 + 叔块奖励 + 叔块引用奖励

在讲怎么分配之前,这里要给你讲一个概念,以方便你的理解,就是以太坊区块链里的 “叔块” 的概念,叔叔的「叔」。“叔块” 和 “父块” 概念是相对的。父块就是当前这个区块的上一个区块,这个比较好理解。叔块是什么意思呢?叔叔是父亲的兄弟,那么叔块也是父块的 “兄弟区块”。

其实,以太坊的区块出块时间间隔非常短,只有 12 秒。我们知道 12 秒竞争记账,然后账本之间的同步,这么短的时间很容易出现分叉,矿工一时分不清哪个链是最长链,跟着非最长链后面记账的情况也是时有发生的。

在比特币网络中,分叉出来的非最长链的区块叫 “孤块”,孤块是没有新生的比特币奖励的。但是对于快速出块的以太坊来说,如果孤块没有任何奖励,就会大大降低矿工们挖矿的积极性,因为挖到 “孤块” 的概率也是非常大的。如果不给他们奖励的话,矿工的积极性就会收到影响,还会引发一定的社区混乱。所以在以太坊的区块链中,矿工们挖到了孤块,也是会获得区块奖励的,孤块很快就成为叔块,所以,以太坊网络还规定,每个区块对最近的 2 个叔块进行引用,每引用一个叔块的,将会得到一定的(1/32)的区块奖励,最多引用 2 个。

所以,以太坊区块的奖励会分给挖出区块的矿工,也会分给挖出孤块的矿工,加上前面说的预售的币和分给团队的币,组成了以太坊所有代币分配的构成。

这里我们不难发现,以太坊的总量在进入第四版本宁静之前,都是每年递增的,直到最后一个版本发布之后,才会恒定不变。

 

以太坊的技术参数

我们再来看看一些其他技术参数的对比。比特币的核心算法是 SHA256,以太坊的核心算法是 Ethash。区块的时间是比特币每 10 分钟出一个区块,而以太坊是 12 秒到 15 秒出一个区块。比特币区块的奖励目前是 12.5 个 / 每区块,以太坊是每个区块奖励 5 个以太坊。从挖矿的收益角度,比特币矿工的收益包括挖矿的奖励以及在区块中的交易所产生手续费,而以太坊就复杂的多,除了和比特币一样挖矿的新生币奖励和手续费之外,还包括叔块奖励和引用叔块奖励。这里我们就要说到 Gas 这样的东西,其实在以太坊当中,所有智能合约的运行是需要花费一定的费用的,这个费用就是用 Gas 去计费的。这里还要回过头来说那个 Gas 的概念,你还记得 Gas 是什么吗?Gas 是智能合约的开发者运行和建立智能合约所需要的花费,它是用以太坊来兑换的,这个 Gas 最终就是要交付给矿工的。就是说,开发者们在运行一个智能合约时需要向网络支付矿工一定的 “手续费”,不过智能合约的手续费是由 “Gas” 完成的,这个 Gas 用以太币来兑换的(区块网络中每个 Gas 的平均价格是 0.000000022 个以太币)。

 

以太坊智能合约运用与被关注

因为以太坊的区块链语言是图灵完备并且可编程的,所以有较好的使用基础,因此在区块链的应用开发上,很多企业和开发者选择了以太坊区块链作为底层技术。以太坊从 2015 年 7 月上线到 2017 年 9 月份,短短的 2 年时间,全球已有 300 多个以太坊应用诞生。在以太坊上构建的应用,大多数应用的市值也都排在了数字资产市值的前列。截止 2017 年 9 月,Coinmarketcap 排名前 40 的市值,以太坊的应用已经达到 10 个。比如去中心化的预测平台 Augur,还有全球算力 P2P 市场的 iEx.ec、用于分布式算力应用平台的 Golem、用于黄金交易的 DigixDAO 等等,这些都是基于以太坊平台构建起来的。可见以太坊作为基础的应用,已经在全球逐步的风靡起来。

 

2017 年 2 月 18 日企业以太坊联盟成立,成员包括摩根大通、芝加哥交易所集团、纽约梅隆银行、汤森路透、微软、英特尔、埃森哲等全球巨头,创始成员超过 30 家。随着 2017 年 5 月 22 日三星、丰田等巨头的加入,联盟队伍再次壮大,这将提升以太坊在区块链上的安全、拓展性等等,使之更符合企业对以太坊区块链技术的需求,并使之逐渐走向成熟。2017 年 5 月,联合国开始测试以太坊项目,并用于发放各国救援资金。2017 年 6 月 5 日,俄罗斯总统普京会见维塔里克・布特林(Vitalik Buterin),共同探讨区块链在俄罗斯的应用。2017 年 8 月,俄罗斯国家开发银行宣布与以太坊达成战略合作。

 

在另外一个方面,在 2017 年春季,美国证券交易委员会默默启动了对以太坊 ETF 的评估流程,研究是否批准以太坊的 ETF。每一份 ETF 份额相当于一个 ETH 市值,投资目标是 ETH 的价格,获批之后将可以在二级市场进行交易,成交的价格有可能会等于、高于或者低于份额的净值,这也是以太坊 ETF 首次政府的评估,和比特币类似。

 

太坊 ETH 和以太坊经典 ETC

再来说说以太坊分叉,以太坊 ETH 和以太坊经典 ETC。你可能会特别奇怪,为什么会有这两个东西发生呢?以太坊的创始人 Vitalik 为什么会亲自主持升级分叉,并且来进行分叉呢?为什么还会有人同意有人不同意,并且导致了硬分叉走了这么久并且还能并存这么久?其实,这恰好反映了去中心化社区的特点。在这个社区中,每个成员都有表达自己意志的权力和能力。2016 年 4~6 月,以太坊网络上规模最大的一次众筹项目 The DAO。DAO 是 Decentralized Autonomous Organization 的缩写,意思是去中心化自治组织。这个项目募集到了超过 1.5 亿美元的资金。然而,接近尾声时,The DAO 被黑客攻击了,近 6000 万美元的以太币被黑客盗走。此后,经过一系列争论,以太坊社区最终做出投票表决,大部分参与者同意更改以太坊代码,希望将资金从攻击者黑客那里夺回来。2016 年 7 月 20 日,以太坊的硬分叉实施。以太坊开发团队修改了以太坊软件的代码,在某一个区块上(第 1920000 区块)把 The DAO 被黑客转移走的资金都退了回来,从而让黑客在原链上偷走的资金又重新回到了投资者的口袋里。

 

然而这一举动被另一部分人认为失去了去中心化的意义,不同意进行升级,仍然在原来的那条区块链上进行继续挖矿,由新的开发团队主导,于是就形成了我们今天看到的局面。

 

目前 ETC 的开发团队和社区也在计划升级 ETC 区块链,将会支持零知识证明,同时计划将 ETC 的总量由每年定量发布,改为像比特币一样,总量恒定、定期减产;ETC 总量不超过 2.1 亿个,每 500 万个区块减量 20%。在区块链的研发上,计划采用 Java 语言,区别于 ETH。

以太坊的基本参数、以太坊的发展现状以及 ETH 和 ETC 的知识。通过本节课的学习,我们知道以太币的数量以及以太币的分配。在第四个版本之前,以太币的数量逐年增加,当以太坊进入到第四个阶段后,共识机制改变,每年新发行的以太币的数量还会再次发生改变,它的总量不是固定不变的。

以太坊 ETH 和以太坊经典 ETC,就是因为太坊社区去中心化的特点,在众筹项目 The DAO 被黑客攻击丢失大量资金之后,一部分人同意更改以太坊代码将资金从黑客手中夺回来,另外一部分不同意更改,就形成了今天这样分裂的局面。

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.