深入以太坊智能合约开发

晓娜 在 2020-03-08 发布
所需学分: 495
作品数量: 剩余: 20

编辑推荐

适读人群 :1.以太坊区块链开发工程师,尤其是中高级开发工程师。2.区块链开发工程师以及区块链技术爱好者。

(1)HiBlock社区官方出品。
(2)4位作者均是以太坊、智能合约方面的专家,同时也是我国区块链发展的积极推动者和早期参与者。
(3)本书得到了7位区块链、以太坊领域技术专家的高度评价。
(4)给出了基于以太坊进行智能合约开发的全景介绍,部分核心内容达到了源码级别。
(5)重点剖析了Solidity语言、EVM、OpenZeppelin源码、安全编码、DApp开发等核心内容。

内容简介

这是一部能指导读者从入门到进阶的以太坊智能合约开发指南。HiBlock区块链技术社区官方出品,4位区块链技术专家联合撰写。
从开发工具与生态、编程语言(Solidity)、编写方法、实践、以太坊虚拟机、合约安全、软件工程等维度全景呈现以太坊智能合约开发的各个方面。更重要的是,以实战为导向,包含若干个翔实、完整的DApp案例讲解。
全书共12章,分为4个部分:
准备篇(第1~2章) 介绍了以太坊的必备常识、基础交互和开发工具套件。
基础篇(第3~6章) 详细讲解了智能合约开发语言 Solidity 的所有语法和编写合约的基本方法,同时也介绍了编译器和 Solidity 集成开发工具的使用。
进阶篇(第7~10章) 首先详细讲解了以太坊协议的细节和以太坊虚拟机的实现原理和架构设计;然后讲解了用于以太坊虚拟机函数调用的应用二进制编码的细节,以及公共基础合约库 openzeppelin-solidity 的源码实现;*后为智能合约的安全开发提供了经验性的指导,有极高的参考价值。
实战篇(第11~12章) 结合若干 DApp 实例讲解了如何基于智能合约来构造可用的去中性化应用程序。这部分内容可以帮助开发者快速上手构建基于以太坊的新一代互联网应用程序。
本书的附录中还包含了对以太坊协议中涉及的部分基础算法、以太坊虚拟机的费用设计和指令设计、 Solidity 内联汇编等的简单介绍。

作者简介

杨镇
国内区块链与智能合约领域的技术专家,有15年的一线软件研发和工程项目经验。对以太坊相关技术有非常深入的研究,活跃于各个中文区块链技术社区,致力于区块链、智能合约技术的推广以及企业级区块链应用落地的探索。
软件工程师、架构师,区块链和智能合约技术布道师、独立讲师。
2018 年初对以太坊黄皮书的中译版做了独立校订和增补更新,并作为管理员和主要校订人参与了 Solidity 文档的中译项目。2018 年 8 月独立开发了国内为数不多的以太坊智能合约高级开发课程(在线视频课程)。2018 年底作为译者参加了《精通以太坊》(Mastering Ethereum)中文版(即将出版)的制作工作。截止到 2018 年底,已进行了数十次线上、线下的区块链或智能合约技术分享交流,是区块链和智能合约领域颇受欢迎的技术布道师。

姜信宝
HiBlock区块链社区(HiBlock.One)创始人,专注于区块链技术的研究、培训和推广。HiBlock区块链社区成立于2018年,曾组织Solidity(0.4.22)中文版翻译项目,线下区块链技术沙龙活动60余次,黑客马拉松3次。
Scrum联盟认证讲师(Certified Scrum Trainer),敏捷变革中心合伙人,从事敏捷Scrum推广与宣传等工作十余年,曾担任京东敏捷顾问。

朱智胜
软件工程师、架构师,有近10年的一线软件开发与架构经验,长期从事第三方支付及金融相关领域的研发工作。
曾参与火币钱包及交易所开发,后参与多家交易所和DAPP项目的开发,对以太坊技术有深入的研究。
热衷于技术分享,是CSDN博客专家和讲师。独立完成两套Drools规则引擎视频教程和规则引擎官方技术文档的翻译。

