编辑推荐

适读人群:区块链系统开发人员,以及对开发区块链系统感兴趣的高校师生。

√从技术层面详解区块链平台使用方案

√系统讲解HyperLedgerFabric开源架构的核心概念、架构、实现原理和应用开发

√作者结合实践经验,深度解析常见开发陷阱,并给出具体解决方案,让初学者少走弯路

√手把手引导开发成功落地,以案例为引,从单机单节点到Solo多机组网再到Kafka集群部署,层层深入,教你顺利搭建一个完整的区块链项目

√通过典型案例进行实战演练,每一步均基于真实情况和场景中的操作,真实还原生产场景

内容简介

《HyperLedgerFabric开发实战——快速掌握区块链技术》系统地介绍了超级账本HyperLedgerFabricv1.1架构的设计和应用方法,包括环境及源码部署、Solo多机部署、Kafka集群部署、智能合约编写等。同时,针对第三方可插拔式插件CouchDB实战应用,Java-SDK的应用、编写方案和具体接口执行策略进行了详细讲解。另外,《HyperLedger Fabric开发实战:快速掌握区块链技术》以搭建一个反欺诈区块链平台项目为例进行了实战演练,读者可以快速掌握区块链技术。

《HyperLedgerFabric开发实战——快速掌握区块链技术》适合区块链系统开发人员阅读,需要有一定的面向对象语言的基础,也可供对开发区块链系统感兴趣的高校师生参考。

目录

第1章基本环境部署1

1.1环境整理1

1.2Docker安装2

1.2.1卸载旧版本3

1.2.2在线安装DockerCE3

1.2.3离线安装DockerCE5

1.2.4Docker启动及常用命令5

1.3Docker-Compose安装6

1.3.1在线安装Docker-Compose6

1.3.2离线安装Docker-Compose7

1.4Go语言环境安装8

1.4.1下载Go语言包8

1.4.2配置Go语言环境变量9

1.5本章小结9

第2章Fabric及环境部署10

2.1Fabric介绍10

2.1.1什么是区块链10

2.1.2区块链的作用12

2.1.3超级账本是什么14

2.2Fabric功能汇总16

2.3Fabric组成模型17

2.3.1资产18

2.3.2智能合约18

2.3.3账本特征18

2.3.4隐私频道19

2.3.5成员安全性20

2.3.6共识机制20

2.4Fabric环境部署20

2.4.1Fabric源码安装20

2.4.2下载Fabric镜像22

2.4.3镜像备份和迁移26

2.5本章小结28

第3章End-2-End案例29

3.1平台特定文件29

3.2运行e2e_cli31

3.3e2e_cli案例分析38

3.3.1容器服务脚本38

3.3.2容器启动配置文件52

3.3.3Fabric网络解析55

3.4本章小结62

第4章部署单机多节点网络64

4.1生成证书文件65

4.2部署Orderer节点69

4.3部署peer0.org1节点70

4.4搭建Fabric网络75

4.5初步接触智能合约78

4.6部署peer0.org2节点84

4.7本章小结88

第5章Solo多机部署89

5.1网络拓扑89

5.2部署Orderer节点91

5.3部署peer0.org1节点92

5.4部署peer1.org1节点97

5.5部署peer0.org2节点101

5.6本章小结107

第6章Kafka集群部署108

6.1Fabric账本108

6.2事务处理流程110

6.2.1客户端发起事务111

6.2.2验证签名并执行事务112

6.2.3检查返回协议112

6.2.4客户端将背书合并到交易中113

6.2.5提交并验证事务113

6.2.6账本更新114

6.3读写集规则114

6.4Kafka集群配置116

6.4.1crypto-config.yaml配置119

6.4.2configtx配置121

6.4.3Zookeeper配置125

6.4.4Kafka配置127

6.4.5Orderer配置132

6.5启动集群138

6.5.1启动Zookeeper集群138

6.5.2启动Kafka集群140

6.5.3启动Orderer集群144

6.6集群环境测试146

6.7本章小结158

第7章智能合约159

7.1智能合约概述159

7.2背书策略160

7.3使用智能合约161

7.3.1智能合约是什么161

7.3.2智能合约的生命周期161

7.3.3Packaging(包)162

7.3.4创建package(包)162

7.3.5包签名(Packagesigning)163

