这是一部能指导读者从入门到进阶的以太坊智能合约开发指南。HiBlock区块链技术社区官方出品,4位区块链技术专家联合撰写。
从开发工具与生态、编程语言(Solidity)、编写方法、实践、以太坊虚拟机、合约安全、软件工程等维度全景呈现以太坊智能合约开发的各个方面。更重要的是,以实战为导向,包含若干个翔实、完整的DApp案例讲解。
全书共12章,分为4个部分:
准备篇(第1~2章) 介绍了以太坊的必备常识、基础交互和开发工具套件。
基础篇(第3~6章) 详细讲解了智能合约开发语言 Solidity 的所有语法和编写合约的基本方法,同时也介绍了编译器和 Solidity 集成开发工具的使用。
进阶篇(第7~10章) 首先详细讲解了以太坊协议的细节和以太坊虚拟机的实现原理和架构设计;然后讲解了用于以太坊虚拟机函数调用的应用二进制编码的细节,以及公共基础合约库 openzeppelin-solidity 的源码实现;*后为智能合约的安全开发提供了经验性的指导,有极高的参考价值。
实战篇(第11~12章) 结合若干 DApp 实例讲解了如何基于智能合约来构造可用的去中性化应用程序。这部分内容可以帮助开发者快速上手构建基于以太坊的新一代互联网应用程序。
本书的附录中还包含了对以太坊协议中涉及的部分基础算法、以太坊虚拟机的费用设计和指令设计、 Solidity 内联汇编等的简单介绍。
推荐序
赞誉
前言
第一部分 准备篇
第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 签名保镖(Signature-Bouncer.sol)220
9.5.2 白名单(Whitelist.sol)224
9.6 生命周期226
9.6.1 可自毁(Destructible.sol)226
9.6.2 可暂停运作(Pausable.sol)227
9.6.3 token可自毁(Token-Destructible.sol)228
9.7 支付和悬赏230
9.7.1 托管(Escrow.sol)230
9.7.2 条件托管(Conditional-Escrow.sol)231
9.7.3 退还托管(Refund-Escrow.sol)232
9.7.4 费用支付(PullPayment.sol)233
9.7.5 分割付款(SplitPayment.sol)235
9.7.6 悬赏(Bounty.sol)237
9.8 ERC20239
9.8.1 ERC20Basic(ERC20Basic.sol)240
9.8.2 BasicToken(BasicToken.sol)240
9.8.3 ERC20(ERC20.sol)241
9.8.4 SafeERC20(SafeERC20.sol)243
9.8.5 ERC20详情(Detailed-ERC20.sol)244
9.8.6 标准token(Standard-Token.sol)244
9.8.7 可销毁的token(BurnableToken.sol)247
9.8.8 可销毁的标准token(StandardBurnableToken.sol)248
9.8.9 可暂停的标准token(PauseableToken.sol)249
9.8.10 可增发的标准token(MintableToken.sol)250
9.8.11 有增发上限的标准token(CappedToken.sol)252
9.8.12 可授权增发的标准token(RBACMintableToken.sol)252
9.8.13 锁定token的提取(TokenTimelock.sol)254
9.8.14 定期发放token(Token-Vesting.sol)255
9.9 Crowdsale258
9.9.1 Crowdsale(Crowdsale.sol)258
9.9.2 有上限的Crowdsale(CappedCrowdsale.sol)263
9.9.3 有独立上限的Crowdsale(IndividuallyCapped-Crowdsale.sol)264
9.9.4 有时限的Crowdsale(TimedCrowdsale.sol)266
9.9.5 有白名单的Crowdsale(WhitedlistedCrowdsale.sol)268
9.9.6 自动涨价的Crowdsale(IncreasingPriceCrowdsale.sol)269
9.9.7 可增发的Crowdsale(MintedCrowdsale.sol)270
9.9.8 有额度的Crowdsale(AllowanceCrowdsale.sol)271
9.9.9 有完结处理的Crowdsale(FinalizableCrowdsale.sol)272
9.9.10 后发送token的Crowdsale(PostDeliveryCrowdsale.sol)273
9.9.11 退款库(RefundVault.sol)274
9.9.12 可退款的Crowdsale(RefundableCrowdsale.sol)276
9.10 ERC721278
9.10.1 ERC721Basic(ERC721Basic.sol)278
9.10.2 ERC721(ERC721.sol)281
9.10.3 ERC721Receiver(ERC721Receiver.sol)282
9.10.4 ERC721Holder(ERC721Holder.sol)283
9.10.5 ERC721BasicToken(ERC721BasicToken.sol)284
9.10.6 ERC721Token(ERC721Token.sol)292
9.11 本章小结298
第10章 智能合约安全编码指南299
10.1 已知的攻击299
10.1.1 重入299
10.1.2 算术溢出303
10.1.3 意外之财305
10.1.4 delegatecall308
10.1.5 默认的可见性313
10.1.6 随机错觉313
10.1.7 外部智能合约引用315
10.1.8 短地址/参数攻击316
10.1.9 未检查的返回值317
10.1.10 竞争条件/预先交易317
10.1.11 拒绝服务318
10.1.12 时间戳操纵320
10.1.13 未初始化的存储指针320
10.1.14 浮点和数据精度321
10.1.15 tx.origin判定322
10.2 智能合约开发最佳实践323
10.2.1 智能合约安全开发的基本理念323
10.2.2 智能合约设计开发中的基本权衡324
10.2.3 使用Solidity进行智能合约开发的部分最佳实践325
10.2.4 软件工程上的考量329
10.3 智能合约安全开发辅助工具331
10.4 安全信息/安全通知渠道332
10.5 本章小结332
第四部分 实战篇
第11章 Java版本DApp完整示例336
11.1 DApp智能合约的编写及发布336
11.1.1 DApp智能合约336
11.1.2 智能合约发布337
11.2 环境配置337
11.2.1 逆向生成代码338
11.2.2 创建Java项目与功能验证339
11.3 本章小结341
第12章 DApp示例—宠物店342
12.1 环境准备343
12.2 创建项目343
12.3 编写智能合约343
12.3.1 创建智能合约文件344
12.3.2 定义变量344
12.3.3 领养方法344
12.3.4 查询领养者的方法344
12.4 编译部署合约345
12.4.1 编译合约345
12.4.2 部署合约345
12.5 智能合约测试347
12.5.1 测试adopt()方法347
12.5.2 测试获取单个宠物的领养者348
12.5.3 测试获取所有宠物的领养者348
12.5.4 运行测试348
12.6 前端代码编号349
12.6.1 初始化Web3349
12.6.2 初始化合约349
12.6.3 获取领养的宠物并更新界面350
12.6.4 处理adopt()方法350
12.7 浏览器中与DApp交互350
12.7.1 安装配置MetaMask351
12.7.2 DApp交互352
12.8 本章小结354
附录A Merkle Patricia Tree355
A.1 MPT中的节点类型355
A.2 十六进制前缀编码356
A.3 树的示例356
附录B 递归长度前缀编码359
附录C EVM中的费用设计和操作码设计361
附录D Solidity汇编语言367
D.1 内联汇编库合约实例368
D.2 内联汇编语言特性370
D.3 独立汇编378
D.4 汇编语法380