本书详细而深入地介绍了区块链技术和智能合约技术,包括算法、数据结构及相关学科的相关理论。本书介绍了基于以太坊的智能合约编程语言Solidity,结合以太坊虚拟机(EVM)的实现,讨论了Solidity语句的汇编实现,介绍了如何应用Solidity来开发去中心化应用(DApp)、如何使用区块链的去中心化存储(IPFS)。同时,出于全面性和前瞻性的考虑,本书详细介绍了智能合约的重要分支:基于超级账本的链码编程和智能合约编程的明日之星Web Assembly(WASM)编程技术。 本书可以作为高等学校区块链工程与技术、计算机科学与技术、金融科技、商务智能等相关专业的教学参考书,也可作为区块链从业人员和相关企事业单位技术人员的参考书。
黄立群,男,博士,副教授。主持研究项目5项,参加自然科学基金、863项目和九五攻关项目各一项,参加其他科研项目12项。在《通信学报》《电子学报》《电子科学学刊》《华中理工大学学报》《计算机工程与应用》等刊物及国际会议上发表十篇论文。主要研究方向为计算机网络技术与应用、移动计算、决策支持系统、嵌入式系统的研究。
目 录
第1章 区块链概述 1
1.1 什么是区块链 1
1.2 区块链历史 2
1.3 区块链的分类 5
1.4 区块链解决的问题 6
1.5 区块链技术概述 9
1.6 区块链面临的挑战 10
1.6.1 安全性挑战 10
1.6.2 效率挑战 14
1.6.3 落地应用的有效性 15
1.6.4 区块链发展的政策法规监管 15
习题1 15
第2章 区块链技术 17
2.1 区块链的架构 17
2.2 哈希函数 18
2.3 密码学算法 19
2.3.1 对称加密算法 19
2.3.2 不对称加密算法 21
2.3.3 国密 22
2.3.4 RSA 23
2.3.5 椭圆曲线算法家族 24
2.4 共识算法 26
2.4.1 拜占庭将军问题 27
2.4.2 共识算法的两个定理 27
2.4.2 共识算法的目的 28
2.4.3 工作量证明 29
2.4.4 权益证明 30
2.4.5 委托权益证明 31
2.5 博弈论 31
2.5.1 博弈论原理 32
2.5.2 博弈论在区块链的应用 33
2.6 P2P算法 34
2.6.1 Gossip 35
2.6.2 Kademlia 37
2.7 数据结构及其算法 42
2.7.1 默克尔树 42
2.7.2 布隆过滤器 44
习题2 46
第3章 以太坊与智能合约 47
3.1 以太坊介绍 47
3.1.1 燃料 48
3.1.2 以太坊虚拟机 50
3.1.3 账户 50
3.2 以太坊关键数据结构及其算法 51
3.2.1 递归长度前缀编码 51
3.2.2 梅克尔–帕特里夏树 52
3.3 智能合约介绍 57
3.3.1 智能合约的实现机制:虚拟机 57
3.3.2 智能合约的实现机制:容器 58
3.4 现有智能合约框架介绍 58
习题3 59
第4章 Solidity编程 61
4.1 SOL文件结构 61
4.2 合约结构 64
4.3 变量类型 64
4.3.1 值类型 64
4.3.2 引用类型 66
4.3.3 字典 67
4.3.4 特殊情况 67
4.4 操作符 68
4.5 语句 69
4.5.1 条件语句 69
4.5.2 循环语句 70
4.5.3 其他 70
4.6 修饰符 70
4.6.1 修饰符说明 71
4.6.2 修饰符的区别 72
4.6.3 自定义修饰符 74
4.7 数据位置 75
4.8 事件 77
4.9 继承 80
4.10 其他 81
4.10.1 类型转换及推断 81
4.10.2 异常 82
4.10.3 汇编 82
4.10.4 This关键字 84
习题4 84
第5章 智能合约开发 86
5.1 智能合约开发的特点 86
5.2 智能合约的生命周期和开发周期 88
5.2.1 智能合约的生命周期 88
5.2.2 智能合约的开发周期 88
5.3 设计模式 89
5.3.1 工厂合约模式 90
5.3.2 映射迭代 90
5.3.3 名字登录 91
5.3.4 回退模式 92
5.3.5 合约自毁 92
5.3.6 访问限制 93
5.3.7 断路器 94
5.3.8 状态机 95
5.4 基础算法 97
5.5 智能合约的安全 99
5.5.1 编程语言相关的攻击 99
5.5.2 平台相关的攻击 107
5.5.3 重入攻击 115
5.5.4 阻塞攻击 116
5.6 智能合约最佳安全开发指南 118
5.7 代码审计 126
小结 126
习题5 126
第6章 Solidity智能合约应用 127
6.1 可升级 127
6.1.1 升级智能合约要考虑的问题 127
6.1.2 智能合约升级方法 128
6.1.3 通用的代理模式 131
6.1.4 存储升级 133
6.2 节省燃料 140
6.3 汇编代码 147
6.3.1 栈 147
6.3.2 调用数据 148
6.3.3 内存 149
6.3.4 存储 149
6.4 合约间调用 151
6.4.1 函数调用 151
6.4.2 依赖注入 152
6.4.3 消息调用 153
6.4.4 获取合约间调用的返回值 156
6.5 ABI编程 158
6.5.1 内存结构 159
6.5.2 函数选择子 159
6.5.3 类型定义 159
6.5.4 数据表示 160
6.5.5 编码 165
6.6 运行原理 173
习题6 178
第7章 去中心化应用 180
7.1 DApp概述 180
7.2 DApp架构 183
7.2.1 客户端 183
7.2.2 服务器端 184
7.2.3 流程详解 186
7.3 去中心化数据存储 188
7.3.1 Swarm 189
7.3.2 IPFS/FileCoin 191
7.4 消息通信 193
7.5 名字解析 194
习题7 194
第8章 超级账本 195
8.1 Fabric概述 195
8.1.1 Fabric结构 196
8.1.2 Fabric组件 197
8.1.3 Fabric技术架构 202
8.1.4 Fabric网络架构 204
8.2 链码 204
8.2.1 链码的分类 204
8.2.2 链码的生命周期 205
8.3 链码交互 206
习题8 207
第9章 Web Assembly 209
9.1 为什么需要WASM 209
9.1.1 EVM的缺陷 209
9.1.2 WASM的优越性 213
9.2 WASM特色 213
9.2.1 WASM特点 214
9.2.2 WASM动态运行库 215
9.3 eWASM前后端交互 216
9.4 从Solidity迁移到WASM 218
习题9 218
第10章 开发环境和工具安装 220
10.1 实验1:区块链开发基本语言工具包安装配置 220
10.1.1 编程语言包的安装 220
10.1.2 Node.js环境的安装 221
10.1.3 Git包的安装 222
10.2 实验2:以太坊开发环境安装 222
10.2.1 web3安装 222
10.2.2 Ganache安装 222
10.2.3 Truffle安装 223
10.2.4 区块链浏览器 225
10.2.5 测试环境 225
10.3 实验3:以太坊开发工具 227
10.3.1 Remix的使用 227
10.3.2 Infura的使用 230
10.3.3 MetaMask的使用 231
10.3.4 Mist的使用 233
10.3.5 以太坊源码编译 234
10.3.6 其他 235
动手实验 235
第11章 Solidity智能合约开发 236
11.1 实验4:以太坊Solidity智能合约ERC20开发 236
11.1.1 方法 237
11.1.2 事件 238
11.1.3 OpenZeppline框架 238
11.2 实验5:以太坊Solidity智能合约ERC721开发 239
11.2.1 ERC721接口定义 239
11.2.2 元数据扩展 250
11.2.3 可枚举扩展 251
11.2.4 ERC165标准 255
11.3 实验6:用编程语言与智能合约交互 256
11.3.1 用Go语言程序与智能合约交互 256
11.3.2 基于ABI的编程 264
11.2.3 标准开发流程 264
11.4 实验7:Solidity智能合约调试 268
11.4.1 编程语言 268
11.4.2 Testrpc/Ganache测试环境 276
11.4.3 Truffle Debugger 277
11.4.4 Remix调试 285
第12章 智能合约应用案例 289
12.1 实验8:以太坊DApp开发和调试 289
12.1.1 环境准备 290
12.1.2 项目 290
12.1.3 智能合约Solidity编程 291
12.2 实验9:以太坊IPFS DApp开发和调试 296
12.2.1 DApp环境准备 296
12.2.2 DApp项目 297
12.2.3 编译运行 301
第13章 超级账本Fabric开发 302
13.1 实验10:超级账本Fabric开发环境 302
13.1.1 Fabric安装 302
13.1.2 First-network例子 314
13.1.3 Test-network示例 319
13.1.2 链码交互 326
13.1.3 链码调试 330
13.1.4 链码简例 331
13.2 实验11:WASM简单合约开发 340
13.2.1 Go + WASM的基本用法 340
13.2.2 WASM的例子 341
第14章 智能合约实验练习 344
14.1 实验练习1:商业名片系统 344
14.2 实验练习2:基于ERC721/NFT的学位证书认证系统 344
附录A Solidity常用函数 346
附录B 区块链大事记 349
附录C 区块链术语 358
附录D 以太坊内置合约 363
参考文献 366