7.3.6安装智能合约164

7.3.7智能合约实例化164

7.3.8升级智能合约165

7.3.9停止及启动智能合约166

7.3.10CLI(客户端)166

7.3.11系统智能合约168

7.4编写智能合约168

7.4.1开发人员眼中的智能合约168

7.4.2智能合约接口169

7.4.3一个简单的资产智能合约169

7.5加密智能合约178

7.6系统合约插件180

7.7智能合约API182

7.8Peer节点与合智能约184

7.8.1安装智能合约185

7.8.2实例化智能合约187

7.8.3调用智能合约188

7.8.4列出智能合约190

7.8.5打包智能合约191

7.8.6查询智能合约192

7.8.7签名智能合约包193

7.8.8升级智能合约194

7.9本章小结196

第8章CouchDB197

8.1CouchDB介绍197

8.2启动部署201

8.3索引应用206

8.4查询应用216

8.5选择器语法218

8.5.1基本语法218

8.5.2嵌套对象219

8.5.3运算符219

8.5.4隐式运算符220

8.5.5显示运算符222

8.6本章小结226

第9章Java-SDK客户端227

9.1SDK项目前置条件227

9.2SDK代码使用232

9.2.1Orderers对象233

9.2.2Peers对象235

9.2.3Chaincode对象238

9.2.4FabricUser240

9.2.5FabricStore245

9.2.6FabricOrg250

9.2.7FabricConfig256

9.2.8ChaincodeManager257

9.3SDK使用方法264

9.4本章小结269

第10章项目演练270

10.1反欺诈系统271

10.1.1需求分析271

10.1.2编写合约272

10.1.3线上验证278

10.3本章小结283

精彩书摘

根据前面章节的介绍,知道了Fabric组网过程的第一步是需要生成证书等文件,而这些默认配置信息的生成依赖于configtx.yaml及crypto-config.yaml配置文件。

同样,在采用Kafka作为启动类型的Fabric网络中,configtx.yaml及crypto-config.yaml配置文件依然有着重要地位,且其中的配置样本与先前的内容都会有些不同。

本章是以Kafka集群部署为案例开始讲述,在此之前,请先阅读前面的章节。

在阅读本章的时候会涉及一些概念性问题,这些概念性问题从第3章开始就屡次提及,但第3、4、5章中的目的主要是跑通一个最小单元的Fabric网络,需要读者首先对HyperLedgerFabric的网络进行一次基本的理解,要知晓HyperLedgerFabric网络在实际生产过程中可能应用到哪些场景中。

而本章将开启基于Kafka集群的部署,其中重要的概念是对前三章的总结,也是对本章及后续章节关于智能合约及CouchDB的铺垫。

6.1Fabric账本

1.账本(Ledger)

即所有的状态变更(statetransitions)是有序且不可篡改的。状态变更是由参与方提交的chaincode(智能合约)调用事务(transactions)的结果。每个事务都将产生一组资产键-值对,这些键-值对用于创建、更新或删除而提交给账本。

账本由BlockChain(区块链)(“chain”)组成,区块则用来存储有序且不可篡改的记录,以及保存当前状态的状态数据库(statedatabase)。在每一个Channel中都会存在一个账本。每一个Peer都会维护它作为其中成员的每一个Channel中的本地复制的账本。

2.链(chain)

链是一个事务日志,是一个由Hash链接各个区块的结构,其中每个区块都包含了N个事务的序列。

区块header包含了该区块的事务的Hash,以及上一个区块头的Hash。这样,所有在账本上的交易都是按顺序排列的,并以密码方式链接在一起。换句话说,在不破坏Hash链接的情况下篡改账本数据是不可能的。最近的区块Hash代表了以前的每个事务,从而确保所有的Peers都处于一致和可信的状态。

链存储在Peer文件系统(本地或附加存储)上,有效地支持BlockChain工作负载的应用程序的特性。

3.状态数据库

该账本的当前状态数据表示链事务日志中包含的所有键的最新值。

由于当前状态表示Channel所知道的全部最新键值,因此有时也称为“WorldState(世界状态)”。

