
Discord 培训课程
从0到1构建Discord社群Discord是一款专为社群设计的免费网络实时通话软件与数字发行平台,主要针对游戏玩家、教育人士、朋友及商业人士,用户之间可以在软体的聊天频道通过消息、图片、视频和音频进行交流。这款软件可以在Microsoft Windows、macOS、Android、iOS、Linux和网页上运行(包括Firefox浏览器、Google Chrome与Opera电脑浏览器)。软件起源Discord 的概念由创建了手机游戏社交网络平台OpenFeint的杰森·施特朗构思得出。他在2011年将 OpenFeint 以1.04亿美元的价格卖给了GREE[21],并用这笔钱在2012年创建了游戏开发工作室 Hammer & Chisel。[22]他们的第一个游戏是于2014年发布的永恒命运,施特朗预计这款游戏将成为移动平台上的第一个多人在线战斗竞技场游戏,不过由于受欢迎程度较低他们并没有成功。然而在开发过程中,为了开发出更好的游戏,施特朗注意到他的团队在尝试玩其他热门游戏如最终幻想XIV和英雄联盟时遇到了困难,并特别强调了在网络实时通话方面存在较严重问题。一些网络实时通...

吾国教育病理
由中国著名社会学专家——郑也夫先生著于 2013 年 。此书反当时不涉病灶 、 不究病理 , 治标不治本的教育论述 。直指中国教育的病因 , 直陈其解决之道 , 言辞犀利 ,一针见血 , 穷根问底 , 论据详实 。 既呈现了对教育病理的追问 , 也体现了对当下国情的关怀 。“写作这本书的动力是愤懑 , 一个超龄愤青的双重愤懑之情 。 愤懑之一是对中国教育走 到这步田地 , 搞成这幅模样;之二是目睹管理者解答中国教育困境之弱智 。 ”这是此书前言部分的开篇 , 郑也夫先生用极其犀利的言辞来说明写此书的原因 。 这是我在市面上看到少数 , 能有如此犀利的言辞之书出版 , 估计也是现在为什么停版 , 不再印刷的原因!所以 , 我花了高于此书 3 倍的价格 ,从市场买来了别人读过的二手原著 ,看完之后大呼过瘾 , 一点也不觉得亏!本书主要分为两大篇幅 、 十四章内容 , 上半篇名为“分流” , 下半篇名为“放权” ,上下两篇各七章 。这是作者对中国教育病理提出的核心药方:一方面是从学生教育分流机制出发 ,另一方面是呼吁减少行政对教育的干预 。两大篇幅的阐述 , 遵循“寻找真问题——解释其...

web3赛道指南
Web 3.0 技术发展现状。在“认识 Web 3.0”这个模块里,我会为你阐述基于公链、账户和身份认证技术的组合,并会带你了解如何构建 Web 3.0 的新型基础设施,以此实现理解 Web 3.0 技术基础逻辑的目标。探究:Web 3.0 新玩法与新物种。在这里,你可以了解到 DeFi 是如何通过和传统金融的结合,实现进一步的扩张的;NFT 作为新型的数据确权制度,是如何打造“数字版迪士尼”的;新的去中心化应用,是如何在游戏、商业、社交等领域开创新的商业模式的;以及 DAO 是如何打造“工具 + 社群”新业态的。洞悉:Web 3.0 未来应用趋势。在区块链之外,人工智能、物联网等数据技术,是如何与 Web3.0 结合为互联网带来新的发展空间的?传统互联网公司、政府部门、金融机 构、投资机构,会如何融入 Web 3.0 实现自我升级?在“风险与机会”这个模块里,你会通过我的梳理,参透“上车”的主要路径和避免踩坑的几种逻辑。去中心化实际上是一种协调机制,去中心化也分不同程度。 要想搞清楚是什么推动了 Web 3.0 的诞生,我们要回到互联网的发展历程和现状中来。我们知道,互联网的发...
It is better to manage the army than to manage the people. And the enemy.

