√ 从技术层面详解区块链平台使用方案
√ 系统讲解HyperLedger Fabric开源架构的核心概念、架构、实现原理和应用开发
√ 作者结合实践经验,深度解析常见开发陷阱,并给出具体解决方案,让初学者少走弯路
√ 手把手引导开发成功落地,以案例为引,从单机单节点到Solo多机组网再到Kafka集群部署,层层深入,教你顺利搭建一个完整的区块链项目
√ 通过典型案例进行实战演练,每一步均基于真实情况和场景中的操作,真实还原生产场景
《HyperLedger Fabric开发实战——快速掌握区块链技术》系统地介绍了超级账本HyperLedger Fabric v1.1 架构的设计和应用方法,包括环境及源码部署、Solo 多机部署、Kafka 集群部署、智能合约编写等。同时,针对第三方可插拔式插件CouchDB 实战应用,Java-SDK 的应用、编写方案和具体接口执行策略进行了详细讲解。另外,本书以搭建一个反欺诈区块链平台项目为例进行了实战演练,读者可以快速掌握区块链技术。
《HyperLedger Fabric开发实战——快速掌握区块链技术》适合区块链系统开发人员阅读,需要有一定的面向对象语言的基础,也可供对开发区块链系统感兴趣的高校师生参考。
根据前面章节的介绍,知道了Fabric组网过程的第一步是需要生成证书等文件,而这些默认配置信息的生成依赖于configtx.yaml及crypto-config.yaml配置文件。
同样,在采用Kafka作为启动类型的Fabric网络中,configtx.yaml及crypto-config.yaml配置文件依然有着重要地位,且其中的配置样本与先前的内容都会有些不同。
本章是以Kafka集群部署为案例开始讲述,在此之前,请先阅读前面的章节。
在阅读本章的时候会涉及一些概念性问题,这些概念性问题从第3章开始就屡次提及,但第3、4、5章中的目的主要是跑通一个最小单元的Fabric网络,需要读者首先对HyperLedger Fabric的网络进行一次基本的理解,要知晓HyperLedger Fabric网络在实际生产过程中可能应用到哪些场景中。
而本章将开启基于Kafka集群的部署,其中重要的概念是对前三章的总结,也是对本章及后续章节关于智能合约及CouchDB的铺垫。
6.1 Fabric账本
1.账本(Ledger)
即所有的状态变更(state transitions)是有序且不可篡改的。状态变更是由参与方提交的chaincode(智能合约)调用事务(transactions)的结果。每个事务都将产生一组资产键-值对,这些键-值对用于创建、更新或删除而提交给账本。
账本由BlockChain(区块链)(“chain”)组成,区块则用来存储有序且不可篡改的记录,以及保存当前状态的状态数据库(state database)。在每一个Channel中都会存在一个账本。每一个Peer都会维护它作为其中成员的每一个Channel中的本地复制的账本。
2.链(chain)
链是一个事务日志,是一个由Hash链接各个区块的结构,其中每个区块都包含了N个事务的序列。
区块header包含了该区块的事务的Hash,以及上一个区块头的Hash。这样,所有在账本上的交易都是按顺序排列的,并以密码方式链接在一起。换句话说,在不破坏Hash链接的情况下篡改账本数据是不可能的。最近的区块Hash代表了以前的每个事务,从而确保所有的Peers都处于一致和可信的状态。
链存储在Peer文件系统(本地或附加存储)上,有效地支持BlockChain工作负载的应用程序的特性。
3.状态数据库
该账本的当前状态数据表示链事务日志中包含的所有键的最新值。
由于当前状态表示Channel所知道的全部最新键值,因此有时也称为“World State(世界状态)”。
在Chaincode调用对当前状态数据执行操作的事务时,为了使这些Chaincode交互非常有效,所有键的最新值都存储在一个状态数据库中。状态数据库只是一个索引视图到链的事务日志,因此可以在任何时候从链中重新生成它。在事务被接受之前,状态数据库将自动恢复(或在需要时生成)。
状态数据库包括LevelDB和CouchDB。LevelDB是嵌入在Peer进程中的默认状态数据库,并将Chaincode数据存储为键-值对。CouchDB是一个可选的外部状态数据库,当所写的Chaincode数据被建模为JSON时,它提供了额外的查询支持,允许对JSON内容进行丰富的查询。
4.事务流(transaction flow)
在高层业务逻辑处理上,事务流是由应用程序客户端发送的事务协议,该协议最终发送到指定的背书节点。
背书节点会验证客户端的签名,并执行一个Chaincode函数来模拟事务。最终返回给客户端的是Chaincode结果,即一组在Chaincode读集中读取的键-值版本,以及在Chaincode写集中写入的键-值集合,返回该Peer执行Chaincode后模拟出来的读写集结果,同时还会附带一个背书签名。
客户端将背书组合成一个事务payload,并将其广播至一个ordering service(排序服务节点),ordering service为当前Channel上的所有Peers提供排序服务并生成区块。
实际上,客户端在将事务广播到排序服务之前,先将本次请求提交到Peer,由Peer验证事务。
首先,Peer将检查背书策略,以确保指定的Peer的正确分配已经签署了结果,并且将根据事务payload对签名进行身份验证。
其次,Peer将对事务读取集进行版本控制,以确保数据完整性,并防止诸如重复开销之类的问题。Hyperledger Fabric具有并发控制,即事务允许并行执行(通过背书)来增加吞吐量,并且在提交(所有Peer)的情况下,每个事务都经过验证,以确保没有其他事务修改它已经读取的数据。换句话说,它确保了在执行(批准)时间之后读取的数据没有发生变化,因此执行结果仍然有效,并且可以提交到账本状态数据库。如果读取的数据被另一个事务更改,则该区块中的相同事务被标记为无效,并且不应用于账本状态数据库。客户端应用程序被警告,并且可以在适当的情况下处理错误或重试。
……
第1章 基本环境部署 1
1.1 环境整理 1
1.2 Docker安装 2
1.2.1 卸载旧版本 3
1.2.2 在线安装Docker CE 3
1.2.3 离线安装Docker CE 5
1.2.4 Docker启动及常用命令 5
1.3 Docker-Compose安装 6
1.3.1 在线安装Docker-Compose 6
1.3.2 离线安装Docker-Compose 7
1.4 Go语言环境安装 8
1.4.1 下载Go语言包 8
1.4.2 配置Go语言环境变量 9
1.5 本章小结 9
第2章 Fabric及环境部署 10
2.1 Fabric介绍 10
2.1.1 什么是区块链 10
2.1.2 区块链的作用 12
2.1.3 超级账本是什么 14
2.2 Fabric功能汇总 16
2.3 Fabric组成模型 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.4 Fabric环境部署 20
2.4.1 Fabric源码安装 20
2.4.2 下载Fabric镜像 22
2.4.3 镜像备份和迁移 26
2.5 本章小结 28
第3章 End-2-End案例 29
3.1 平台特定文件 29
3.2 运行e2e_cli 31
3.3 e2e_cli案例分析 38
3.3.1 容器服务脚本 38
3.3.2 容器启动配置文件 52
3.3.3 Fabric网络解析 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.1 Fabric账本 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.4 Kafka集群配置 116
6.4.1 crypto-config.yaml配置 119
6.4.2 configtx配置 121
6.4.3 Zookeeper配置 125
6.4.4 Kafka配置 127
6.4.5 Orderer配置 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.3 Packaging(包) 162
7.3.4 创建package(包) 162
7.3.5 包签名(Package signing) 163
7.3.6 安装智能合约 164
7.3.7 智能合约实例化 164
7.3.8 升级智能合约 165
7.3.9 停止及启动智能合约 166
7.3.10 CLI(客户端) 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 智能合约API 182
7.8 Peer节点与合智能约 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章 CouchDB 197
8.1 CouchDB介绍 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.1 SDK项目前置条件 227
9.2 SDK代码使用 232
9.2.1 Orderers对象 233
9.2.2 Peers对象 235
9.2.3 Chaincode对象 238
9.2.4 FabricUser 240
9.2.5 FabricStore 245
9.2.6 FabricOrg 250
9.2.7 FabricConfig 256
9.2.8 ChaincodeManager 257
9.3 SDK使用方法 264
9.4 本章小结 269
第10章 项目演练 270
10.1 反欺诈系统 271
10.1.1 需求分析 271
10.1.2 编写合约 272
10.1.3 线上验证 278
10.3 本章小结 283