区块链2.0:以太坊应用开发指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-04 05:09:42

点击下载

作者:赵其刚,陆斌,赵其国

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

区块链2.0:以太坊应用开发指南

区块链2.0:以太坊应用开发指南试读:

前言

PREFACE

当我第一次听到“区块链”这个词的时候,非常好奇怎么会有这么一个古怪的名字。在查阅相关资料,了解这个词背后的含义时,我也仅有如下模糊的印象:区块链是比特币背后的一种技术,相较于“人工智能”“深度学习”“大数据”“工业4.0”等目前流行的新技术,这是很让人费解的一个技术概念。

2017年年初,在四川奥游创世科技公司的推动下,我们研究院和奥游公司合作成立了“区块链技术研究中心”,开始了我们团队对区块链技术的深入研究。在推进区块链技术研发的过程中,我们深感国内有关区块链实践资料的匮乏,目前市场上可见的区块链书籍多以概念、理论为主,而网络上所查找的资料又过于零碎。为指导研究中心技术人员的技术开发工作,同时也为了帮助广大区块链技术研究“新人”避免一进入这个领域就迷失在繁杂、新奇的技术术语中,我们觉得很有必要把我们所知道的,以及我们实践所得的各种区块链项目开发经验进行系统总结,帮助技术人员快速熟悉区块链技术概念并展开相关的应用开发。我们以此为动力开始了本书的编写。

在区块链技术资料的分析研究中,有几个问题一直在我的脑中萦绕:“我们为什么需要区块链?”“区块链的本质是什么?”“区块链适用于哪些地方?”对这几个问题的正确理解无疑有助于人们消除对区块链的过度追捧,并能在适当的时间、适当的场景选用合适的区块链解决方案,既不轻忽其意义,又不盲目认为其无所不能。“区块链绝对不是为计算效率而生。”这是应用区块链的一大禁忌。基于P2P网络,大盘的网络节点保存同一份数据,执行同样的运算,而且浪费大量电力去解与计算结果几乎毫无关系的数学难题,这其实是低效的甚至是浪费的。因此,如果想追求高效计算的场景和计算成本极度敏感的场景,看到区块链还是绕道而行吧。

但为什么需要区块链呢?要回答这个问题,可以从了解区块链的技术体系开始。以代表着当前区块链先进技术架构与体系的区块链二代技术——以太坊为例:以太坊通过6层技术体系,以非对称加解密、散列计算为基础,确保同一网络的区块数据的唯一性、一致性与不易篡改性;以P2P协议为基础,在没有中心化平台的参与及在节点自由进出的环境下,实现网络中所有节点数据的同步和相互服务,并确保不依赖于中心平台网络的可靠性与稳定性;通过复杂和高成本的共识与激励机制,保证新封装进链的区块数据的唯一性与高可靠性。

以太坊通过这么多复杂技术、机制的集中应用,采用如此高昂的计算代价究竟解决了什么问题呢?分析以太坊基础网络各层技术方案,我们似乎可以得到这个答案:以太坊基础网络所集中解决的问题,是不依赖于垄断、权威的第三方平台,在高度崇尚开放的互联网环境下的“信任”问题。“信任”是什么?在现实社会中,人与人、人与组织、组织与组织、人与社会、人与国家,每天人们都在为这复杂的“信任”网络努力工作,花费了大量的时间、金钱与精力,可以说“信任”是人类社会关系运行最重要的基础和最昂贵的东西之一。

互联网是一个什么样的世界呢?万物互联、从未谋面、瞬息参与。在传统模式的互联网世界,人和物之间直接建立“信任”是非常困难的,因此,长期以来仍需依赖线下世界的权威、官方、品牌来背书。这种在互联世界必须借助第三方平台来建立信任的模式,实质上通过互联网的“放大”效应变相地加剧了这些中心化平台的垄断、封闭与不均衡。这种状态实质上与互联网崇尚开放的精神背道而驰。回归互联网原旨精神,在不依赖第三方平台的条件下,区块链正在力图解决互联社会关系中的“信任”问题。这让互联网不再单单是一个可自由传递“信息”的网络,而成为一个可以自由承载“信任”及“价值”传递的平台。

在信息技术的应用历史中,长期以来人们都聚焦于一个问题——效率。无论是各类信息系统,还是当前的“物联网”“大数据”“人工智能”,其核心都专注于提升人们的“生产力”。而区块链则是在关注另一个重大课题:在开放的互联网社会中,在不依赖于第三方平台的条件下,如何构建可信的社会关系。

基于这个认识,我们团队对区块链作了一个定义:区块链是互联世界构建信任的技术基础设施。这里“互联世界”指明了区块链应用的环境是正蓬勃发展的互联网社会,特别是在不依赖于垄断、权威、封闭的第三方中心化平台下开放的互联网社会关系,“信任”是区块链旨在解决的核心课题,“技术基础设施”则是区块链的本质属性。

有了如上的定义与认识,将不难推导出区块链可以应用的领域:以“信任”为基础,反垄断、反封闭、反权威,需要开放,要求规则透明、智能运行的社会关系管理,即可通过区块链在互联网中映射,从而在互联网世界重构人类社会中已形成的各种社会关系,如经济合约、经济组织关系和社会组织关系等。

基于这些应用领域的项目的共同特点是需要有高度透明的运行机制、正确无误的智能执行、消费者的广泛参与及自由进出等。区块链,作为一种可以解决互联网世界可信社会关系的技术基础设施,正可以满足这些应用领域的需求,因而区块链也正展示其光明的应用前景和可观的社会经济价值。

因而,本书在系统阐释区块链二代技术——以太坊开发原理及方法的同时,也重点介绍几个基于智能合约的应用案例。为帮助广大读者全面了解区块链及其应用,我们特作以下说明。(1)关于比特币、以太币等“虚拟币”。目前我国政府已明文规定“虚拟币”不具有法定货币的地位,因此,通过智能合约构建的无价值依托的“虚拟币”不得从事以人民币为对手的交易活动。使用智能合约以实体或数字资产为价值依托所创建的“虚拟币”,仅是实体或数字资产在区块链网络中的价值“符号”代表,其价值载体必须是实体或数字资产本身。(2)关于股权众筹。本书仅介绍区块链当中的众筹智能合约的技术方法,包括技术方案、代码原理等,不涉及其相关的金融应用。在实际应用中,如果项目涉及股权众筹融资,是必须要得到相关监管部门批准的,但据我们所知,目前市场上还未有一家获得此牌照。因而,若项目涉及实际的金融应用,敬请留意国家关于股权众筹的相关政策法规。成都高新信息技术研究院赵其刚 博士2017年9月18日CHAPTER 1区块链概论