Discord 培训课程
从0到1构建Discord社群Discord是一款专为社群设计的免费网络实时通话软件与数字发行平台,主要针对游戏玩家、教育人士、朋友及商业人士,用户之间可以在软体的聊天频道通过消息、图片、视频和音频进行交流。这款软件可以在Microsoft Windows、macOS、Android、iOS、Linux和网页上运行(包括Firefox浏览器、Google Chrome与Opera电脑浏览器)。软件起源Discord 的概念由创建了手机游戏社交网络平台OpenFeint的杰森·施特朗构思得出。他在2011年将 OpenFeint 以1.04亿美元的价格卖给了GREE[21],并用这笔钱在2012年创建了游戏开发工作室 Hammer & Chisel。[22]他们的第一个游戏是于2014年发布的永恒命运,施特朗预计这款游戏将成为移动平台上的第一个多人在线战斗竞技场游戏,不过由于受欢迎程度较低他们并没有成功。然而在开发过程中,为了开发出更好的游戏,施特朗注意到他的团队在尝试玩其他热门游戏如最终幻想XIV和英雄联盟时遇到了困难,并特别强调了在网络实时通话方面存在较严重问题。一些网络实时通...

吾国教育病理
由中国著名社会学专家——郑也夫先生著于 2013 年 。此书反当时不涉病灶 、 不究病理 , 治标不治本的教育论述 。直指中国教育的病因 , 直陈其解决之道 , 言辞犀利 ,一针见血 , 穷根问底 , 论据详实 。 既呈现了对教育病理的追问 , 也体现了对当下国情的关怀 。“写作这本书的动力是愤懑 , 一个超龄愤青的双重愤懑之情 。 愤懑之一是对中国教育走 到这步田地 , 搞成这幅模样;之二是目睹管理者解答中国教育困境之弱智 。 ”这是此书前言部分的开篇 , 郑也夫先生用极其犀利的言辞来说明写此书的原因 。 这是我在市面上看到少数 , 能有如此犀利的言辞之书出版 , 估计也是现在为什么停版 , 不再印刷的原因!所以 , 我花了高于此书 3 倍的价格 ,从市场买来了别人读过的二手原著 ,看完之后大呼过瘾 , 一点也不觉得亏!本书主要分为两大篇幅 、 十四章内容 , 上半篇名为“分流” , 下半篇名为“放权” ,上下两篇各七章 。这是作者对中国教育病理提出的核心药方:一方面是从学生教育分流机制出发 ,另一方面是呼吁减少行政对教育的干预 。两大篇幅的阐述 , 遵循“寻找真问题——解释其...

web3赛道指南
Web 3.0 技术发展现状。在“认识 Web 3.0”这个模块里,我会为你阐述基于公链、账户和身份认证技术的组合,并会带你了解如何构建 Web 3.0 的新型基础设施,以此实现理解 Web 3.0 技术基础逻辑的目标。探究:Web 3.0 新玩法与新物种。在这里,你可以了解到 DeFi 是如何通过和传统金融的结合,实现进一步的扩张的;NFT 作为新型的数据确权制度,是如何打造“数字版迪士尼”的;新的去中心化应用,是如何在游戏、商业、社交等领域开创新的商业模式的;以及 DAO 是如何打造“工具 + 社群”新业态的。洞悉:Web 3.0 未来应用趋势。在区块链之外,人工智能、物联网等数据技术,是如何与 Web3.0 结合为互联网带来新的发展空间的?传统互联网公司、政府部门、金融机 构、投资机构,会如何融入 Web 3.0 实现自我升级?在“风险与机会”这个模块里,你会通过我的梳理,参透“上车”的主要路径和避免踩坑的几种逻辑。去中心化实际上是一种协调机制,去中心化也分不同程度。 要想搞清楚是什么推动了 Web 3.0 的诞生,我们要回到互联网的发展历程和现状中来。我们知道,互联网的发...
It is better to manage the army than to manage the people. And the enemy.

Subscribe to leaf

Subscribe to leaf
Share Dialog
Share Dialog


