区块链原理 设计与应用
区块链原理 设计与应用
编辑推荐
本书由超级账本核心设计和开发者撰写,Apache 基金会创始人 Brian Behlendorf 倾情推荐,清华大学五道口金融学院常务副院长廖理博士作序。由浅入深,详细讲解超级账本 Fabric 架构设计精华与应用开发,是区块链开发落地专业指南。
内容简介
本书由超级账本核心设计和开发者撰写,是区块链开发落地专业指南。由浅入深、系统化介绍超级账本 Fabric 设计精华、应用开发等。全书分为理论篇和实践篇两大部分;第 1~3 章介绍区块链技术的由来、核心思想及典型的应用场景;第 4~5 章重点介绍区块链技术中大量出现的分布式系统技术和密码学安全技术;第 6~8 章介绍区块链领域的三个典型开源项目:比特币、以太坊以及超级账本;第 9-11 章以超级账本 Fabric 项目为例,具体讲解了安装部署、配置管理,以及使用 Fabric CA 进行证书管理的实践经验;第 12 章重点剖析超级账本 Fabric 项目的核心架构设计;第 13 章介绍区块链应用开发的相关技巧和示例;第 14 章介绍区块链服务平台的设计与开发,并讲解应用超级账本 Cello 项目构建服务平台的相关知识。本书覆盖了区块链和分布式账本领域的*新技术,可帮助读者深入理解区块链核心原理和典型设计实现,以及高效地开发基于区块链平台的分布式应用。
作者简介
杨保华:博士,毕业于清华大学。超级账本(Hyperledger)大中华区技术工作组主席,IBM 大中华区 Blockchain 技术社区首席顾问,资深研究员。曾主持多个大规模系统平台的架构设计和研发实施,是区块链、云计算、大数据等技术的早期研究者和实践者。他热爱开源技术,曾贡献 OpenStack、OpenDaylight 等开源项目,是超级账本 Fabric 项目核心设计和开发者,也是 Cello 和 Fabric-SDK-Py 项目的发起人。个人主页为 https://yeasy.github.com。
陈昌:毕业于清华大学。纸贵科技 CTO,曾任 IBM 高级研究员。技术方向包括云计算、区块链、机器学习等。他是区块链技术的早期研究和推动者,是超级账本(Hyperledger)项目核心开发者。他有丰富的区块链应用实践经验,曾负责金融行业区块链解决方案的架构设计和实施,并主导开发了若干区块链服务平台。
目录
-
序 言
-
前 言
-
理 论 篇
第 1 章 区块链思想的诞生 2
-
1.1 从实体货币到数字货币 2
-
1.2 站在巨人的肩膀上 5
-
1.3 了不起的社会学实验 5
-
1.4 潜在的商业价值 7
-
1.5 本章小结 8
第 2 章 核心技术概览 9
-
2.1 定义与原理 9
-
2.2 技术的演化与分类 11
-
2.3 关键问题和挑战 13
-
2.4 趋势与展望 17
-
2.5 认识上的误区 19
-
2.6 本章小结 19
第 3 章 典型应用场景 20
-
3.1 应用场景概览 20
-
3.2 金融服务 22
-
3.2.1 银行业金融管理 22
-
3.2.2 证券交易 24
-
3.2.3 众筹投资 25
-
3.3 征信和权属管理 26
-
3.4 资源共享 28
-
3.5 贸易管理 29
-
3.6 物联网 30
-
3.7 其他场景 31
-
3.8 本章小结 33
第 4 章 分布式系统核心问题 34
-
4.1 一致性问题 34
-
4.1.1 定义与重要性 34
-
4.1.2 问题与挑战 35
-
4.1.3 一致性要求 36
-
4.1.4 带约束的一致性 36
-
4.2 共识算法 37
-
4.2.1 问题与挑战 38
-
4.2.2 常见算法 38
-
4.2.3 理论界限 38
-
4.3 FLP 不可能原理 39
-
4.3.1 定义 39
-
4.3.2 正确理解 39
-
4.4 CAP 原理 40
-
4.4.1 定义 40
-
4.4.2 应用场景 41
-
4.5 ACID 原则 41
-
4.6 Paxos 算法与 Raft 算法 42
-
4.6.1 Paxos 算法 42
-
4.6.2 Raft 算法 45
-
4.7 拜占庭问题与算法 45
-
4.8 可靠性指标 48
-
4.8.1 几个 9 的指标 48
-
4.8.2 两个核心时间 49
-
4.8.3 提高可靠性 49
-
4.9 本章小结 49
第 5 章 密码学与安全技术 50
-
5.1 Hash 算法与数字摘要 50
-
5.1.1 Hash 定义 50
-
5.1.2 常见算法 51
-
5.1.3 性能 51
-
5.1.4 数字摘要 52
-
5.1.5 Hash 攻击与防护 52
-
5.2 加解密算法 52
-
5.2.1 加解密系统基本组成 53
-
5.2.2 对称加密算法 53
-
5.2.3 非对称加密算法 54
-
5.2.4 选择明文攻击 55
-
5.2.5 混合加密机制 56
-
5.2.6 离散对数与 Diffie–Hellman 密钥交换协议 57
-
5.3 消息认证码与数字签名 57
-
5.3.1 消息认证码 58
-
5.3.2 数字签名 58
-
5.3.3 安全性 59
-
5.4 数字证书 59
-
5.4.1 X.509 证书规范 60
-
5.4.2 证书格式 61
-
5.4.3 证书信任链 62
-
5.5 PKI 体系 63
-
5.5.1 PKI 基本组件 63
-
5.5.2 证书的签发 63
-
5.5.3 证书的撤销 66
-
5.6 Merkle 树结构 66
-
5.7 布隆过滤器 67
-
5.8 同态加密 68
-
5.9 其他问题 70
-
5.10 本章小结 71
第 6 章 比特币——区块链思想诞生的摇篮 72
-
6.1 比特币项目简介 72
-
6.1.1 比特币大事记 73
-
6.1.2 其他数字货币 74
-
6.2 原理和设计 75
-
6.2.1 基本交易过程 75
-
6.2.2 重要概念 76
-
6.2.3 创新设计 78
-
6.3 挖矿 80
-
6.3.1 基本原理 80
-
6.3.2 挖矿过程 81
-
6.3.3 如何看待挖矿 81
-
6.4 共识机制 82
-
6.4.1 工作量证明 82
-
6.4.2 权益证明 83
-
6.5 闪电网络 83
-
6.6 侧链 85
-
6.6.1 SPV 证明 85
-
6.6.2 双向挂钩 86
-
6.6.3 最新进展 87
-
6.7 热点问题 87
-
6.7.1 设计中的权衡 87
-
6.7.2 分叉 87
-
6.7.3 交易延展性 88
-
6.7.4 扩容之争 89
-
6.7.5 比特币的监管和追踪 90
-
6.8 相关工具 91
-
6.9 本章小结 92
第 7 章 以太坊——挣脱数字货币的枷锁 93
-
7.1 以太坊项目简介 93
-
7.1.1 以太坊项目简史 94
-
7.1.2 主要特点 95
-
7.2 核心概念 95
-
7.3 主要设计 97
-
7.3.1 智能合约相关设计 97
-
7.3.2 交易模型 97
-
7.3.3 共识 97
-
7.3.4 降低攻击 98
-
7.3.5 提高扩展性 98
-
7.4 相关工具 98
-
7.4.1 客户端和开发库 98
-
7.4.2 以太坊钱包 99
-
7.4.3 IDE 100
-
7.4.4 网站资源 100
-
7.5 安装客户端 100
-
7.5.1 从 PPA 直接安装 100
-
7.5.2 从源码编译 101
-
7.6 使用智能合约 102
-
7.6.1 搭建测试用区块链 102
-
7.6.2 创建和编译智能合约 104
-
7.6.3 部署智能合约 105
-
7.6.4 调用智能合约 106
-
7.7 智能合约案例:投票 106
-
7.7.1 智能合约代码 107
-
7.7.2 代码解析 109
-
7.8 本章小结 111
第 8 章 超级账本——面向企业的分布式账本 112
-
8.1 超级账本项目简介 112
-
8.2 社区组织结构 114
-
8.2.1 基本结构 114
-
8.2.2 大中华区技术工作组 114
-
8.3 顶级项目介绍 115
-
8.3.1 Fabric 项目 116
-
8.3.2 Sawtooth 项目 117
-
8.3.3 Iroha 项目 117
-
8.3.4 Blockchain Explorer 项目 117
-
8.3.5 Cello 项目 118
-
8.3.6 Indy 项目 118
-
8.3.7 Composer 项目 118
-
8.3.8 Burrow 项目 119
-
8.4 开发必备工具 119
-
8.4.1 Linux Foundation ID 119
-
8.4.2 Jira——任务和进度管理 119
-
8.4.3 Gerrit——代码仓库和 Review 管理 120
-
8.4.4 RocketChat——在线沟通 121
-
8.5 贡献代码 121
-
8.6 本章小结 126
-
实 践 篇
第 9 章 超级账本 Fabric 部署和使用 128
-
9.1 简介 128
-
9.2 本地编译安装 129
-
9.2.1 操作系统 130
-
9.2.2 环境配置 130
-
9.2.3 获取代码 131
-
9.2.4 编译安装 fabric-peer 组件 131
-
9.2.5 编译安装 fabric-orderer 组件 132
-
9.2.6 编译安装 fabric-ca 组件 133
-
9.2.7 编译安装辅助工具 133
-
9.2.8 获取 chaintool 133
-
9.2.9 安装 Go 语言相关工具 134
-
9.2.10 示例配置 134
-
9.3 使用 Docker 镜像 134
-
9.3.1 安装 Docker 服务 134
-
9.3.2 安装 docker-compose 135
-
9.3.3 获取 Docker 镜像 135
-
9.3.4 镜像 Dockerfile 138
-
9.4 启动 Fabric 网络 143
-
9.4.1 网络拓扑 143
-
9.4.2 准备相关配置文件 144
-
9.4.3 启动 Orderer 节点 150
-
9.4.4 启动 Peer 节点 151
-
9.4.5 操作网络 152
-
9.4.6 基于容器方式 156
-
9.5 链码的概念与使用 157
-
9.5.1 链码操作命令 158
-
9.5.2 命令参数 158
-
9.5.3 安装链码 159
-
9.5.4 实例化链码 162
-
9.5.5 调用链码 165
-
9.5.6 查询链码 167
-
9.5.7 升级链码 168
-
9.5.8 打包链码和签名 169
-
9.6 使用多通道 170
-
9.6.1 通道操作命令 170
-
9.6.2 命令选项 171
-
9.6.3 创建通道 172
-
9.6.4 加入通道 174
-
9.6.5 列出所加入的通道 175
-
9.6.6 获取某区块 176
-
9.6.7 更新通道配置 177
-
9.7 SDK 支持 178
-
9.8 生产环境注意事项 179
-
9.9 本章小结 181
第 10 章 超级账本 Fabric 配置管理 182
-
10.1 简介 182
-
10.1.1 配置文件 182
-
10.1.2 配置管理工具 183
-
10.2 Peer 配置剖析 183
-
10.2.1 logging 部分 184
-
10.2.2 peer 部分 184
-
10.2.3 vm 部分 188
-
10.2.4 chaincode 部分 189
-
10.2.5 ledger 部分 190
-
10.3 Orderer 配置剖析 191
-
10.4 cryptogen 生成组织身份配置 194
-
10.4.1 配置文件 195
-
10.4.2 子命令和参数 196
-
10.4.3 生成密钥和证书文件 196
-
10.4.4 查看配置模板信息 198
-
10.5 configtxgen 生成通道配置 199
-
10.5.1 configtx.yaml 配置文件 199
-
10.5.2 命令选项 203
-
10.5.3 生成 Orderer 初始区块并进行查看 203
-
10.5.4 生成新建通道交易文件并进行查看 211
-
10.5.5 生成锚节点更新交易文件 215
-
10.6 configtxlator 转换配置 215
-
10.6.1 RESTful 接口 215
-
10.6.2 解码为 Json 格式 216
-
10.6.3 编码为二进制格式 217
-
10.6.4 计算配置更新量 217
-
10.6.5 更新通道配置 218
-
10.7 本章小结 219
第 11 章 超级账本 Fabric CA 应用与配置 220
-
11.1 简介 220
-
11.2 安装服务端和客户端 221
-
11.2.1 本地编译 221
-
11.2.2 获取和使用 Docker 镜像 223
-
11.2.3 示例 Dockerfile 223
-
11.3 启动 CA 服务 225
-
11.4 服务端命令剖析 228
-
11.4.1 全局命令参数 228
-
11.4.2 init 命令 230
-
11.4.3 start 命令 230
-
11.5 服务端配置文件解析 231
-
11.6 与服务端进行交互 235
-
11.7 客户端命令剖析 237
-
11.7.1 全局命令参数 237
-
11.7.2 enroll 命令 239
-
11.7.3 getcacert 命令 240
-
11.7.4 reenroll 命令 241
-
11.7.5 register 命令 241
-
11.7.6 revoke 命令 242
-
11.8 客户端配置文件解析 243
-
11.9 生产环境部署 245
-
11.10 本章小结 247
第 12 章 超级账本 Fabric 架构与设计 248
-
12.1 整体架构概览 248
-
12.1.1 核心特性 248
-
12.1.2 整体架构 249
-
12.1.3 典型工作流程 249
-
12.2 核心概念与组件 251
-
12.2.1 网络层相关组件 252
-
12.2.2 共识相关组件 254
-
12.2.3 权限管理相关组件 255
-
12.2.4 业务层相关组件 257
-
12.3 gRPC 消息协议 262
-
12.3.1 Envelope 消息结构 262
-
12.3.2 客户端访问 Peer 节点 263
-
12.3.3 客户端、Peer 节点访问 Orderer 265
-
12.3.4 链码容器和 Peer 节点之间的操作 265
-
12.3.5 多个节点之间的操作 266
-
12.4 权限管理和策略 267
-
12.4.1 策略应用场景 267
-
12.4.2 身份证书 268
-
12.4.3 权限策略的实现 268
-
12.4.4 通道策略 272
-
12.4.5 背书策略 273
-
12.4.6 实例化策略 273
-
12.5 用户链码 274
-
12.5.1 基本结构 274
-
12.5.2 链码与 Peer 的交互过程 275
-
12.5.3 链码处理状态机 277
-
12.6 系统链码 279
-
12.7 排序服务 281
-
12.7.1 gRPC 服务接口 282
-
12.7.2 链和账本管理 283
-
12.7.3 通道配置更新 284
-
12.7.4 共识插件 286
-
12.8 本章小结 288
第 13 章 区块链应用开发 290
-
13.1 简介 290
-
13.2 链码的原理、接口与结构 292
-
13.2.1 Chaincode 接口 292
-
13.2.2 链码结构 293
-
13.2.3 链码基本工作原理 294
-
13.3 链码开发 API 295
-
13.3.1 账本状态交互 API 296
-
13.3.2 交易信息相关 API 296
-
13.3.3 参数读取 API 297
-
13.3.4 其他 API 297
-
13.4 应用开发案例一:转账 298
-
13.4.1 链码结构 298
-
13.4.2 Init 方法 299
-
13.4.3 Invoke 方法 300
-
13.5 应用开发案例二:资产权属管理 301
-
13.5.1 链码结构 301
-
13.5.2 Invoke 方法 303
-
13.6 应用开发案例三:调用其他链码 312
-
13.7 应用开发案例四:发送事件 313
-
13.8 开发最佳实践小结 314
-
13.9 本章小结 316
第 14 章 区块链服务平台设计 317
-
14.1 简介 317
-
14.1.1 参考架构 318
-
14.1.2 考量指标 318
-
14.2 IBM Bluemix 云区块链服务 319
-
14.3 微软 Azure 云区块链服务 321
-
14.4 使用超级账本 Cello 搭建区块链服务 324
-
14.4.1 基本架构和特性 324
-
14.4.2 环境准备 325
-
14.4.3 下载 Cello 源码 325
-
14.4.4 配置 Worker 节点 325
-
14.4.5 配置 Master 节点 326
-
14.4.6 使用 Cello 管理区块链 327
-
14.4.7 基于 Cello 进行功能扩展 330
-
14.5 本章小结 330
-
附 录
-
附录 A 术语表 334
-
附录 B 常见问题解答 338
-
附录 C Golang 开发相关 342
-
附录 D ProtoBuf 与 gRPC 349
-
附录 E 参考资源 353