在Chaincode调用对当前状态数据执行操作的事务时,为了使这些Chaincode交互非常有效,所有键的最新值都存储在一个状态数据库中。状态数据库只是一个索引视图到链的事务日志,因此可以在任何时候从链中重新生成它。在事务被接受之前,状态数据库将自动恢复(或在需要时生成)。

状态数据库包括LevelDB和CouchDB。LevelDB是嵌入在Peer进程中的默认状态数据库,并将Chaincode数据存储为键-值对。CouchDB是一个可选的外部状态数据库,当所写的Chaincode数据被建模为JSON时,它提供了额外的查询支持,允许对JSON内容进行丰富的查询。

4.事务流(transactionflow)

在高层业务逻辑处理上,事务流是由应用程序客户端发送的事务协议,该协议最终发送到指定的背书节点。

背书节点会验证客户端的签名,并执行一个Chaincode函数来模拟事务。最终返回给客户端的是Chaincode结果,即一组在Chaincode读集中读取的键-值版本,以及在Chaincode写集中写入的键-值集合,返回该Peer执行Chaincode后模拟出来的读写集结果,同时还会附带一个背书签名。

客户端将背书组合成一个事务payload,并将其广播至一个orderingservice(排序服务节点),orderingservice为当前Channel上的所有Peers提供排序服务并生成区块。

实际上,客户端在将事务广播到排序服务之前,先将本次请求提交到Peer,由Peer验证事务。

首先,Peer将检查背书策略,以确保指定的Peer的正确分配已经签署了结果,并且将根据事务payload对签名进行身份验证。

其次,Peer将对事务读取集进行版本控制,以确保数据完整性,并防止诸如重复开销之类的问题。HyperledgerFabric具有并发控制,即事务允许并行执行(通过背书)来增加吞吐量,并且在提交(所有Peer)的情况下,每个事务都经过验证,以确保没有其他事务修改它已经读取的数据。换句话说,它确保了在执行(批准)时间之后读取的数据没有发生变化,因此执行结果仍然有效,并且可以提交到账本状态数据库。如果读取的数据被另一个事务更改,则该区块中的相同事务被标记为无效,并且不应用于账本状态数据库。客户端应用程序被警告,并且可以在适当的情况下处理错误或重试。
……

前言/序言

HyperLedgerFabric最初是由DigitalAsset和IBM公司贡献的、由Linux基金会主办的一个超级账本项目,它是一个目前非常流行并广为人知的区块链网络框架的实现方案。作为一种基于模块化架构开发应用程序或解决方案的基础,HyperLedgerFabric支持如共识和会员服务等即插即用的组件。HyperLedgerFabric利用容器技术来运行称为“chaincode”的智能合约,该合约包含了系统的应用程序逻辑。

为什么写作《HyperLedger Fabric开发实战:快速掌握区块链技术

区块链由于去中心化、开放性、自治性、信息不可篡改及匿名性等特征而受到广泛关注,且目前正处在上升势态。抛开炒作的代币项目,应用于行业联盟链或直接搭建私链的项目,采用HyperLedgerFabric作为底层平台无疑是最好的选择之一。

本人从接触HyperLedgerFabric项目以来,经历了其0.6版本到1.1版本的数次迭代。因为早期中文资料稀缺,并且0.6版本到1.0版本是一个跨度非常大的迭代,导致早期的大部分部署和应用经验失去作用,不得已再次从1.0版本开始从头学习。当时中文资料极为有限,且大多数都是单篇翻译或纯粹的概念讲解,导致我一直没有找到入门的头绪,只能不断地从官方文档中汲取知识,并成功搭建了基于Kafka类型的集群网络。

有了集群的经验,加深了自己对HyperLedgerFabric整个网络事务流程的理解,并以此为基础顺利搭建了基于Fabric-SDK-Java的客户端项目。也就在这个时候,开始有了写相关博客的想法,并在博客园上发布了第一篇博客,也是从零开始系列文章的第一篇,开始介绍自己的开发历程和部署经验,希望能通过这样的方式帮助更多的开发伙伴加入HyperLedgerFabric大家庭。再后来又建立了“区块链学习分享”的微信订阅号,也通过微信号建立了一个纯技术讨论分享的HyperLedgerFabric等区块链相关交流群,并在这样的机缘下结识了电子工业出版社宋亚东老师,并正式开始编写《HyperLedger Fabric开发实战:快速掌握区块链技术》。