数字经济之父唐塔普斯科特(Don Tapscott)提出“不是机器人,不是大数据,甚至不是人工智能,而是区块链将引发人类第四次工业革命,并重新定义互联网甚至人类社会”。1.1 区块链概念及应用

尽管“区块链”很像是在2016年由于比特币在世界范围内引起剧烈争议而突然产生的一个技术术语,但实际上,区块链从技术理论的提出,到今天的区块链2.0,已经历二十多年的发展。1.1.1 区块链发展历程

早在1991年,斯图尔特·哈伯(Stuart Haber)和史葛托尔内塔(W.Scott Stornetta)就在论坛中提出了关于区块的加密保护链产品。之后,分别由罗斯安德森(Ross J.Anderson)与布鲁斯·施奈尔(Bruce Schneier)、凯尔西(John Kelsey)在1996年和1998年发表相关产品。尼克·萨博(Nick Szabo)在1998年进行了“虚拟币”分散化的机制研究,他将其命名为比特金。2000年,斯特凡·康斯特(Stefan Konst)发表了加密保护链的统一理论,并提出了一整套实施方案。

2008年爆发全球金融危机,当时有人用“中本聪”的化名发表了一篇论文,描述了“比特币”的产生模式。2009年,比特币诞生,其到2140年将达到2 100万个的总量上限,现在被挖出的比特币总量已经超过1 200万个。目前各国政府对待比特币的政策区别较大,在我国比特币不具有法定货币的地位,只是一种特定的虚拟商品。它对社会的贡献和价值主要在于其通过实践验证了其背后的支撑技术——区块链。

2014年,维塔利克·布特瑞(Vitalik Buterin)、加文伍德(Gavin Wood)和杰夫瑞·威尔克(Jeffrey Wilcke)开始开发下一代区块链平台——以太坊(Ethereum),其目标是创建可基于该平台执行可编程的、具有图灵完备的智能合约代码。智能合约的支持是以太坊相对比特币来说最核心的创新之一,并为区块链创造了广阔的应用前景。因此,区块链也由一个互联网普通用户使用的“虚拟币”支撑技术演变为受到IBM、微软、谷歌等互联网界豪门争相研究与布局的互联网技术“新贵”。

2015年,IBM的Linux基金会推出了“开放账本项目(Open Ledger Project)”,埃森哲(Accenture)、澳新银行、思科、第一信贷、德意志交易所、DAH数字资产控股、DTCC、富士通、IC3、英特尔、摩根大通、伦敦证券交易所集团、三菱UFJ金融集团、R3、State Street、SWIFT、VMware和富国银行加入了该计划。

2016年,俄罗斯联邦中央证券存管机构(NSD)宣布了一个基于区块链技术的试点项目。许多在音乐产业中具有监管权的机构开始利用区块链技术建立测试模型,用来征收版税和进行世界范围内的版权管理。

自2016年10月我国工业和信息化部发布《中国区块链技术和应用发展白皮书(2016)》及2016年12月区块链被作为战略性前沿技术、颠覆性技术写入国务院发布的《“十三五”国家信息化规划》以来,区块链日益受到我国政府的重视和关注,各地政府纷纷出台有关区块链的政策指导意见及通知文件,比如2017年6月,贵阳市人民政府办公厅印发了《关于支持区块链发展和应用的若干政策措施(试行)的通知》,山东省市北区人民政府印发了《关于加快区块链产业发展的意见(实行)》,2017年11月,重庆市经济和信息化委员会发布《关于加快区块链产业培育及创新应用的意见》等,甚至多个省份将区块链列入本省“十三五”战略发展规划。

到今天,区块链已经成为与“物联网”“云计算”“大数据”“人工智能”等互联网技术热点并驾齐驱的互联网技术“新贵”。1.1.2 区块链的概念

目前有关区块链尚无统一和权威的定义,对区块链的公开解释主要是从其技术特征角度进行描述,并有狭义与广义之分。

1.区块链的狭义解释

区块链是一种块链式的数据结构,区块之间按照时间顺序相连,通过密码学方式保证数据不易篡改和不易伪造,并在网络所有节点进行分布式存储的共享账本。可见,狭义的区块链特指区块链技术 体系中特殊的技术组成部分——具有“区块”+“链”结构的分布式账本,但是,狭义的区块链并不能完整描述区块链的技术体系,因而有了广义区块链的描述。

2.区块链的广义解释

区块链是利用块链式共享账本来验证与存储数据、利用P2P分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动执行的脚本代码组成的智能合约来编程和操作数据的一种全新的分布式计算可信网络或计算公证网络。从广义区块链的描述可知,目前对区块链的解释是用区块链技术体系中比较特殊的组成部分“共享分布式账本”来构建一个全新的计算架构与技术体系。

对以“人”为中心的人类社会而言,技术是一种手段。区块链究竟解决了互联世界的什么问题?其本质是什么?能在哪些场景为人类服务?这是研究和发展区块链技术的几个根本问题。只有非常清楚区块链技术背后的本质和意义,才能在区块链的创新、应用与技术开发过程中不致盲目跟风或迷失方向。