<100 subscribers
<100 subscribers
以太坊的主要工作原理就是接受账户发出的交易,更新它们的状态,然后维持该状态,直到另外的交易更新它们为止。在以太坊上,整个交易接受、执行和写入的流程分成两个阶段。以太坊接受交易和交易执行并写入账本之间是解耦的。对于去中心化和分布式架构来说,这种解耦才能够有效地支撑系统正常运行。
区块链主要有以下三种用途。
·信任:区块链可以用于创建去中心化应用,实现数据由多人集体控制,其中的任何一个人都没有权力去更改或删除以前的记录。即使有人确实做到了,他产生的数据也不会被其他参与者接受。
·自治性:对于区块链上的应用来说,没有唯一的所有者。由于没有唯一的所有者,也就没有人能够单独控制它,但是每个人却都可以通过它的行为来参与治理过程,这就有利于建立一个不能被操控或不易诱发腐败的解决方案。
·去中介化:基于区块链的应用能够消除现有流程的中间环节。例如在车辆登记、驾照发放等场景中,一般会存在一个中间角色,它承担着车辆登记和驾照发放的职责。如果基于区块链来设计流程,那么这个中间角色就没有存在的必要了,因为区块链上的数据在被确认后,驾照就会自动签发,车辆就会被自动登记。区块链将开启一个新的时代,很多业务不再需要中间的权威机构进行背书了。
密码学是一门科学,它将易懂的、直白的内容转换成秘密的、隐藏的、无意义的内容,同样道理,解密就是反过来操作。加密技术有助于传输和保存数据,而且不能轻易地解密。
在计算机领域有两种类型的加密技术:对称加密和非对称加密。
·对称加密和解密:对称加密指的是在加密和解密过程中使用同一个密钥。如果使用这种技术交换信息,那么,这意味着很多人将使用同一个密钥。
·非对称加密和解密:在加密和解密过程中使用两个密钥。任一密钥都可以用于加密和解密。使用公钥加密的信息,可以使用私钥解密。使用私钥加密的信息,可以使用公钥解密。下面用一个例子来说明,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美元。
这就是最简单的合约。
如图所示是一个智能合约模型示意,其中各组成部分的定义如下。
①合约参与者:执行智能合约的相关参与者。
②合约资源集合:智能合约执行涉及的参与者资源,比如参与各方账户、拥有的数字财产等。
③自动状态机:智能合约下一步执行的关键,包括当前资源状态判断、下一步合约事务执行选择等。
④合约事务集合:智能合约的下一步动作或行为集合,控制着合约资产并对接收到的外界信息进行回应。

编写智能合约的工具有很多种,如: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让发布过程变得简单了,但是系统后台还是执行了很多程序。了解这些步骤有助于我们更好地掌控发布过程。

①自动化维度。智能合约可以自动判断触发条件,从而选择相应的下一步事务;而传统合约需要人工判断触发条件,在条件判断准确性、及时性等方面均不如智能合约。
②主客观维度。智能合约适合客观性请求的场景,传统合约适合主观性请求的场景。智能合约中的约定、抵押及惩罚需提前明确;而主观性判断指标很难纳入合约自动机中进行判断,也就很难指导合约事务的执行。
③成本维度。智能合约的执行成本低于传统合约,合约执行权利、义务条件被写入计算机程序中自动执行,在状态判断、奖惩执行、资产处置等方面均具有低成本优势。
④执行时间维度。智能合约属于事前预定、预防执行模式;而传统合约采用的是事后执行,根据状态决定奖惩的模式。
⑤违约惩罚维度。智能合约依赖于抵押品、保证金、数字财产等具有数字化属性的抵押资产,一旦违约,参与者的资产将遭受损失;而传统合约的违约惩罚主要依赖于刑罚,一旦违约,可以采用法律手段维权。
⑥适用范围维度。智能合约技术可全球采用,适用于全球范围;而传统合约受限于具体辖区,不同国际地区的法律、人文等因素均影响着传统合约的执行过程。
第一步是使用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值、达成共识时的时间戳以及其他描述信息;同时区块链最重要的信息是带有一组已经达成共识的合约集;收到合约集的节点,都会对每条合约进行验证,验验证通过的合约才会最终写入区块链中,验证的内容主要是合约参与者的私钥签名是否与账户匹配。

