第1章 区块链思想以及去中心化应用 1
1.1 从记账角度理解区块链 1
1.2 区块链技术的典型成分 3
1.2.1 网络通信 4
1.2.2 区块链账本 5
1.2.3 密码算法 7
1.2.4 共识机制 9
1.3 区块链技术架构的更替 10
1.3.1 区块链1.0架构 10
1.3.2 区块链2.0架构 12
1.3.3 区块链3.0架构 13
1.4 去中心化应用及其优缺点 14
1.4.1 去中心化应用 15
1.4.2 去中心化应用的优点 16
1.4.3 去中心化应用的缺点 16
1.5 DApp中的用户 17
1.6 著名的DApp应用 18
1.6.1 比特币 18
1.6.2 达世币 20
1.6.3 零币 21
1.6.4 莱特币 21
1.6.5 以太坊 22
1.6.6 超级账本 23
1.6.7 Ripple 24
1.6.8 OpenBazaar 25
1.6.9 IPFS 26
第2章 区块链的最初应用——去中心化数字货币 28
2.1 数字货币的去中心化历程 28
2.1.1 加密数字货币的过去 29
2.1.2 中本聪与比特币 32
2.2 去中心化数字货币系统的基本设计 34
2.2.1 密钥、私钥与公钥 35
2.2.2 货币地址 40
2.2.3 发起交易 43
2.2.4 交易的UTXO模型 46
2.2.5 交易在比特币网络中的传播 48
2.3 去中心化数字货币中的区块链技术 49
2.3.1 区块结构 50
2.3.2 用区块头哈希值和区块高度标识区块 52
2.3.3 区块间的链接 53
2.3.4 Merkle树与Merkle根 54
2.3.5 创世区块 58
2.4 挖矿行为 59
2.4.1 挖矿与去中心化共识 59
2.4.2 交易校验及整合至区块 62
2.4.3 填充区块头 65
2.4.4 工作量证明算法与开始挖矿 66
2.4.5 难度目标的调整 70
2.4.6 成功构建区块与新区块校验 72
2.4.7 日渐减小的货币供应量 73
2.4.8 理智从事挖矿活动 74
第3章 区块链热议话题 82
3.1 区块链分叉 82
3.1.1 区块同时被挖出导致的分叉 82
3.1.2 软件升级导致的分叉 85
3.2 区块扩容 86
3.3 侧链 89
3.3.1 极具创造力的侧链技术 89
3.3.2 双向挂钩与SPV证明机制 90
3.4 闪电网络 92
3.5 共识攻击 94
第4章 区块链技术的典型应用场景 97
4.1 区块链技术具有潜在的商业价值 97
4.2 广告传媒的去中心化 98
4.3 区块链技术实现版权登记 100
4.4 银行业的去中心化结算 102
第5章 密码算法——区块链应用安全的保障 104
5.1 Hash算法 104
5.1.1 什么是Hash算法 105
5.1.2 用于加密的常见Hash算法 108
5.1.3 SHA-256的加密过程 110
5.1.4 Hash算法的数字摘要 114
5.2 Bloom过滤器 114
5.3 加/解密算法 116
5.3.1 加/解密的过程 116
5.3.2 对称加密算法 118
5.3.3 非对称加密算法 119
5.3.4 RSA密码学算法 121
5.3.5 椭圆曲线密码学算法 123
5.4 Diffie-Hellman密钥交换协议 125
5.5 编码与解码 126
5.5.1 编码/解码的细节 126
5.5.2 Base64编码 128
5.5.3 Base58编码 129
5.5.4 Base58Check编码 130
第6章 共识算法构建出区块链的灵魂 132
6.1 分布式系统的一致性问题 132
6.1.1 解决一致性问题非常重要 133
6.1.2 分布式系统对一致性的要求 134
6.1.3 达成一致性面临着诸多的挑战 135
6.1.4 施加约束的一致性 136
6.2 用共识算法解决一致性问题 137
6.2.1 关于共识算法的讨论 137
6.2.2 常见共识算法 140
6.3 拜占庭将军问题与PBFT算法 142
6.3.1 拜占庭将军问题 142
6.3.2 PBFT算法 146
6.4 Paxos算法和Raft算法 149
6.4.1 Paxos算法 150
6.4.2 Raft算法 152
6.5 工作量证明算法PoW 154
6.6 股权权益证明算法PoS 156
6.7 委托的股权权益证明算法DPoS 157
第7章 区块链应用开发平台——以太坊 159
7.1 以太坊项目的发起与发展 159
7.2 以太坊的设计细节及重要概念 163
7.2.1 智能合约和以太坊虚拟机 163
7.2.2 以太坊账户 164
7.2.3 状态 166
7.2.4 交易 167
7.2.5 以太币面值 169
7.2.6 收据 170
7.2.7 燃料(Gas) 172
7.2.8 梅克尔-帕特里夏树 173
7.3 以太坊的结构与整体运行框架 176
7.4 安装以太坊客户端 178
7.4.1 以太坊的源码 178
7.4.2 通过PPA直接安装Geth 181
7.4.3 从Geth源码编译安装 183
7.4.4 Windows和Mac OS安装Geth 185
7.4.5 以太坊官方钱包的安装和使用 186
7.4.6 浏览器钱包 190
7.5 概述核心客户端Geth的使用 192
7.5.1 JSON-RPC和JavaScript操作台 192
7.5.2 子命令和选项 193
第8章 编写以太坊智能合约 196
8.1 Solidity源文件及源文件导入 196
8.2 Solidity支持的数据类型 198
8.2.1 基本数据类型 198
8.2.2 字符串类型 200
8.2.3 枚举类型 202
8.2.4 数组类型 202
8.2.5 结构体类型 204
8.2.6 mapping类型 205
8.3 用Solidity执行变量操作 205
8.3.1 var关键字 206
8.3.2 基本数据类型变量的类型间转换 206
8.3.3 delete关键字 207
8.4 条件转移和循环控制结构 209
8.4.1 执行条件转移的if...else...结构和“?:” 209
8.4.2 执行循环控制的while和for结构 210
8.5 函数及函数调用 212
8.5.1 用function关键字创建函数 212
8.5.2 函数调用 213
8.5.3 函数修改器 215
8.5.4 回退函数 216
8.6 异常 217
8.7 使用智能合约 217
8.7.1 智能合约的结构模板 218
8.7.2 智能合约的继承 220
8.7.3 搭建测试用私有链网络 223
8.7.4 创建和编译智能合约 225
8.7.5 部署智能合约 227
8.7.6 运行智能合约 229
8.8 智能合约案例:投票 229
8.8.1 智能合约代码 230
8.8.2 解读合约代码 233
8.9 使用官方钱包部署智能合约 236
8.10 智能合约的代码漏洞:TheDAO事件 238
第9章 区块链应用开发平台——超级账本 240
9.1 关于超级账本 240
9.1.1 项目发起的背景 240
9.1.2 项目的组成 243
9.2 优秀的超级账本项目 244
9.2.1 Fabric项目 244
9.2.2 Sawtooth项目 245
9.2.3 Iroha项目 245
9.2.4 BlockChain Explorer项目 246
9.2.5 Cello项目 246
9.2.6 Composer项目 247
9.2.7 Indy项目 247
9.2.8 Burrow项目 248
9.3 Fabric的系统结构与运行模型 249
9.3.1 系统结构 249
9.3.2 Fabric的典型运行模型 251
9.4 Fabric中的关键概念 253
9.4.1 Fabric的节点 253
9.4.2 链码 257
9.4.3 数字身份证书 258
9.4.4 组织与联盟 262
9.4.5 通道 263
9.4.6 策略 265
9.4.7 系统组件间的通信 267
9.4.8 区块链账本结构 268
9.5 用户应用链码 271
9.5.1 链码的结构模板 271
9.5.2 链码与节点的交互 273
9.6 系统链码 275
9.6.1 配置系统链码 276
9.6.2 生命周期系统链码 277
9.6.3 查询系统链码 279
9.6.4 背书管理系统链码 280
9.6.5 验证系统链码 280
第10章 超级账本Fabric的基本使用 281
10.1 搭建并启动Fabric网络 281
10.1.1 网络的配置文件 281
10.1.2 启动节点 289
10.1.3 运行网络 290
10.1.4 总结 294
10.2 操作用户应用链码 295
10.2.1 安装链码 296
10.2.2 实例化链码 296
10.2.3 调用链码 298
10.2.4 查询链码 298
10.2.5 升级链码 299
10.2.6 打包并签名链码 301
10.3 链码开发相关的API 302
10.4 操作通道 306
10.4.1 通道的创建 306
10.4.2 加入通道 307
10.4.3 列举出节点所加入的通道 308
10.4.4 获取通道内的指定区块 308
10.4.5 更新通道的配置区块 308
10.5 链码开发案例——转账 309
10.5.1 Init()方法 310
10.5.2 Invoke()方法 311
10.5.3 主函数方法 314