从现有的区块链概念描述和技术体系中,可以知道区块链各层技术都围绕如下几个核心特征工作。(1)去中心化。区块链基于P2P网络,使用分布式计算和存储,网络中的节点具有相同的权利和义务,区块链数据由具有维护功能的节点来自动共同维护。去中心化网络架构使区块链在节点自由进出的环境下,脱离了对第三方平台的依赖。(2)数据不易篡改。区块链数据一旦经过验证并添加至区块链,就相当于是永久存储,数据的稳定性和可靠性极高。若想修改区块链中的数据,只在单个或少数节点上进行修改是无效的,必须同时控制51%以上的网络节点(算力或权重)才行,而这对已经取得广泛分布性的区块链网络来说几乎是不可能的。因而,相对于传统技术架构的网络,区块链中的数据因其不易篡改而更为安全可靠。(3)自治性。区块链基于算法与机制,由软件与机器自动实现协商一致的规范和协议,使系统中的节点能够在不依赖对“人”的信任环境下相对自由安全地交换数据,使得对“人”的信任改成了对机器和数学算法的信任。(4)开放性。区块链的数据、机制甚至其实现的源代 码对所有人公开,任何人都可以通过公开的接口查询区块链数据、机制,并能开发相关应用,因而区块链系统是信息高度透明的系统,这确保互联网用户得以平等地参与。(5)匿名性。区块链用户使用账户与密钥基于本地区块链客户端存取数据,由共识机制选定节点统一向区块链加入区块数据,所存取数据通过P2P网络同步实现全网用户间的交互。用户间的交易基于加密账户而无须公开身份,并且交易地址无法跟踪,用户可匿名参与区块链的各类应用,用户隐私得以保护。

可见,区块链通过一系列的技术措施,目的是确保在开放的互联网络中,在不依赖第三方平台,甚至不需要参与者身份的条件下,进行“可信”的信息与价值传递。这能降低社会关系中构建“信任”的成本,因为这些“信任”不再依赖于权威与垄断的第三方,人们也就不需要为累积“信任”耗费大量的时间、金钱与精力。所以说,区块链通过数学证明、规则公开、信息透明、中立机器等技术机制与设施向人类社会提供了另外一条构建“信任”的思路:若人们相信“人”与“人类的机构”的代价太高,为何不可考虑相信“成本低廉且规则透明、确定执行的机制和中立公平的信息机器”呢?

基于上述对区块链应用本质的认识,下面给出区块链的定义:区块链是互联网世界构建信任的技术基础设施。对于这个定义,有如下延展说明。(1)区块链的应用场景与前提是在人类社会的发展中影响越来越大的互联网虚拟世界,在这个世界中普通用户是主人,未来普通用户的世界就是人类社会的世界。(2)现实社会关系将不断在互联网虚拟世界中投射与重构,开放的互联网原旨精神将持续优化和升级人与人之间的各种社会关系。(3)支持“信任”是区块链技术在互联网虚拟世界中的核心使命与价值本质。(4)技术基础设施是区块链的本质属性。1.1.3 区块链的应用

了解区块链的应用本质,就能较容易地理解区块链的典型应用场景。

1.金融领域

金融领域是区块链较早应用的领域,目前应该说已取得了初步成功,可以预见未来还将在各个领域、各个国家产生更多的基于区块链具有不同影响的金融衍生品。特别是区块链的去中心化、去信任等特征,将推动互联网金融的发展。

2.保险行业

一方面诸如医疗信息、个人征信数据引入并存储于区块链,并将成为每一个人的数字身份,这些数据真实可信,不易篡改,实时同步,终身有效,这将为投保人的风险管理带来巨大价值;另一方面,区块链智能合约的支持可实现不依赖于人的自主投保和智能赔付,这可以极大地提升保险机构的运行效率并降低成本。

3.物联网与共享经济

在区块链物联网中可以为每一个物理设备分配地址,并结合物联网设备为该地址注入一定的费用,可以执行相关操作,从而达到物联网的应用,如PM2.5监测点数据获取、服务器租赁、网络摄像头数据调用、DNS服务器等。同时,通过物联网将现实物质世界与区块链所构建的虚拟社会有效连接在一起,从而更 大范围地推动社会运行效率与共享经济的发展。

4.法律行业

基于区块链数据的不易篡改性,可将各类认证、所有权证和证书如房屋产权、土地所有权、承包权、文凭等基于区块链登记、查询,并能实现所有权、使用权的高效鉴别与快速流转。

5.文化艺术行业

针对如音乐、字画等任何类型的艺术品,可基于区块链进行数字形式发布,艺术家们可以使用区块链技术来声明所有权,发行可编号、限量版的作品,以数字加密形式保护和流转。

6.房地产行业

基于区块链让整个产业链流程实现自动化、智能化,解决产业链中每个参与者在房地产开发、运营、使用,以及产权交易、租售中的各种关系,包括命名过程、土地登记、代理中介、产权交易、房屋出租等。1.1.4 区块链不适用场景及风险

在区块链概念盛兴的时候,技术人员需要保持冷静,区块链的技术特征决定了其并非万能。由于区块链基于P2P网络,需要全网络所有节点保存同一份数据,执行同样的运算,而且如采用工作量证明(POW)共识机制还要浪费大量电力去解与计算结果几乎毫无关系的数学难题,这种计算效率其实是低效的,且浪费严重。因此,至少如下场景不适合采用区块链。(1)在需要高效计算的场合,并不适宜采用区块链,如对计算速度要求极高的科学计算,大规模数据统计、分析与挖掘,人工智能学习与模型训练等。(2)对计算和应用部署成本敏感的应用,如一般性的信息发布、展示或宣传,不适宜采用区块链。(3)在需要系统封闭运行并独自拥有的场合,如各类机构、企业的私有系统,也不适宜采用区块链。

区块链之所以能立足于互联网中作为建立“信任”的基础设施,其核心原因在于其技术体系和机制保证了高可靠性与高安全性,但是,正如曾经指出基于以太坊The DAO项目九大漏洞并随后应验的美国著名计算机专家、康奈尔大学助理教授额明·昆(Emin Gün Sire)所讲:“区块链最终会拥有伟大的前景,但在此之前会面临很多失败。”具体的区块链项目在实际的运行中仍然可能面临不可小视的安全风险,正如The DAO项目所展示的那样:这些安全问题往往不是区块链的技术体系与机制本身的问题,而是人们自身疏忽或对网络安全漠视的问题。1.2 区块链2.0:以太坊

区块链1.0主要是“虚拟币”的相关应用;区块链2.0是以太币与智能合约相结合,实现除金融领域外更广泛的场景和流程应用,其典型代表有以太坊、超级账本,其中以太坊由于对智能合约近乎完美的支持,而被称为“全球计算机”。1.2.1 区块链2.0特征