盖方宇
区块链技术专家,一直积极钻研区块链底层技术,对比特币、以太坊等主流公链以及底层的共识算法具有比较深刻的理解。同时热衷于DApp开发,精通Solidity语言,是Solidity官方文档中译项目的主要贡献者之一。目前主要关注区块链二层扩容技术,对状态通道(State Channel)、侧链(Sidechain)颇有研究,是“深入理解Plasma”系列的原创作者。
研究方向包括分布式系统、计算机网络、信息安全以及区块链系统,多次在国际学术会议和期刊上发表论文。

目录

推荐序
赞誉
前言
第一部分 准备篇
第1章 快速了解以太坊2
1.1 以太坊是什么2
1.2 以太坊的历史和发展路线图5
1.3 以太坊的基本概念8
1.3.1 账户(accounts)8
1.3.2 合约(contracts)9
1.3.3 交易(transaction)和消息(message)9
1.3.4 气(gas)10
1.4 以太币(ether)12
1.4.1 以太币的发行12
1.4.2 以太币的单位13
1.4.3 以太坊挖矿13
1.5 以太坊测试网络13
1.6 以太坊客户端14
1.7 以太坊生态系统全景扫描15
1.7.1 Swarm15
1.7.2 ENS15
1.7.3 Whisper16
1.7.4 其他相关项目16
1.8 本章小结17
第2章 以太坊基础交互及基础开发工具详解18
2.1 以太坊客户端的下载、安装及简介18
2.1.1 Geth下载18
2.1.2 Geth安装19
2.1.3 Geth启动与数据目录结构20
2.1.4 网络环境分类20
2.2 核心命令和参数解析21
2.2.1 如何获得命令及参数21
2.2.2 常见基础操作命令22
2.2.3 常见web3j交互命令23
2.3 Remix详解26
2.3.1 Remix简介26
2.3.2 Remix实战27
2.4 本章小结32
第二部分 基础篇
第3章 智能合约开发语言Solidity基础34
3.1 智能合约与Solidity简介34
3.2 Solidity基础语法35
3.2.1 版本杂注35
3.2.2 import的用法35
3.2.3 代码注释36
3.2.4 数据类型36
3.2.5 全局变量52
3.2.6 表达式和控制结构55
3.3 Solidity语言速查表63
3.4 Solidity源代码书写风格68
3.5 本章小结82
第4章 Solidity编译器83
4.1 安装Solidity编译器83
4.1.1 直接获取可执行程序包83
4.1.2 从源代码编译构建84
4.1.3 Solidity编译器版本号详解86
4.2 使用Solidity编译器87
4.2.1 命令行编译器87
4.2.2 编译器输入、输出的JSON描述88
4.3 合约元数据93
4.4 本章小结96
第5章 Solidity智能合约编写97
5.1 创建智能合约97
5.2 可见性控制99
5.3 getter函数100
5.4 函数修饰器102
5.5 状态常量104
5.6 函数104
5.6.1 view函数105
5.6.2 pure函数105
5.6.3 fallback函数106
5.6.4 函数重载107
5.7 事件108
5.8 继承110
5.8.1 基类构造函数110
5.8.2 多重继承111
5.8.3 线性化114
5.9 抽象智能合约114
5.10 接口115
5.11 库116
5.12 using for的用法119
5.13 本章小结121
第6章 Solidity集成开发工具简介122
6.1 Truffle122
6.1.1 Truffle简介122
6.1.2 快速体验123
6.1.3 用Truffle的开发过程124
6.1.4 Truffle高级用法134
6.2 Embark136
6.2.1 Embark安装137
6.2.2 Embark快速开始138
6.2.3 Embark常规用法139
6.2.4 智能合约的配置与调用143
6.2.5 Embark去中心化存储145
6.2.6 Embark去中心化通信148
6.3 其他工具(Remix)149
6.3.1 Solidity编辑与编译149
6.3.2 Solidity合约部署150
6.4 本章小结151
第三部分 进阶篇
第7章 深入理解以太坊虚拟机154
7.1 区块链范式154
7.2 状态、交易、收据和区块155
7.2.1 状态155
7.2.2 交易156
7.2.3 收据157
7.2.4 区块158
7.2.5 以太坊基础数据结构汇总160
7.2.6 理解gas161
7.3 交易执行162
7.4 执行模型—以太坊虚拟机163
7.4.1 EVM概述164
7.4.2 EVM基础操作码164
7.4.3 EVM代码的执行166
7.5 合约创建167
7.6 消息调用168
7.7 区块定稿170
7.8 本章小结172
第8章 应用二进制接口174
8.1 函数选择器174
8.2 参数编码175
8.2.1 类型的规范表达175
8.2.2 编码的形式化说明176
8.2.3 编码实例178
8.3 动态类型的使用180
8.4 事件184
8.5 合约接口的JSON描述185
8.6 处理元组类型186
8.7 非标准打包模式188
8.8 本章小结189
第9章 OpenZeppelin源代码详解190
9.1 通用基础合约191
9.1.1 地址工具(AddressUtils.sol)191
9.1.2 椭圆曲线签名操作(ECRecovery.sol)192
9.1.3 限制子合约的余额(LimitBalance.sol)194
9.1.4 Merkle证明(Merkle-Proof.sol)195
9.1.5 拒绝重入(Reentrancy-Guard.sol)196
9.2 算术运算197
9.2.1 基本算术(Math.sol)197
9.2.2 安全算术(SafeMath.sol)198
9.3 自省(introspection)200
9.3.1 ERC165(ERC165.sol)200
9.3.2 接口查找基础合约(Supports-InterfaceWithLookup.sol)201
9.4 归属权(用户权限)202
9.4.1 归属权(Ownable.sol)202
9.4.2 用户角色(Roles.sol)204
9.4.3 基于角色的访问控制(RBAC.sol)205
9.4.4 超级用户(Superuser.sol)208
9.4.5 联系方式(Contactable.sol)210
9.4.6 归属权转移请求(Claimable.sol)210
9.4.7 有时限的归属权转移请求(DelayedClaimable.sol)211
9.4.8 归属权继承(Heritable.sol)212
9.4.9 合约不归属于合约(HasNoContracts.sol)215
9.4.10 合约不持有以太币(HasNoEther.sol)216
9.4.11 合约可找回token(Can-ClaimToken.sol)218
9.4.12 合约不持有token(HasNo-Tokens.sol)218
9.4.13 合约什么都不持有(NoOwner.sol)219
9.5 访问控制220
9.5.1 签名保

