
本书详细而深入地介绍了区块链技术和智能合约技术,包括算法、数据结构及相关学科的相关理论。本书介绍了基于以太坊的智能合约编程语言Solidity,结合以太坊虚拟机(EVM)的实现,讨论了Solidity语句的汇编实现,介绍了如何应用Solidity来开发去中心化应用(DApp)、如何使用区块链的去中心化存储(IPFS)。同时,出于全面性和前瞻性的考虑,本书详细介绍了智能合约的重要分支:基于超级账本的链码编程和智能合约编程的明日之星Web Assembly(WASM)编程技术。 本书可以作为高等学校区块链工程与技术、计算机科学与技术、金融科技、商务智能等相关专业的教学参考书,也可作为区块链从业人员和相关企事业单位技术人员的参考书。
前 言 习近平总书记2019年10月的讲话让区块链技术终于得以正名,并把区块链技术推向了国家竞争、弯道超车的高度。由此,区块链技术的潜力被正式承认,也催生了各行各业区块链应用落地的滚滚热潮。区块链技术是一项颠覆性技术,被认为是继20世纪80年代的微机革命,90年代的互联网革命之后的又一次新技术的创新。微机革命和互联网革命被视为生产力的创新:有一代更比一代强的芯片,有功能便捷、强大、不断花样翻新的软件,也有新一代的互联网基础设施的升级,如路由器、移动互联网等。与它们相比,区块链技术则是一场生产关系的革命。区块链技术是利用现有的多学科、跨领域的多种技术,将之集成在一起,为我们打造一个在信息不完全、不对称的环境下的低成本的信任机器,从而彻底将我们从个人信任(家人、亲戚朋友等)、制度信任(契约、合同、法庭等)的时代推到了机器信任的时代。在机器信任的时代,人们信任公开透明、多方计算、多方存储的分布式账本;人们相信“代码即法律”(Code is Law)。而基于机器的信任,由于其建立信任的成本低廉、高效率和公平公正性,必将颠覆现实世界里各行各业现有的商业逻辑。在这样的愿景中,基于区块链的智能合约开发扮演着核心基石的角色。 本书详细而深入地介绍区块链技术和智能合约技术,包括算法、数据结构及相关学科的相关理论。从实际应用的角度出发,本书介绍基于以太坊的智能合约编程语言Solidity:从Solidity语言基础的关键字和语句开始介绍,逐步深入到高级应用,包括设计模式、可升级合约的设计、合约的安全性问题及对策等;并结合以太坊虚拟机(EVM)的实现,讨论Solidity语句的汇编实现;讲解Solidity编程原理,并提供相应的实例,以期读者更易理解Solidity编程语言的实现机理;介绍如何应用Solidity来开发去中心化应用(DApp)、如何使用区块链的去中心化存储(IPFS)。同时,出于全面性和前瞻性的考虑,本书详细介绍智能合约的重要分支:基于超级账本的链码编程和智能合约编程的明日之星Web Assembly(WASM)编程技术。 本书首先介绍区块链技术的特点,包括其定义、应用、解决的问题和面临的挑战。为了方便读者深入理解区块链技术,本书详细介绍区块链相关的算法、数据结构和多学科交叉的内容;着重阐述区块链是低成本的信任机器,是在信息不对称、不完全的环境下,在完全不信任节点间建立信任机制的技术,是价值网络,是传递价值的互联网(Internet of Value,IoV)。 鉴于智能合约是区块链应用技术的核心基石之一,本书详细介绍目前最成熟、应用最广泛的智能合约开发平台以太坊,以及目前社区最活跃、应用最多、最具人气的以太坊智能合约编程语言Solidity。本书介绍Solidity语言的文法和各种高级话题,同时深入解析Solidity智能合约的EVM的汇编实现,帮助读者更深刻理解智能合约的工作原理,从而更好地解决各种异常情况。 最后,本书介绍智能合约编程的超级账本和链码编程,以及目前智能合约研究领域最热门、最前沿的方向Web Assembly(WASM)技术。 逻辑上,本书的结构如下。 区块链篇包括3章:第1章,介绍区块链技术的定义、历史、分类、应用和面临的挑战;第2章,介绍区块链技术包含的各学科的技术,包括算法和关键数据结构;第3章,介绍目前最成熟的智能合约开发平台——以太坊。 以太坊Solidity智能合约篇包括4章:第4章,介绍Solidity编程语言的基础知识,包括关键字、语句、修饰符和特性;第5章,介绍Solidity智能合约编程,包括设计模式、编程语言如何与智能合约交互、智能合约编程的安全性等方面;第6章,介绍Solidity编程的高级话题,如合约间如何调用、如何节省燃料、ABI和Solidity合约的汇编实现,以及如何设计可升级的智能合约;第7章,介绍基于Solidity智能合约的DApp编程,以及如何使用去中心化的存储(IPFS)。 超级账本篇包括1章:第8章,介绍超级账本架构和链码编程。 未来篇包括1章:第9章,介绍智能合约编程的明日之星Web Assembly(WASM)。 实践篇包括5章:涉及环境设定、库包安装、Solidity、DApp、WASM合约编程等11个实验,以及2个实验作业。 同时,本书包括4个附录,分别为:Solidity常用函数,区块链大事记,区块链术语,以太坊内置合约。 读者可以登录http://www.hxedu.com.cn网站进行下载本书的相关教学资源,包括示例程序、文件、PPT等。 感谢催生本书的出版界的朋友:电子工业出版社的编辑们和IBM中国的田甜女士。可以说,没有电子工业出版社和IBM中国就没有这本书的诞生。同时,感谢武汉北大高科软件股份有限公司的罗铮先生、王涛先生和邓昕先生,中国通服湖北公司区块链研究院王庆院长、陈仲副院长、邓晓宇副院长、卢赓先生,以及华中科技大学计算机学院陆枫副教授对编写本书的支持。另外,感谢青海大学的郑睿辰同学,学堂在线的徐婉晴同学、王保伟同学,华中科技大学的赵开未、佟谣、邓杰、张立斌和蔡小萌同学。他们做了大量文字校对和绘图工作,提供了有用信息和改进意见。 本书所引图片及所引文字尽量标出出处,有些来自网络的素材无法找到原始发布者,均注明来自网络。对参考内容未能标注出处的,敬请相关著作权人及读者谅解并给予反馈,将在后续版本中做出说明和修正。 作 者
目 录 第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
http://www.hxedu.com.cn/hxedu/fg/book/bookinfo.html?code=G0439090