在写书之前我一直在梳理博客的内容,为了真实地还原生产场景,还自费租赁了15台服务器用于测试。在已有博文的基础上,外加后来编写的新文档,我比较顺利地完成了《HyperLedger Fabric开发实战:快速掌握区块链技术》的编写工作,且书中的项目都依托于所租赁服务器来完成演练,每一步都基于真实情况和场景中的操作。在此过程中,自己对HyperLedgerFabric也有了新的认识和理解。

HyperLedger Fabric开发实战:快速掌握区块链技术》主要以HyperLedgerFabric案例为引,层层深入,从单机单节点到Solo多机组网再到Kafka集群部署,其中穿插文档讲解加深读者的理解。与一些偏概念性质的区块链教程类书籍不同,我希望能通过《HyperLedger Fabric开发实战:快速掌握区块链技术》帮助读者实现基于HyperLedgerFabric的区块链实践落地。

HyperLedger Fabric开发实战:快速掌握区块链技术》主要内容

HyperLedger Fabric开发实战:快速掌握区块链技术》以干货为主,文档为辅,基于HyperLedgerFabricv1.1版本进行讲解。总计10章,每章主要内容介绍如下:

第1章是基本环境部署,包括内网和外网的不同方案,以及内核处理等。

第2章是HyperLedgerFabric及环境部署,先是用文档讲述了Fabric相关的介绍和主要功能点,接着分析了源码部署和镜像处理方面的问题。

第3章带着读者一步步跑通官方的e2e_cli案例,并在随后对该案例进行了分析。

第4章开始,手动部署一次单机多节点网络。

第5章跟随前章的脚步,手动部署一次Solo多机网络环境。

第6章继续深入,搭建基于Kafka的集群网络。

第7章以文档为主,着重讲解如何编写智能合约及有关智能合约的用法。

第8章详细介绍CouchDB的使用,并推荐使用CouchDB。

第9章讲解在Fabric发布1.0版本之后的对外客户端调用方式、客户端对SDK的使用和相关源码。

第10章以一个简单的案例做演练,在数据链上用到了智能合约,对数据提取则提供了另一种思路。

读者对象

这是一本基础讲解类的书,写《HyperLedger Fabric开发实战:快速掌握区块链技术》是为了帮助更多的新人入门。所以,《HyperLedger Fabric开发实战:快速掌握区块链技术》适合正在寻求HyperLedgerFabric入门的新人阅读,也适合中、高级开发人员用作工具书参考。

在阅读《HyperLedger Fabric开发实战:快速掌握区块链技术》之前,读者需要具备以下基础知识:

√具有一定的Linux操作系统基本命令的常识。

√有Java/Go等面向对象语言的基础,其中智能合约用Go语言编写,SDK则用到了Java。如果有这方面的基础,则有助于阅读《HyperLedger Fabric开发实战:快速掌握区块链技术》。

致谢

在入门及编写《HyperLedger Fabric开发实战:快速掌握区块链技术》的时候,有许多人给予了我鼓励和支持。

首先感谢我的妻子,我在开始学习HyperLedgerFabric时遇到了很多困难,经常熬夜加班,她始终体谅我,鼓励并支持我。在我写书的时候她不遗余力地帮我查阅相关资料以便我能够更顺利地完成书稿。

我还要感谢我的领导,也是我的好友王海林,正是他给了我研究学习HyperLedgerFabric的机会,并在我遇到困难时帮我逐条分析,厘清思路。他也给予了我在公司最大限度的研发条件和时间,让我在最短的时间里完成了一次自我蜕变。

我还要感谢电子工业出版社的宋亚东老师,感谢他一直以来对我的支持和鼓励,感谢在我早期编写书稿的过程中对内容的编排和规范给予了很多帮助。也感谢电子工业出版社所有参与《HyperLedger Fabric开发实战:快速掌握区块链技术》出版工作的老师,是你们的辛勤付出让《HyperLedger Fabric开发实战:快速掌握区块链技术》成功出版。

最后,我要感谢我博客的读者及微信群里的朋友们,正是与你们一次次地沟通和探讨,让我不断提升自我,也鞭策我不断前行。

由于我水平有限,书中不足及错误之处在所难免,敬请专家和读者给予批评指正。

杨毅

2018年5月


其他推荐