区块链2.0实现了智能合约的功能,从而使区块链系统具有图灵完备的计算能力,可以在区块链上传和执行应用程序,并且程序的有效执行能得到保证。相对于区块链1.0,区块链2.0有如下优势。(1)支持智能合约。区块链2.0定位于应用平台,在这个平台上,可以发布各种智能合约,并能与其他外部IT系统进行数据交互和处理,从而实现各种行业应用。(2)交易速度更快。通过采用实用拜占庭容错(PBFT)、权益证明(POS)、分布式权益证明(DPOS)等新的共识机制,区块链2.0的交易速度有了很大的提高,峰值速度已经超过了3 000TPS(每秒处理交易数量),远远高于区块链1.0的5TPS,已经能够满足大部分的金融应用场景。(3)支持信息加密。区块链2.0因为支持完整的程序运行,可以通过智能合约对发送和接收的信息进行自定义加密和解密,从而达到保护企业和用户隐私的目的,同时零知识证明等先进密码学技术的应用进一步推动了其隐私性的发展。(4)绿色环保。为了维护网络共识,比特币使用的算力超过122 029 TH/s,相当于5 000台天河2号A运算速度,每天耗电超过2 000MWh。区块链2.0采用PBFT、DPOS、POS等新共识机制的客户端,将不再需要通过消耗算力达成共识,使其能绿色环保地部署。1.2.2 以太坊及关键支撑技术

以太坊是区块链2.0的代表,由1994年出生的程序员维塔利克·布特瑞带头创建,该平台可以通过编程来执行任意复杂度的计算,因此可支持诸多去中心化应用场景,很多分布式应用均可基于该平台来开发和部署。作为一个支持各类去中心化应用开发的基础性平台,以太坊当前受到区块链业界非常广泛的关注和重视,是目前区块链应用开发领域中最耀眼的明星之一。

以太坊沿用了区块链1.0中已实践证明行之有效的技术与机制,如非对称加解密、散列(Hash)计算、共识机制、P2P协议等,另外也加入了一些自身的独到创新,如虚拟机、智能合约。以太坊所采用的关键算法及技术如下。

1.非对称加解密

非对称加解密算法包括两个密钥:公开密钥和私有密钥。公钥与私钥是一对,如果用公钥对数据进行加密,只有对应私钥才能解密;如果用私钥对数据加密,那么只有对应公钥才能解密。加密和解密使用的是两个不同的密钥,这种算法称为非对称加解密算法。

非对称加解密算法实现机密信息交换的基本过程:甲方生成一对密钥并将其中的一个作为公用密钥向其他方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一个专用密钥对加密后的信息进行解密。区块链中使用非对称加解密来建立用户的账户,并对交易和消息签名和签收。

2.散列算法

散列算法是一种单向密码体制,它是一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。散列函数可以将任意长度的输入经过变化后得到固定长度的输出。散列函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。散列算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为散列值。散列值的数据是唯一的,且通过极其紧凑的数值来表示。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的散列都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的散列值可以检验数据的完整性。

散列算法在区块链中获得了广泛的应用,如区块、交易的编号(地址)和内容验证、共识机制中挖矿节点对随机数的搜索与区块散列验证。常见的散列算法有SHA1、SHA256、SHA512,在以太坊中就运用了SHA256。

3.P2P网络

P2P网络,即对等计算机网络,是一种在对等者(peer)之间分配任务和工作负载的分布式应用架构,是对等计算模型在应用层形成的一种组网或网络形式。网络的参与者共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力、打印机等),这些共享资源通过网络提供服务和内容,能被其他对等节点直接访问而无 须经过中间实体。在此网络中的参与者既是资源、服务和内容的提供者(Server),又是资源、服务和内容的获取者(Client)。

区块链网络就是一个P2P网络,每个区块链网络节点就是一个Peer。

4.共识机制

共识机制是区块链事务达成分布式共识的数学算法,由于点对点网络下存在较高的网络延迟,各个节点所观察到的事务先后顺序不可能完全一致。因此,区块链系统需要设计一种机制对在差不多时间内发生的事务的先后顺序进行共识。这种对一个时间窗口内的事务的先后顺序达成共识的算法被称为“共识机制”。区块链常用的共识机制主要有工作量证明(POW)和权益证明(POS)两种。

POW:具有算法简单,容易实现,节点间无须交换额外的信息,破坏系统需要投入极大的成本等优点,但也具有浪费能源、区块的确认时间难以缩短、容易产生分叉、需要等待多个确认等缺点。

POS:将POW中的算力改为系统权益,拥有权益越大则成为下一个记账人的概率越大。这种机制的优点是不像POW那么费电,但也具有容易产生分叉、需要等待多个确认、需要检查点机制来弥补最终性等缺点。DPOS在POS的基础上,将记账人的角色专业化,先通过权益来选出记账人,然后记账人之间再轮流记账。

5.以太坊虚拟机

以太坊虚拟机(Ethereum Virtual Machine,EVM)是由以太坊客户端软件提供的具有完整系统功能,可灵活支持各类去中心化应用的代码执行环境。它可以执行任意复杂度的算法代码,因而在计算机科学术语中,以太坊是图灵完备的。开发人员能够使用编程友好的高级语言,如类JavaScript和Python,创建运行在以太坊虚拟机上的应用程序。此部分内容将在第2章进行详细介绍。

6.智能合约语言——Solidity

Solidity是以太坊中用于编写智能合约的面向对象的程序设计语言。Solidity可用于各类区块链平台智能合约的实现编程。由加文·伍德(Gavin Wood)、克瑞斯·锐伟斯勒(Christian Reitwiessner)、亚历克斯·柏瑞扎兹(Alex Beregszaszi)、姚奇·哈瑞(Yoichi Hirai)和几个前以太坊核心人员创建。Solidity是一种类JavaScript语言,编码风格与JavaScript的类同,支持图灵完备的程序代码设计。1.2.3 以太坊:区块链2.0工业开发标准

目前区块链2.0的技术架构主要有以太坊和Linux基金会于2015年发起的超级账本(Hyperledger)。以太坊由于技术架构的清晰定义、行业的广泛支持与生态系统的成熟,已逐步成为区块链上的工业开发标准,是区块链从业者应该首选的学习内容之一。

从体系结构上来看,以太坊共包括6层结构,如图1.1所示。

1.数据层

