本书为高等院校区块链工程、计算机科学与技术、软件工程、金融科技等专业教材,以以太坊生态系统为核心,以Solidity智能合约开发为主线,构建了"基础理论—语法基础—接口规范—调测安全—典型应用”的完整知识体系。全书共7章,从以太坊基础概念与密码技术出发,逐步讲解智能合约基本原理、开发环境、Solidity编程语法、应用二进制接口编码、智能合约调试测试方法,深入分析智能合约安全漏洞与审计手段,最后结合ERC系列通证标准、OpenZeppelin第三方库、预言机、可升级合约等内容,展现智能合约的典型应用与工程实践。
汪凌锋,副研究员,成都信息工程大学硕士研究生导师,四川省普通高校教学指导委员会委员,四川省专家服务团专家。负责教授《区块链技术及应用》、《智能合约技术》等研究生和本科课程。主要从事区块链、人工智能、信息安全等领域的技术研究、产品设计研发和人才培养工作;曾就职于中电科网络安全科技股份有限公司、摩托罗拉系统(中国)有限公司等知名企业,组织和参与移动通信、密码服务及密码应用、区块链应用、人工智能等领域多个产品的设计研发;近五年主持/参与科技部、发改委等省部级科研项目4项,发表科研论文5篇,其中SCI检索2篇,获得发明专利授权10项,发表教改论文1篇,指导学生获得国家级和省级竞赛奖项10余项。
第1章 以太坊简介 1
1.1 以太坊相关的密码技术 1
1.1.1 对称密码算法 1
1.1.2 非对称密码算法 2
1.1.3 哈希算法 3
1.2 以太坊的基本概念 4
1.2.1 区块链概念及特点 4
1.2.2 以太坊节点及客户端 5
1.2.3 以太坊账户 7
1.2.4 以太坊交易 8
1.2.5 以太坊燃料 10
1.2.6 以太坊消息及消息调用 12
1.3 以太坊虚拟机 13
1.3.1 以太坊虚拟机简介 13
1.3.2 以太坊虚拟机与智能合约
代码的层次关系 14
1.3.3 以太坊虚拟机架构 14
1.3.4 以太坊虚拟机执行模式 15
1.3.5 以太坊虚拟机的消息调用 16
1.3.6 以太坊虚拟机的输入和输出 17
1.3.7 以太坊虚拟机执行结果 19
1.3.8 以太坊虚拟机指令集 19
第2章 智能合约基本概念 24
2.1 智能合约引言 24
2.1.1 生活中的合约 24
2.1.2 智能合约定义 25
2.1.3 智能合约模型 25
2.1.4 智能合约特点 26
2.1.5 智能合约的生命周期 27
2.1.6 智能合约与传统合约的对比 29
2.1.7 智能合约的应用 29
2.1.8 智能合约的意义 32
2.2 智能合约编程语言 32
2.2.1 主要的智能合约平台 32
2.2.2 主要的以太坊智能合约
编程语言 35
2.3 智能合约开发工具 36
2.3.1 Node.js & NVM 36
2.3.2 Remix 40
2.3.3 Hardhat 47
2.3.4 Foundry 50
第3章 Solidity智能合约编程基础 57
3.1 Solidity简介 57
3.1.1 Solidity历史 57
3.1.2 Solidity定义及特点 58
3.1.3 Solidity版本 58
3.2 Solidity代码文件结构 59
3.2.1 SPDX版权许可标识 59
3.2.2 预编译指令 60
3.2.3 导入其他源码文件 60
3.2.4 合约 61
3.2.5 库 61
3.2.6 接口 62
3.2.7 注释 63
3.3 智能合约结构 64
3.3.1 枚举 64
3.3.2 结构体 64
3.3.3 事件 65
3.3.4 状态变量 65
3.3.5 函数 66
3.3.6 函数修饰符 67
3.3.7 错误 67
3.4 数据类型 68
3.4.1 数据类型分类 68
3.4.2 值类型:布尔型 69
3.4.3 值类型:整型 69
3.4.4 值类型:地址型 70
3.4.5 值类型:合约型 71
3.4.6 值类型:定长字节数组型 72
3.4.7 值类型:枚举型 73
3.4.8 值类型:函数型 74
3.4.9 值类型:用户定义值类型 77
3.4.10 值类型的字面量 78
3.4.11 引用类型及其数据保存区域 81
3.4.12 引用类型:数组型 82
3.4.13 引用类型:结构体型 85
3.4.14 映射型 87
3.5 运算符 91
3.5.1 运算符基本规则 91
3.5.2 三元运算符 92
3.5.3 复合运算符 92
3.5.4 delete运算符 93
3.6 表达式和控制结构 94
3.6.1 函数参数和返回变量 94
3.6.2 控制结构 95
3.6.3 函数调用 95
3.6.4 通过new创建合约 97
3.6.5 赋值:解构式赋值和
创建多个值 98
3.6.6 赋值:引用类型赋值的
复杂性 98
3.6.7 变量:声明 99
3.6.8 变量:作用域 99
3.6.9 特殊变量和函数 99
3.7 面向对象编程 102
3.7.1 面向对象编程三大特性 102
3.7.2 Solidity的继承与多态 103
3.7.3 函数覆盖 104
3.7.4 修饰符覆盖 105
3.7.5 构造函数 106
3.7.6 多重继承和线性化 106
3.7.7 抽象合约 108
3.8 错误与异常处理 108
3.8.1 错误处理概念及错误分类 108
3.8.2 Panic和Error 109
3.8.3 revert语句和revert函数 109
3.8.4 错误异常的捕获 111
第4章 应用二进制接口 112
4.1 应用二进制接口简介 112
4.2 函数选择器 113
4.3 ABI参数编码 113
4.3.1 参数编码及用途 113
4.3.2 ABI数据类型 113
4.3.3 ABI数据类型编码规范 115
4.3.4 ABI数据类型编码 115
4.3.5 函数调用编码 118
4.3.6 事件编码 121
4.3.7 错误编码 122
4.4 合约接口的JSON描述 126
4.4.1 JSON格式描述的合约
接口类型 126
4.4.2 函数的JSON描述 128
4.4.3 事件的JSON描述 129
4.4.4 错误的JSON描述 130
4.4.5 元组的JSON描述 131
第5章 智能合约调试测试 133
5.1 Solidity支持调试、测试的
语法特性 133
5.1.1 事件 133
5.1.2 异常处理 136
5.2 Solidity智能合约调试 138
5.2.1 Remix Desktop调试 138
5.2.2 在Remix Desktop中
使用Hardhat 142
5.3 Solidity智能合约测试 144
5.3.1 软件测试 144
5.3.2 Remix Desktop单元
测试插件 145
5.3.3 Hardhat单元测试 150
第6章 Solidity智能合约安全 154
6.1 Solidity安全漏洞 154
6.1.1 经典Solidity安全漏洞 155
6.1.2 已知Solidity安全漏洞列表 176
6.1.3 智能合约安全审计 177
6.2 Solidity安全开发基本理念 179
6.2.1 最低安全限度原则 179
6.2.2 代码审计过程 181
6.3 Solidity安全审计工具 182
6.3.1 Slither 183
6.3.2 Mythril 189
第7章 Solidity智能合约典型应用 192
7.1 ERC20 192
7.1.1 ERC20通证标准 192
7.1.2 典型ERC20应用:
包装以太币 196
7.2 ERC721 198
7.2.1 ERC721非同质化通证标准 198
7.2.2 典型ERC721应用:谜恋猫
(CryptoKitties) 202
7.3 ERC1155 207
7.3.1 ERC1155多类型资产融合
标准 207
7.3.2 典型ERC1155应用:沙盒
(The Sandbox) 211
7.4 第三方库 220
7.4.1 OpenZeppelin简介 220
7.4.2 OpenZeppelin Defender 221
7.4.3 OpenZeppelin Contracts 222
7.5 预言机(Oracle):区块链与
现实世界的桥梁 223
7.5.1 预言机及其作用 223
7.5.2 预言机分类 224
7.5.3 简单中心化预言机实现 224
7.5.4 去中心化预言机Chainlink 227
7.6 可升级合约 228
7.6.1 可升级合约的必要性及
优势 228
7.6.2 可升级合约结构 229
7.6.3 可升级合约标准 230
7.6.4 可升级合约实例 232