查看全部↓

前言/序言

为什么要写这本书
笔者其实并不是开源软件的早期拥趸,而是一名在企业IT服务领域工作了16年的老程序员。大概在2016年下半年,因为工作需要,笔者开始研究区块链,开始考虑在企业业务中使用这种所谓的“新技术”。不过因为当时的企业级区块链方面还没有可用的技术平台(Fabric还不成熟),所以最终没有在具体业务中使用区块链。但也是由于这次对区块链技术的学习,笔者发现了区块链技术的潜力,尤其是发现了以太坊这个项目的潜力,这使笔者受到了很大的触动,笔者感觉自己有可能基于对技术的理解和钻研精神,在这个新领域中获得超出过往十余年所取得的成绩。
笔者在2017年用业余时间翻译了以太坊官网的Homestead文档,没有用任何翻译软件,完全是自己读原文来将其译为中文的;而后参与了HiBlock社区组织的Solidity官方文档的中译项目,并很快成为项目的管理员,对中译版做了很多的校订工作,这也是以太坊社区官方的中文版本(以太坊官网上的Solidity文档中有对应的链接)。之后就是《以太坊黄皮书》(Ethereum Yellow Paper)。《以太坊黄皮书》就是以太坊协议的技术说明文档,里边记载了以太坊协议的几乎全部细节,包括以太坊虚拟机的具体设计。这是一份难得的、经过实践检验的高质量技术文档,对学习以太坊,乃至其他区块链技术都有很高的参考价值。同时《以太坊黄皮书》也是所有以太坊客户端的理论和实现基础。目前业内几乎所有智能合约平台都或多或少地“借鉴”了《以太坊黄皮书》中的设计。
笔者从2018年4月下旬开始对《以太坊黄皮书》的中文版(最初由猿哥和高天露译)的全文进行独立的校订和增补更新(结合英文拜占庭版本的更新,也没有用翻译软件),到 5 月初最终完成。至此,结合Solidity文档中的相关细节,可以说笔者已经掌握了与以太坊协议以及Solidity智能合约开发相关的方方面面的知识。在开始写作本书的时候,笔者已经对以太坊协议和智能合约技术有了很深的理解。
本书主要内容
本书分为四大部分。
第一部分为准备篇,简单地介绍了以太坊及其相关基本概念,并讲解了以太坊的基本交互和基础工具的使用。
第二部分为基础篇,详细讲解了智能合约开发语言Solidity的所有语法和编写合约的基本方法,同时也介绍了对编译器的使用以及Solidity集成开发工具的使用。
第三部分为进阶篇,详细讲解了以太坊协议的细节和以太坊协议的核心—以太坊虚拟机的实现原理和相关设计;讲解了用于以太坊虚拟机函数调用的应用二进制编码的细节;对目前最有价值的公共基础合约库OpenZeppelin-Solidity的所有源码进行了详细解读;为智能合约安全开发提供了经验性的详细指南。
第四部分为实战篇,结合若干DApp实例,讲解了如何基于智能合约来构造可用的去中心化应用程序。
附录中则包含了对以太坊协议中涉及的部分基础算法、以太坊虚拟机的费用设计和指令设计的介绍,以及对Solidity内联汇编的简单介绍,可以作为我们进行智能合约开发的参考资料。
如果你是一名了解以太坊基础知识和相关工具使用方法的开发者,那么可以直接从第二或第三部分开始学习。但如果你是一名初学者,或者对以太坊的基本概念和工具还没有了解,请按照本书编排的顺序从第1章开始学习。
本书尝试实现的目标
本书将尝试引导智能合约开发者深入理解下面的一些问题。
(1)认识到Solidity并不简单
Solidity是一种结合了C++、Python和JavaScript语言创造出来的为智能合约开发而定制的语言,它在事实上简化了智能合约的开发,是一种上手很容易、对初学者“很友好的”开发语言。只要用户稍有编程经验,就可以很快写出一些简单的智能合约。
不过,这种看起来“很简单的”语言,其实并不简单,因为有太多不那么直观的因素会影响Solidity程序的运行;而大部分开发者也许并不那么理解智能合约的运行环境—以太坊虚拟机(EVM)—其中存在各种各样的技术细节和各种各样的“大坑小坑”。比如,private函数和public函数在调用时到底有什么不同?仅仅是可见性吗?比如,数据在内存和存储中的结构有什么区别?为什么可以对存储中的动态数组使用push和pop,而对内存中的就不行?比如,fallback函数是如何运作的?它真的不能接收参数,也不能有返回值吗?比如,transfer、send和带value的call有什么区别?又比如,EVM中复杂的费用设计(尤其是存储的使用费)和gas返还机制是如何影响合约的gas消耗(也就是运行费用)的?
显然,这些问题并不是我们学习传统的编程语言就可以了解到的,所以对于大多数初学者来讲,这些细节很可能会妨碍他们真正掌握合约开发或者影响他们处理一些相对复杂的逻辑的能力。所以让智能合约开发者真正搞懂Solidity与其他开发语言的区别是首要工作。
(2)不要重复造轮子
与我们在其他所谓传统软件开发中看到的工程特性一样,在智能合约开发中同样存在“重复造轮子”的问题。同样的基础功能或者非常接近的基础功能,被程序员反复编写,犯各种各样的小错误,这种情况在智能合约开发的初学者中同样普遍存在。那么有没有已经被证明是很好用的、很安全的“轮子”呢?这也是笔者希望给智能合约开发者讲解和普及的一个重要内容