步骤③“区块链构建的智能合约自动执行”的过程,包括如下步骤:
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网络接入。
目前存在多种语言编写的以太坊客节点和客户端工具,包括:Go、C++、Python、javaScript、Java和Ruby等。这些功能不受语言限制,开发者可以选择最适合自己的。本书使用Go语言,它被称为Geth,可以作为客户端连接到公共的和测试的网络上,它也可以在私有网络上运行挖矿和EVM(交易节点)。
Geth是使用Go语言编写的命令行工具,可以使用它在私有网络上创建节点和矿工。Geth可以在Windows、Linux和Mac环境下安装。
在搭建私有网络前,需要下载和安装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(以前叫作: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是Geth安装包的一部分,现在已经脱离了Geth的安装过程,需要自行安装。Solidity编译器被称之为solc,可以使用npm命令进行安装:
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可以在https://github.com/ethereum/mist/releases网站下载。用户需要根据自己的情况选择一个合适的安装包(在本例中,我们是在windows 2016环境下,所以,下载的是Ethereum-Wallet-win64-0-9-2.zip),下载后解压缩。解压后,文件如下图所示,双击Ethereum Wallet图标。
Mist就会启动。Mist具有一定的智能性,如果本地运行了一个私有链,它就会识别到并连接上去。如果本地没有任何私有网络,它就会连接到主网或Rinkeby测试网络。
在本书中,前面已经搭建了一个私有网络,下图则显示了其连接的情况:
一旦连接成功,就可以与以太坊网络进行交互、发送和接收以太币、部署智能合约、调用智能合约里面的函数。
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被黑客攻击丢失大量资金之后,一部分人同意更改以太坊代码将资金从黑客手中夺回来,另外一部分不同意更改,就形成了今天这样分裂的局面。
以太坊的主要工作原理就是接受账户发出的交易,更新它们的状态,然后维持该状态,直到另外的交易更新它们为止。在以太坊上,整个交易接受、执行和写入的流程分成两个阶段。以太坊接受交易和交易执行并写入账本之间是解耦的。对于去中心化和分布式架构来说,这种解耦才能够有效地支撑系统正常运行。
区块链主要有以下三种用途。
·信任:区块链可以用于创建去中心化应用,实现数据由多人集体控制,其中的任何一个人都没有权力去更改或删除以前的记录。即使有人确实做到了,他产生的数据也不会被其他参与者接受。
·自治性:对于区块链上的应用来说,没有唯一的所有者。由于没有唯一的所有者,也就没有人能够单独控制它,但是每个人却都可以通过它的行为来参与治理过程,这就有利于建立一个不能被操控或不易诱发腐败的解决方案。
·去中介化:基于区块链的应用能够消除现有流程的中间环节。例如在车辆登记、驾照发放等场景中,一般会存在一个中间角色,它承担着车辆登记和驾照发放的职责。如果基于区块链来设计流程,那么这个中间角色就没有存在的必要了,因为区块链上的数据在被确认后,驾照就会自动签发,车辆就会被自动登记。区块链将开启一个新的时代,很多业务不再需要中间的权威机构进行背书了。
密码学是一门科学,它将易懂的、直白的内容转换成秘密的、隐藏的、无意义的内容,同样道理,解密就是反过来操作。加密技术有助于传输和保存数据,而且不能轻易地解密。
在计算机领域有两种类型的加密技术:对称加密和非对称加密。
·对称加密和解密:对称加密指的是在加密和解密过程中使用同一个密钥。如果使用这种技术交换信息,那么,这意味着很多人将使用同一个密钥。
·非对称加密和解密:在加密和解密过程中使用两个密钥。任一密钥都可以用于加密和解密。使用公钥加密的信息,可以使用私钥解密。使用私钥加密的信息,可以使用公钥解密。下面用一个例子来说明,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美元。
这就是最简单的合约。
如图所示是一个智能合约模型示意,其中各组成部分的定义如下。
①合约参与者:执行智能合约的相关参与者。
②合约资源集合:智能合约执行涉及的参与者资源,比如参与各方账户、拥有的数字财产等。
③自动状态机:智能合约下一步执行的关键,包括当前资源状态判断、下一步合约事务执行选择等。
④合约事务集合:智能合约的下一步动作或行为集合,控制着合约资产并对接收到的外界信息进行回应。

编写智能合约的工具有很多种,如: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让发布过程变得简单了,但是系统后台还是执行了很多程序。了解这些步骤有助于我们更好地掌控发布过程。

①自动化维度。智能合约可以自动判断触发条件,从而选择相应的下一步事务;而传统合约需要人工判断触发条件,在条件判断准确性、及时性等方面均不如智能合约。
②主客观维度。智能合约适合客观性请求的场景,传统合约适合主观性请求的场景。智能合约中的约定、抵押及惩罚需提前明确;而主观性判断指标很难纳入合约自动机中进行判断,也就很难指导合约事务的执行。
③成本维度。智能合约的执行成本低于传统合约,合约执行权利、义务条件被写入计算机程序中自动执行,在状态判断、奖惩执行、资产处置等方面均具有低成本优势。
④执行时间维度。智能合约属于事前预定、预防执行模式;而传统合约采用的是事后执行,根据状态决定奖惩的模式。
⑤违约惩罚维度。智能合约依赖于抵押品、保证金、数字财产等具有数字化属性的抵押资产,一旦违约,参与者的资产将遭受损失;而传统合约的违约惩罚主要依赖于刑罚,一旦违约,可以采用法律手段维权。
⑥适用范围维度。智能合约技术可全球采用,适用于全球范围;而传统合约受限于具体辖区,不同国际地区的法律、人文等因素均影响着传统合约的执行过程。
第一步是使用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值、达成共识时的时间戳以及其他描述信息;同时区块链最重要的信息是带有一组已经达成共识的合约集;收到合约集的节点,都会对每条合约进行验证,验验证通过的合约才会最终写入区块链中,验证的内容主要是合约参与者的私钥签名是否与账户匹配。

步骤③“区块链构建的智能合约自动执行”的过程,包括如下步骤:
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网络接入。
目前存在多种语言编写的以太坊客节点和客户端工具,包括:Go、C++、Python、javaScript、Java和Ruby等。这些功能不受语言限制,开发者可以选择最适合自己的。本书使用Go语言,它被称为Geth,可以作为客户端连接到公共的和测试的网络上,它也可以在私有网络上运行挖矿和EVM(交易节点)。
Geth是使用Go语言编写的命令行工具,可以使用它在私有网络上创建节点和矿工。Geth可以在Windows、Linux和Mac环境下安装。
在搭建私有网络前,需要下载和安装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(以前叫作: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是Geth安装包的一部分,现在已经脱离了Geth的安装过程,需要自行安装。Solidity编译器被称之为solc,可以使用npm命令进行安装:
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可以在https://github.com/ethereum/mist/releases网站下载。用户需要根据自己的情况选择一个合适的安装包(在本例中,我们是在windows 2016环境下,所以,下载的是Ethereum-Wallet-win64-0-9-2.zip),下载后解压缩。解压后,文件如下图所示,双击Ethereum Wallet图标。
Mist就会启动。Mist具有一定的智能性,如果本地运行了一个私有链,它就会识别到并连接上去。如果本地没有任何私有网络,它就会连接到主网或Rinkeby测试网络。
在本书中,前面已经搭建了一个私有网络,下图则显示了其连接的情况:
一旦连接成功,就可以与以太坊网络进行交互、发送和接收以太币、部署智能合约、调用智能合约里面的函数。
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被黑客攻击丢失大量资金之后,一部分人同意更改以太坊代码将资金从黑客手中夺回来,另外一部分不同意更改,就形成了今天这样分裂的局面。
No activity yet