以太坊数据层是一个“区块”+“链”的数据结构,本质是一个分布式区块链,以非对称加解密、散列计算等技术为基础,确保一个区块链数据账本决定一个网络,每个区块链的数据不易篡改。图1.1 以太坊体系结构

2.网络层

以太坊网络层遵循P2P协议,确保网络的开放和稳定服务,互联网用户的自由、平等参与和区块链数据的同步等。

3.共识层

共识层决定区块链的记账权获取机制。采用POW,电脑的性能越好,封装区块越容易成功并获得“虚拟币”奖励;采用POS,类似股份公司股权的概念,会根据持有的“虚拟币”数量和时间,由“股权”拥有者按其“权益”比例获得区块封装权利,并根据封装区块获得挖矿奖励。

4.激励层

激励层即以太坊的挖矿机制,是对为网络提供计算及验证服务的矿工的奖励措施。当前以太坊对成功封装并被网络确认一个区块的奖励是系统通过增发授予矿工5个“虚拟币”,同时矿工获得当前区块所有交易所发送的燃料。此外,以太坊对成功挖矿并成功封装区块但未被纳入主链的“叔区块”也有奖励,奖励金额为正常区块的87.5%。

5.合约层

在区块链1.0中是没有这一层的(或者这一层功能很弱,仅能执行一些简单功能),所以区块链1.0只能进行“虚拟币”的相关应用,而无法用于其他领域或说是无法进行其他的逻辑处理。合约层的出现,使得在“虚拟币”以外的其他领域使用区块链有了可能,比如用于物联网(IOT)。在以太坊中,本部分包括了以太坊虚拟机和智能合约两个组成部分。

6.应用层

区块链的展示层与业务层,以太坊通过使用Web3等应用接口,使各类应用与区块链集成,区块链的应用层可以是移动端、Web端,或是直接融合进现有的业务服务器,把当前的业务服务器当成应用层。

以太坊通过6层技术架构的清晰分工协作,有效地保证了区块链技术体系的系统性、完整性、灵活性与开放性,将为区块链技术不断发展、演变和广泛应用奠定坚实的基础。1.3 区块链创造历史的机遇

区块链既是一个技术体系,又是一种思维模式、新型软件定义框架与颠覆性的创新机遇。在区块链的创新与应用发展过程中,程序员可以从技术本质上理解区块链。但仅有技术理解和思维是不够的,程序员应该了解和掌握除了技术以外的一些技能,因为区块链的出现让人们面临又一次技术开启历史的机遇与挑战。1.3.1 程序员的区块链思维

在区块链创新应用与开发中,需要坚持区块链思维,区块链思维是有效推进区块链创新工作的核心要义。

去中心化:去中心化是区块链开发者要坚持的一个重要思维习惯。每拿到一个应用项目,首先要思考的问题是:“这个能去中心化吗?”不仅高价值数据资产及相关运算要考虑去中心化,如普通Web数据访问存储在今后也可能是去中心化的,而且在整个项目设计、管理、实施的过程中通过去中心化思考可能还会获得意想不到的新特性、新性能和新应用。

透明开放:坚持机制、规则、代码的透明开放,透明开放是获得更多人积极参与的前提和基础。不要试图黑箱运行高明专利与独门利器,在区块链中会被孤立。

协同合作:不要试图一个人或一个机构独自完成所有工作和享有所有回报,要习惯人与人之间、团队与团队之间协同合作,共襄壮举,共定游戏规则,共获回报,“有钱捧钱场,没钱捧人场”。

相信算法:在区块链,可以相信算法、机制与中立机器。相信机制、规则与社会关系可用算法描述,算法与机器没有偏见,它们可以做得很好,但需要持续发展和优化。1.3.2 用区块链模拟定义社会

在信息化时代,现实世界的许多东西都可以用程序来描述并优化。区块链是描述人类社会关系的一种工具,可以从人类社会的基本单元“人”的描述开始,描述经济关系、社会关系,并进而描述经济组织、社会组织及整个社会。一旦知道了这些关系的描述模型,并掌握了在互联网虚拟世界如何映射的方法,技术人员就知道如何进一步优化和提升它。

表1.1是有关以人为中心的社会关系在区块链中描述的框架要点,本书的第6~8章将给出这些关系描述与实现的典型案例。表1.1 区块链对社会的描述续表

既然区块链能在互联网虚拟世界中重构和定义一个可信的社会,在这个快速传递信息与价值的世界中又将产生多少创新的机遇与挑战呢?1.3.3 挑战传统中心化系统

互联网崇尚开放,反封闭与权威。互联网垄断实质上是与互联网原旨精神高度违背的。互联网形成垄断主要有如下两个原因:①互联网提供了信息自由传输的平台,但同时也是一个信息泛滥和可信度极差的空间,对高度敏感的价值传递及商业交易,人们的信任仍然建立在传统第三方平台的品牌、权威、信誉的基础上;②互联网服务零边际成本扩张的虹吸效应,造成好的越好、差的越差,从而加速行业垄断的形成。

如果说互联网垄断形成的重要原因是在互联网发展历史的某一阶段中,由于缺少在互联网上构建信任的基础设施,使人们不得不借助第三方平台的品牌、权威与信誉来背书,这种信任变相加剧了互联网垄断的形成,那么今天当人们拥有了能够不依赖第三方平台的“信任”基础设施,互联网的垄断格局是否可能重构呢?

区块链的出现,让人们看到这不仅在理念上可行,在实践上也具有现实的可操作性。在电商、即时通信、公共服务,以及各类共享经济领域,基于开放、合作、协同的理念,基于去中心化的“信任”基础设施,为什么就没有这种可行性呢?

这个问题还是留给互联网广大用户和时间来作答吧!思考题区块链为什么较早诞生于金融领域?根据你的理解,区块链将为金融领域带来什么样的影响?如果基于区块链来改造现有中心化平台,所要改造的要点有哪些?结合你所熟悉的中心化平台提出改进方案。CHAPTER 2以太坊工作原理与基础

以太坊不仅结合了区块链1.0的特性和技术,同时也引入了许多新的改进和其自身独有的创新。特别是以太坊引入了支持图灵完备的智能合约,使区块链的适用范围得到了很大的扩展,并因此推动区块链成为一个能支持各类社会关系在互联网中映射和实现这些社会关系智能化的技术基础设施。

