professional-solidity
professional-solidity copied to clipboard
《Solidity 高级程序设计》面向专业开发者的Solidity教程!目前已经完成了最初的 V0.0.1 版本
Solidity 高级程序设计
前置说明:
这个教程的目标读者是那些已经熟悉 Solidity 语言基本用法的人,他们可能已经编写过一些简单的智能合约,并对 Solidity 的核心概念和语法有一定的了解。如果您已经掌握了 Solidity 的基本用法,这个教程可以帮助您填补一些知识的空白,并深入学习更高级的概念和技术。
对于更好地阅读和理解这个教程,确实需要具备一定的 Solidity 基础知识,并且最好具备其他语言的生产级项目编码水平。
对于完全零基础的 Solidity 小白来说,这个教程可能并不适合作为他们初次接触。
如果您是一个初学者,我建议您首先学习 Solidity 的基础知识。您可以通过阅读 Solidity 的官方文档和教程来入门,掌握 Solidity 的基本语法、数据类型、控制流程等。一旦您对 Solidity 有了一定的了解,您可以尝试编写简单的智能合约,以加深对 Solidity 的理解。
在学习 Solidity 的过程中,如果您遇到任何问题,都可以随时向我提问。我将尽力帮助您理解和解决问题。
❌❌❌ 注意:
这个前置条件非常重要,对于没有编程基础的人来说,阅读这个教程可能会非常困难。如果您没有掌握 Solidity 的基本用法或其他编程语言的经验,确实建议您先学习编程的基础知识和其他语言,然后再尝试深入学习 Solidity。
如果您在学习 Solidity 的过程中遇到困难,可以随时向我提问。我会尽力为您提供帮助和解答。同时,使用搜索引擎和参考其他教程和资源也是一个很好的学习策略,因为这样可以获取更多的知识和解决问题的方法。
另外,关于Solidity学习资源的地址,一下是一些常用的学习资源,供大家参考:
关于作者&加入我们
![Discord](https://img.shields.io/badge/-7289DA?style=flat-square&logo=discord&logoColor=white)
朱安邦 (亚洲洲长,地球球长,银河系的最后守护者,人类文明的唯一指导者)
一位热衷于区块链技术和 Solidity 的开发者。他具有丰富的经验和知识,并致力于推广和教育 Solidity 的使用。他的目标是帮助更多的人学习和了解 Solidity,并在区块链领域做出贡献。
您可以通过以下方式与作者互动和获取更多信息:
运行配置 & 环境说明
运行环境:
为了方便演示,本教程内所有的操作,均在 Solidity 在线编译器 Remix 中进行,它可以直观快捷的做合约部署+测试+生成界面。
学习的时候建议使用 Solidity 最新版本进行编码,最新版本可以在官方博客 blog.soliditylang.org 查看。
额外说明:
本教程的所有知识点都不会拿别的语言进行类比。很多写作者写 solidity 教程的时候,喜欢在介绍某个知识点时,拿自己之前熟悉的语言和 solidity 类比介绍(比如 C++,Python,Java,Javascript 等),初心是让读者可以更容易理解;但是事与愿违,很多时候读者可能并不了解写作者熟悉的那门语言,导致不举例还好,对比举例更迷糊了。学习编程是一件很严肃的事情,本教程尽量避免无聊的调侃,类比和啰嗦的废话。
感想
为了促进更多人的参与和了解,《Solidity 高级程序设计》教程力争成为中文区域领先的教程之一。为此,我为教程准备了一系列配套资料,以便读者更好地学习和掌握相关内容。
- Github 源文件:开放,让读者最低成本的参与优化和修复
- 在线文档:方便随时阅读(会墙内+墙外两套文档作为配套)
- PDF 文件:方便本地断网浏览
- 实体书籍:方便有读书习惯的人阅读。
如果你喜欢这个项目,请给它点一个(GitHub上的点赞按钮)。
贡献
我们欢迎并鼓励您对所有文档、源代码以及相关视频的开放与免费访问。此外,我们还提供了配套的PDF文件,同样也是免费提供的。我们欢迎您在GitHub仓库上提交您的改动,以帮助我们不断优化内容。如果您对参与教程的修改和改进感兴趣,修改GitHub源文件是最简单的方式。
在线阅读
- 文字版在线阅读:
- 视频版:
TODO
下面是给这本书做的 TODO List
- ✅ 最迟不晚于 2022 年 11 月提供前 3 章的内容用来做市场测试,如果有必要的话,提供配套的视频版
- ✅ 最迟不晚于 2023 年 1 月提供 V0.0.1 版本,并在 V0.0.1 版本完成初步架构
- ❌ 最迟不晚于 2023 年 3 月提供 V0.0.2 版本,并在 V0.0.2 开始提供完整的 PDF 版电子书籍
- ❌ 最迟不晚于 2023 年 6 月提供 V0.0.3 版本,并在 V0.0.3 开始将 PDF 电子书籍印刷 30 本供自己和身边的朋友阅读和矫正。
- ❌ 最迟不晚于 2023 年 9 月提供 V0.0.4 版本,并在 V0.0.4 印刷 100 本免费提供给网络上的陌生人阅读和矫正。
- ❌ 如果一切顺利的话,联系出版社给印刷出来。
- ❌ 重新录制完整的视频配套教程
7 个步骤,目前完成了 2 个。一切都按照计划进行中。
最开始写了前面 3 章内容,并在 2022 年 10 月下旬录制了配套视频教程,并分享在 Bilibili 上,有赞的有吐槽的;但是后台数据上来看这类资料在 Solidity 这个垂直语言内还是很受欢迎的。目前在 B 站搜索常见的 Solidity 关键字,我分享的视频教程几乎都是系统默认推荐的第 1 名。总播放量也在 12 月份进了前 10。并在 2022 年 12 月下旬完成了 V0.0.1 版本内容,初步完成了这本书的架构。
目录
第一部分:语言基础
-
01.初识
- 1️⃣ 区块链基础
- 2️⃣ Hello World
- 3️⃣ 合约代码中的三种注释
- 4️⃣ 合约结构介绍
- 5️⃣ 全局的以太币单位
- 6️⃣ 接收 ETH
- 7️⃣ selfdestruct:合约自毁
- 🆗 实战 1: 同志们好
- 🆗 实战 2: 存钱罐合约
- 🆗 实战 3: WETH 合约
- #️⃣ 问答题
-
02.数据
- 1️⃣ 数据与变量
- 2️⃣ 两种类型的数据
- 3️⃣ 值类型
- 4️⃣ 值类型:地址类型
- 5️⃣ 值类型:合约类型
- 6️⃣ 引用类型的额外注解:数据位置
- 7️⃣ 引用类型
- 8️⃣ 类型转换
- 9️⃣ 字面常量与基本类型的转换
- 🆗 实战 1: Todo List
- 🆗 实战 2: 众筹合约
- 🆗 实战 3: 同志们好增加提示
- 🆗 实战 4: ETH 钱包
- 🆗 实战 5: 多签钱包
- #️⃣ 问答题
-
03.变量
- 1️⃣ 变量基础知识
- 2️⃣ Constant (恒) 常量
- 3️⃣ Immutable 不可变量
- 4️⃣ 变量名的命名规则
- 5️⃣ 变量的可见性
- 6️⃣ 全局:时间单位
- 7️⃣ 全局:区块和交易属性
- #️⃣ 问答题
-
04.函数
- 1️⃣ 函数的定义
- 2️⃣ 函数的调用
- 3️⃣ 构造函数
- 4️⃣ visibility:可见性
- 5️⃣ mutability:状态可变性
- 6️⃣ 函数的返回值 returns/return
- 7️⃣ 函数的签名/函数标识符
- 8️⃣ 函数的重载
- 9️⃣ modifier:函数修改器
- 🔟 全局:数学和密码学函数
- 1️⃣ 全局:ABI 编码及解码函数
- 2️⃣ 补充:函数赋值给变量 & 函数作为参数 & 函数中返回函数
- 🆗 实战应用
- #️⃣ 问答题
-
05.运算操作符
- 1️⃣ 算术运算符
- 2️⃣ 关系运算符
- 3️⃣ 逻辑运算符
- 4️⃣ 三元运算符
- 5️⃣ 位运算符
- 6️⃣ delete (删除)
- 7️⃣ 操作符的优先级
- 8️⃣ 不同数据类型的总结
- #️⃣ 问答题
-
06.错误处理
- 1️⃣ require (需要)
- 2️⃣ assert (断言)
- 3️⃣ revert
- 4️⃣ 三种方式的总结
- 5️⃣ 自定义 Error (误差)
- 6️⃣ Natspec Error (误差)
- 7️⃣ try catch
-
07.流程控制
- 1️⃣ if else
- 2️⃣ 三元运算符
-
08.循环与迭代
- 1️⃣ for 语句
- 2️⃣ while 语句
- 3️⃣ do…while
-
09.事件
- 1️⃣ Event (事件) 语法
- 2️⃣ 四种事件定义方式
- 3️⃣ indexed (指数) 的作用
- 4️⃣ log (日志) 的使用
- 5️⃣ Log (日志) 重载
- 🆗 实战: 众筹合约
-
10.合约继承
-
1️⃣ 使用
is
实现继承 - 2️⃣ 子类可以继承父类哪些数据?
- 3️⃣ 多重继承中的重名
- 4️⃣ 重写函数
- 5️⃣ 多级继承的代码书写顺序(线性化)
- 6️⃣ 继承中两种构造函数传参方式
- 7️⃣ 继承中构造函数的执行顺序
- 8️⃣ 两种子合约调用父合约的方法
- 9️⃣ 多重继承合约不要使用 supper
- 🆗 实战应用
- #️⃣ 问答题
-
1️⃣ 使用
-
11.合约调用合约
- 1️⃣ 调用内部合约
- 2️⃣ 调用外部合约
- 3️⃣ MultiCall/多次调用
- 4️⃣ MultiDelegatecall / 多次委托调用
- 🆗 实战应用
- #️⃣ 问答题
-
12.合约部署合约
-
1️⃣ 通过
new
创建合约 /create
-
2️⃣ 通过
salt
创建合约 /create2
- 3️⃣ 用 assembly (装配) 做 create (创建)
- 4️⃣ 用 assembly (装配) 做 create2
- 5️⃣ 创建合约的扩展
- #️⃣ 问答题
-
1️⃣ 通过
-
13.interface:接口
- 1️⃣ 限制
- 2️⃣ 定义和使用
-
3️⃣ 全局属性
type(I).interfaceId
- 4️⃣ ERC20 标准
- 5️⃣ ERC721 标准
- 6️⃣ ERC1155 标准
- 7️⃣ ERC3525 标准
- 8️⃣ 四种代币标准的对比
- 🆗 实战:荷兰拍卖
- 🆗 实战:英式拍卖
- #️⃣ 问答题
-
14.Library:库
- 1️⃣ 库合约与普通智能合约区别
- 2️⃣ 直接调用库合约方法
-
3️⃣
using...for...
使用库合约 - 4️⃣ 直接调用 和 using (使用) for 对比
- 5️⃣ 销毁合约库
- 6️⃣ 扩展:库的调用保护
- 🆗 实战应用
- #️⃣ 问答题
-
15.算法
- 1️⃣ 插入排序
- 2️⃣ 冒泡排序
- 🆗 实战应用
- #️⃣ 问答题
-
16.Assembly (装配) :内联汇编
- 1️⃣ 基本格式
- 2️⃣ 语言基础
- 3️⃣ 条件判断
- 4️⃣ for 循环
- 5️⃣ 函数的定义和使用
- 6️⃣ EVM 内置函数/内置操作码
- 🆗 实战应用
- #️⃣ 问答题
-
17.metadata:元数据
- 1️⃣ metadata 包含信息
- 2️⃣ 字节码中元数据哈希的编码
- 3️⃣ 自动化接口生成和 natspec 使用
- 4️⃣ 源代码如何验证?
- 🆗 实战应用
- #️⃣ 问答题
-
18.ABI 编码
- 1️⃣ ABI 类型编码
- 2️⃣ ABI 编码的设计准则
- 3️⃣ 编码的形式化说明
- 4️⃣ 函数选择器和参数编码
- 5️⃣ 动态类型的使用
- 6️⃣ 事件
- 7️⃣ 错误编码
- 8️⃣ JSON
- 9️⃣ 严格编码模式
- 🔟 非标准打包模式
- 🆗 实战应用
- #️⃣ 问答题
-
19.变量的布局
- 1️⃣ 状态变量在 storge 中的布局
- 2️⃣ 变量在 memory 布局
- 3️⃣ Call Data 布局
- 4️⃣ 清理变量
- #️⃣ 问答题
第二部分:合约优化
-
20.合约安全
- 1️⃣ 时间锁合约
- 2️⃣ 重入攻击
- 3️⃣ 数学溢出攻击
- 🆗 推荐做法
- 🆗 扩展阅读
-
21.Gas 优化
- 1️⃣ 省钱总结
- 2️⃣ 使用短路模式来排序操作
-
3️⃣ 函数使用
external
+calldata
- 4️⃣ 使用正确的数据类型
-
5️⃣ 循环中不操作
storage
变量 - 6️⃣ 循环中的不重复计算数据
- 7️⃣ 尽量少用循环
- 8️⃣ 可预测的结果,不通过代码计算。
- 9️⃣ 避免死代码
- 🔟 避免不必要的判断
- 1️⃣ 删除不必要的库
- 🆗 优化案例
-
22.合约编码规范
- 1️⃣ 代码布局
- 2️⃣ 代码中各部分的顺序
- 3️⃣ 文件结构分享
- 4️⃣ 命名约定
- 5️⃣ 更多内容
本来是做了 24 章的内容,但是为了以后方便印刷成纸质,所以删除了真实案例分析和合约常见错误分析这两个含有大量代码演示的章节。(比如案例分析里,光 uniswap V2/V3 和 Compound 这 3 个合约,每个印出来都是几十页的内容,太浪费篇幅了,以后单独放出来)
本地运行文档
克隆本仓库到你的电脑
git clone [email protected]:anbang/professional-solidity.git
安装 Sphinx:
yum -y install git make python3 python3-pip
pip3 install sphinx
pip3 install sphinx-autobuild
pip3 install sphinx_rtd_theme
pip3 install recommonmark
pip3 install sphinx_markdown_tables
本地运行:根目录执行如下命令
# 第一种
sphinx-autobuild docs build/html
# 第二种
./start.sh