对智能合约的引进和支持,使以太坊已远超“虚拟币”的范畴,不再是一个单一的应用,而成为一个公共性的技术基础平台,这个平台就正如前文所提到的是在互联社会构建“可信”社会关系的技术基础。2.1 以太坊工作原理

以太坊要在互联网世界中把原来对人的信任转变为对数学原理、对技术和对机器的信任,显然并不简单,但这是通过一整套清晰、严谨而又复杂的技术体系来实现的。2.1.1 以太坊基本术语

本节主要介绍以太坊中常用的一些专业术语。

区块(Block):由区块头与区块体构成,区块头包括区块描述信息、上一区块的散列值、时间戳等,区块体是该时间段的交易列表数据。

区块链(Blockchain):区块之间通过区块头保存上一区块的散列值,使整个网络的区块数据构成了一个不易篡改的“链”式数据库。

账户(Account):以太坊网络的基础工作单元,包括用户账户(EOA)和合约账户(COA)。用户账户由私钥控制;合约账户由其合约代码控制并且仅能由用户账户触发。

交易(Transaction):区块链数据记录的基本单元,每一次转账行为、创建一个智能合约、调用一次智能合约均构成一个交易,交易需要消耗燃料。

工作量证明(POW):目前以太坊主要采用的一种共识机制。在1.2.2节中已介绍其优缺点,这里重点介绍其运行规则:通过挖矿节点计算数学问题,最先算出的节点获得新区块封装权(即记账权),挖矿成功(即成功封装区块)的节点将获得一定量的“虚拟币”,获得新区块封装权的概率主要取决于挖矿节点在网络中的算力占比。

权益证明(POS):正在发展的一种新的共识机制,也是目前以太坊采用的主要共识机制之一。不由算力来决定记账权,而由节点账户在网络中预先分配的权益大小来决定新区块封装的概率。

智能合约(Smart Contract):一段可以由以太坊虚拟机解释执行的代码,创建时被存储于区块链上并获得一个合约账户(地址),执行时向该账户发送一个交易(即调用该合约,交易中包含有运行合约需要消耗的燃料及输入数据),由以太坊虚拟机调用合约代码执行。

以太币(Ether):以太坊网络的基础“虚拟币”。它是以太坊网络的重要应用之一,也是以太坊网络的一个基础设施,可用于支持以太坊以智能合约为核心的各类应用的燃料消耗。(目前以太币在我国不具备法定货币的地位)

燃料(Gas):以太坊提供了可执行图灵完备计算的智能合约,为避免网络资源被随意浪费、恶意滥用或攻击,要求交易发出账户需要为此次交易中所使用的计算资源消耗燃料。(如不做特殊说明,本书中的燃料均指在区块链上执行操作时所消耗资源的名称)。2.1.2 以太坊工作机制

以太坊继承了区块链1.0的技术特征,如非对称加解密实现不依赖第三方的点对点可信交互,P2P网络实现用户的自由参与和相互服务,共识机制确保全网区块数据的一致性,激励机制激发互联网用户的参与热情。不同的是,以太坊让这些底层的技术转变为基础支撑技术,而不再是支持单一的“虚拟币”应用,因此,以太坊的重点是通过对智能合约及虚拟机的实现来支持开放与灵活的各类区块链应用。

区块链1.0其实就是账户之间的系列转账交易列表,以太坊区块事实上也是记载账户之间的交易列表信息,不同的是以太坊所记录的交易信息内容有了较大的扩展,不仅包括转账信息,还包括智能合约代码信息、输入及计算结果数据等。

对于区块链2.0,在以太坊网络中可跟踪每个账户的状态,区块链上的状态改变就是账户之间相关数值和信息的传输。在以太坊网络上有两类账户:用户账户和合约账户。对大多数用户而言,两类账户之间的主要区别是:自然人用户控制用户账户,因为他们拥有能够控制用户账户的私钥;合约账户由它们的内部代码控制。当然,本质上来讲,合约代码仍然是由自然人用户所控制,因为合约代码由具有确定地址的用户账户触发,而用户账户又由掌握私钥的自然人控制。通用术语“智能合约”指的就是合约账户中的代码程序,当交易消息发送给该账户时可自动运行。用户能够通过在区块链中部署代码创建新的智能合约。

合约账户只能在用户账户发出命令后执行相应操作。因此,合约账户不可能自发地执行随机数发生器或API调用等操作,它只能在用户账户的触发下操作这些功能,合约的执行必须具有确定性,即合约在创建和部署时,技术人员就能确定合约执行的过程及可预期的结果。合约的达成在部署前就已明确,因而要让以太坊节点用户认同计算的结果,就需要严格地保证执行的确定无误。

以太坊引入了可编程的智能合约,这就使以太坊网络可能面临用户无休止循环执行智能合约代码,从而造成网络计算资源巨大浪费并最终崩溃的危险。正如2.1.1节所说,以太坊通过交易有偿计算来解决这个问题。

消耗的以太币由验证网络的节点所收取,这些验证网络的节点被称为矿工,它们在以太坊网络中接收、传播、验证和执行交易。这些矿工把所接收到的交易(包括很多以太坊网络中的账户状态更新)组成所谓的“区块”,然后相互竞争谁的区块能被加入到区块链中作为下一个区块。成功加入区块链下一个区块的矿工将获得以太币。这个激励措施鼓励大家把自身的硬件和电力资源投入到以太坊网络中。

为了实现POW,在区块链1.0中须大规模中心化使用特殊的硬件(如ASICs),而以太坊网络则采用“内存困难”计算问题。如果一个问题既需要内存也需要CPU,理想的硬件将是通用计算机。这个特点使以太坊的POW具有抗ASICs计算的能力,从而使之更具有去中心化的分布式安全能力。2.1.3 以太坊软件架构

以太坊的客户端按照数据层、网络层、共识层、激励层、合约层和应用层等6层构建,所包括的软件模块如图2.1所示。

以太坊的矿工(Miner)在一个分布式的网络(Network)中进行着挖矿操作,就是实现POW(或者POS)的一个共识算法过程。网络的同步(Sync)是指各矿工共识过程同步,共识后产生的新区块链(Blockchain)形成的最新账本也需要通过同步模块在各节点间实现数据同步。每产生一个新的区块(Block),需要通过共识过程对区块验证(Blockvalidator),即需要散列计算验证、签名、定序等。因此,区块链、共识机制、矿工、网络是以太坊产生和维护区块链的核心部件。

以太坊平台上的各种去中心化应用,需要编写并部署智能合约代码。智能合约代码通过以太坊虚拟机调用和解释执行,处理区块链与共识的相关事务,同时基于RPC协议(一种用于规范网络从远程计算机程序上请求服务的协议)进行挖矿和网络层事务的交互,从而实现各种交易如转账等具体应用。图2.1 以太坊软件架构2.2 以太坊客户端与网络

作为去中心化网络,以太坊的客户端基本代表了以太坊的全部。以太坊客户端既是客户端又是服务器,无数个对等的客户端组成以太坊网络。客户端既直接面向客户提供各种接口的相互操作,又与网络中的其他客户端形成P2P网络,实现区块链数据同步、执行共识机制、参与挖矿等。2.2.1 各类以太坊客户端

在以太坊项目的初期,不同操作系统上有多个客户端项目,这些客服端采用了不同的编程语言并具有不同的接口特点,但基于同样的协议,可以在同一个网络中交互和共生。多种客户端的出现实质上是以太坊网络繁荣的标志,同时也验证了以太坊黄皮书(以太坊所公开的有关以太坊原理及协议的详细说明文件)中所定义的以太坊协议的可靠性。以太坊始终对新的创新保持开放,并确保参与的每个应用开放透明。

目前以太坊支持的客户端有go-ethereum、Parity、pyethapp和cppethereum等。处于领先地位并被广泛应用的客户端是go-ethereum和Parity,这两个分别由以太坊基金会(Ethereum Foundation)和Ethcore支持,代表了以太坊非常高的水平,其中go-ethereum客户端应用非常广,Parity也因为一些显著的特征,如运行速度快、支持POS共识机制等,受到用户广泛的欢迎。2.2.2 以太坊虚拟机

以太坊虚拟机是以太坊客户端的重要组成部分。以太坊本身其实是一个可编程的区块链,具体是通过在客户端嵌入支持智能合约代码解释执行的以太坊虚拟机来实现的。不同于直接向用户提供一套已预先定义好的操作功能(如“虚拟币”的转账交易),以太坊允许用户根据自身的需求与意愿自行创建各种复杂度的操作功能。基于这个能力,以太坊在很多不同类型的去中心化区块链应用(包括但不限于加密“虚拟币”)中转变为一个平台。基于该平台,用户可以灵活创建各类基于公共账本的去中心化应用。

以太坊数据库的维护和更新由连入网络的很多节点共同完成。网络中的每个节点都运行以太坊虚拟机和执行相同的命令。这也是以太坊被称为“全球计算机”的主要原因。

这种跨整个以太坊网络的巨大并行计算,其目标并不是让计算更加高效。事实上,以太坊上的计算相对传统计算机上的计算更慢、更贵。以太坊上的每个节点均运行以太坊虚拟机是为了在整个区块链上达成共识。去中心化共识让以太坊具有了容错能力极强、零停机时间、放在区块链上的数据不易篡改等特性。

以太坊平台本身是无状态、无特定应用的,或者可以说是“中性”的。类似于程序设计语言,它是由企业家和开发人员来决定其具体用途的。但是,只有一些特定类型的应用可以受益于以太坊的特殊能力,特别是以太坊适合节点间自动直接支付应用或者保证跨网络的群体行动能协调一致等应用场景,比如协调点对点市场的应用,或者复杂金融合约的自动化执行等。

理论上,各种复杂度的金融交易或交换都能够通过使用运行在以太坊上的代码实现。除了金融应用,在其他需要信任、安全和持久性的场景,如财产登记、投票、监管和物联网等,都可能受到以太坊的巨大影响。2.2.3 以太坊网络

以太坊网络是由很多运行以太坊客户端的节点构成的P2P网络,这些节点将维护和保证区块链数据安全,维护网络的稳定,执行以大坊分布式共识机制,向以太坊用户提供可持续服务。

当前绝大部分以太坊项目直接采用以太坊公有链网络(简称公有网络),因为这个链上已聚集了大量的用户、网络节点和“虚拟币”。但是,也有一些场景需要用以太坊客户端来搭建以太坊私有链网络(简称私有网络)和以太坊联盟链网络(在一群相互可信的联盟伙伴之间构建)。在垂直领域,一定数量的企业如银行就把以太坊作为它们自身私有链的一个基础网络平台。

基于以太坊客户端可以搭建3种不同类型的以太坊网络,这3种不同网络的主要区别如下。

1.公有链

公有链是一种世界上任何人均可以查看、发送交易并记录符合规则的交易,均可以参与共识过程(共识过程决定哪个区块加入链,由此决定当前区块链的状态)的一种区块链。作为一个中心化或半中心化的替代者,公有链由加解密算法来保证其安全性,经济激励和加解密算法组合使用POW或POS机制,遵循的原则是参与者在共识过程中所具有的影响力与其在网络中所承担的经济性资源(计算能力)成正比。这样的区块链通常被认为是“完全去中心化”的。以太坊的主网络(Mainnet)及测试网络(Testnet)均属于公有链,主网络是以太坊的实际运营网络,测试网络则有Morden(已停止运行)、Ropsten、Kovan和Rinkeby等,各有不同特点及测试目标。

2.联盟链

联盟链是一种由预先选定节点决定共识过程的区块链。比如,一个由20个银行机构所构成的联盟,每个机构运行一个节点,每个有效区块要求至少其中12个节点签证。查看区块链的权利可以是公共的或者仅限于参与机构,同时也有混合权限情况,如区块的根散列是公共的,而其余部分则需要通过联盟机构所设置的API授权查询。联盟链是一种半中心化的网络,需要在联盟成员之间达成共识,具有中心化平台和区块链的一些综合特点。当前公有链所表现出来的一些问题,如块链过大、交易确认时间过长、拥塞、专业化服务等问题,使服务于专业化、行业化、领域化的联盟链受到诸多机构和组织的特别关注。联盟链的行业应用、专业化应用具有广阔的应用前景,需要得到人们的重视。

3.私有链

私有链的块链写入权由中心化节点或一个组织所控制,块链查询权是公共的或受到不同程度的限制。数据库管理、审计等应用作为一个企业的内部操作,在很多情况下是不必让公众查看的,当然在一些场景下,公共审计特性也很有必要。私有链一般应用于开发测试环境或运营方的客户具有较大数量的公众用户,需要借助区块链来保存用户的重要数据资产(如游戏币),或者借助区块链的分布式运行特征来保证网络服务的可靠性。采用封闭的私有链来提供服务与传统的中心化平台提供服务,对用户而言并无任何本质的不同,在技术上也没有特别明显的优势。因此,目前除了构建研究和测试网络需要,在实际的运营网络中使用私有链并没有让人看到特别有价值的商业动机。2.3 账户与智能合约

账户(地址)在以太坊网络中扮演着非常核心的作用,其数学基础是非对称加解密机制形成的一对公私钥,用公钥来生成用户的账户(地址),用私钥来对用户所发出的数据进行签名并接收发送给其账户的数据。

智能合约是以太坊在区块链上的重要创新,其实质是以账户为基础,存储在账户存储空间中的可由以太坊虚拟机解释执行的一段代码。2.3.1 以太坊账户

如前文所述在以太坊网络中有两类账户:用户账户和合约账户,通常说的账户所指的是用户账户,用户账户由用户自主创建,并通过持有私钥而掌握账户的所有权,合约账户归属于创建自身的用户账户。以太坊把用户账户与智能合约均称为账户是因为二者均为状态对象,用户账户记录用户账户余额,智能合约记录账户余额、合约代码与数据内容。所有账户的状态就是以太坊网络的状态,这些状态由全网已达成共识的新区块来保持不断更新。

如果把以太坊限制在仅提供用户账户以及基于用户账户之间的转账交易,那么所获得的仅是一个“虚拟币”系统,其功能不会比区块链1.0更强大,因为这个系统将只能在用户之间进行“虚拟币”转账。

账户代表外部代理(如自然人、挖矿节点、自动代理)的身份,它使用私钥加密去鉴证每个交易,这样以太坊虚拟机就能安全地通过公钥识别每个交易发送者的身份(账户或地址)。2.3.2 密钥文件

每个账户有一对密钥,一个为私钥,一个为公钥。账户由其地址索引,地址取自其公钥的最后20字节。由私钥和地址形成的密钥对均被编码和存放在一个密钥文件中,密钥文件采用JSON文本文件格式,人们可通过文本编辑器打开和浏览。密钥文件的关键部分——私钥通过在创建账户时输入密码来加密保护。密钥文件Keyfiles可在以太坊节点数据目录中的子目录Keystore中找到。

一个新建立的以太坊账户中是没有任何“虚拟币”的,这需要用户通过挖矿获得。如没有密钥和密码,任何人都不能进入某个账户进行任何操作。在以太坊节点之间传输整个目录及个人密钥文件均不影响账户的安全。

用户要确保经常备份Keyfiles以保证账户安全,丢失密钥文件或丢失密码即意味着丢失账户及账户上的“虚拟币”,任何人都无法帮用户找回。所以在以太坊的“虚拟币”增发中,已考虑到有的用户可能因丢失账户而导致丢失“虚拟币”,因此“虚拟币”增发量已把这个部分损耗作为增发考量因素。2.3.3 智能合约

智能合约是存储在以太坊网络特定地址的一组代码(函数)和数据集。合约账户能够相互发送消息并具有图灵完备计算能力。合约在区块链上用以太坊特定的二进制格式即以太坊虚拟机字节码的形式存在,由以太坊虚拟机解释执行。

智能合约一般采用如Solidity这样的高级语言来编写,然后编译成字节码加载到区块链上。智能合约也可以用其他语言编写,比较有名的有Serpent和LLL。

下面是用于编写以太坊智能合约的几种不同的高级语言。(1)Solidity

Solidity是一种用于开发智能合约并编译成以太坊虚拟机字节码的类JavaScript语言,是以太坊非常著名的旗舰语言。

可以在Solidity的官方网站找到Solidity语言的以下资源:

● Solidity Documentation(Solidity 文档);

● Solidity online realtime compiler(Solidity在线实时编译器);

● Standardized Contract APIs(标准化合约APIs)。(2)Serpent

Serpent是一种用于编写智能合约并编译成以太坊虚拟机字节码的类Python语言,其目标是提供一种简洁、可兼具低级语言的高效率与高级语言的易于使用两者特性的语言,同时它还为合约编程增加了一些特定领域的特殊功能。(3)LLL

类Lisp语言(Lisp Like Language,LLL)是一种与汇编语言类似的低级语言,这意味着它非常简洁,基本上就是直接在以太坊虚拟机字节码基础上进行简单包装而形成的一种语言。2.4 以太币

正如前文所说,以太币是以太坊网络的基础“虚拟币”,主要用于支持以太坊以智能合约为核心的各类应用。而智能合约通过以太坊矿工节点的以太坊虚拟机执行各种智能合约代码,则需要向矿工节点发送以太币,其过程是交易发送者为每次交易用以太币获得燃料,用户发送交易、创建合约或调用合约执行,系统把封装成功的区块中所有交易消耗燃料的总量用以太币的形式发送给挖扩成功的矿工。2.4.1 以太币的面值

以太坊“虚拟币”具有一个面值体系作为以太币的计量单位。每个面值具有其独有的名字(其中一些来源于在计算机科学和加密经济学中具有重要贡献的精英人物的姓氏名字)。以太币的最小面值或基本单位叫作“wei”。表2.1所示为各个面值的名字及其与“wei”之间的换算关系。在很多情况下,“ether”也是以太币的一个重要计量单18元(1ether=10wei)。在使用以太币计量单位时,一定要注意不要发生混淆,特别是以太币的名称不是像很多人错误地认为叫以太坊(Ethereum),单位也不是ethereum。表2.1 以太币面值换算2.4.2 燃料和以太币

要在以太坊公有网络中部署智能合约应用,发布者需要拥有以太币。以太币的获取途径有多种,比如成为一名以太坊矿工,使用以太坊钱包Mist(Beta 6以上版本)等软件获取以太币的相关接口等。

以太币的重要功能是用于换取燃料,燃料是使用以太坊网络资源

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载