前言
? ? ? ?区块链技术日趋成熟,公司也希望在区块链上有所发展,身为一个上进青年,当然要承担起这个重任。在前端通过使用vue、react与web3.js开发的dapp后,个人对合约的开发越发的感兴趣,既然如此,心动不如行动,那就开始学习吧。在之后的内容中,我将分享我在solidity学习的过程中的每一步,比如遇到的难题,解决的思路等等。希望可以给和我一样刚刚上手的朋友一些帮助。也希望有朋友可以将我理解错误的地方指出。大家互相讨论,共同进步。
正文
1、查找参考文档
? ? ? ? 身为中国人遇到问题第一个想到的当然是百度了,而百度也没有让我失望,直接搜索solidity,在结果列表的第一项就是Solidity的开发文档,很完美。链接地址如下:
点我跳转:https://solidity-cn.readthedocs.io/zh/develop/
2、大致浏览文档
查看文档左侧的目录是我学习时的习惯,可以大概的了解一下这份文档的指导路程,方便自己去查看想要学习的部分。目录如下:
智能合约概述 ? ? ? ? 简单的智能合约 ? ? ? ? ? ? ? ? 存储 ? ? ? ? ? ? ? ? 子货币(subcreency)例子 ? ? ? ? 区块链基础 ? ? ? ? ? ? ? ? 交易/事务 ? ? ? ? ? ? ? ? 区块 ? ? ? ? 以太坊虚拟机 ? ? ? ? ? ? ? ? 概述 ? ? ? ? ? ? ? ? 账户 ? ? ? ? ? ? ? ? 交易 ? ? ? ? ? ? ? ? Gas ? ? ? ? ? ? ? ? 存储、内存和栈 ? ? ? ? ? ? ? ? 指令集 ? ? ? ? ? ? ? ? 消息调用 ? ? ? ? ? ? ? ? 委托调用/代码调用和库 ? ? ? ? ? ? ? ? 日志 ? ? ? ? ? ? ? ? 创建 ? ? ? ? ? ? ? ? 自毁 安装Solidity编译器 ? ? ? ? 版本 ? ? ? ? Remix ? ? ? ? npm/Node.js ? ? ? ? Docker ? ? ? ? 二进制包 ? ? ? ? 从源代码变异 ? ? ? ? ? ? ? ? 克隆代码库 ? ? ? ? ? ? ? ? 先决条件-macOS ? ? ? ? ? ? ? ? 先决条件-windows ? ? ? ? ? ? ? ? 外部依赖 ? ? ? ? ? ? ? ? 命令行构建 ? ? ? ? CMake参数 ? ? ? ? 版本号字符串详解 ? ? ? ? 版本信息详情 根据例子学习Solidity ? ? ? ? 投票 ? ? ? ? ? ? ? ? 可能的优化 ? ? ? ? 秘密竞价(盲拍) ? ? ? ? ? ? ? ? 简单的公开拍卖 ? ? ? ? ? ? ? ? 秘密竞拍(盲拍) ????????安全的远程购买 ? ? ? ? 微支付通道 深入理解Solidity ? ? ? ? Solidity源文件结构 ? ? ? ? ? ? ? ? 版本杂注 ? ? ? ? ? ? ? ? 导入其他源文件 ? ? ? ? ? ? ? ? ? ? ? ? 语法与语义 ? ? ? ? ? ? ? ? ? ? ? ? 路径 ? ? ? ? ? ? ? ? ? ? ? ? 在实际的编译器中使用 ? ? ? ? ? ? ? ? 注释 ? ? ? ? 合约结构 ? ? ? ? ? ? ? ? 状态变量 ? ? ? ? ? ? ? ? 函数 ? ? ? ? ? ? ? ? 函数修饰器 ? ? ? ? ? ? ? ? 事件 ? ? ? ? ? ? ? ? 结构类型 ? ? ? ? ? ? ? ? 枚举类型 ? ? ? ? 类型 ? ? ? ? ? ? ? ? 值类型 ? ? ? ? ? ? ? ? ? ? ? ? 布尔类型 ? ? ? ? ? ? ? ? ? ? ? ? 整型 ? ? ? ? ? ? ? ? ? ? ? ? 定长浮点型 ? ? ? ? ? ? ? ? ? ? ? ? 地址类型 ? ? ? ? ? ? ? ? ? ? ? ? 定长字节数组 ? ? ? ? ? ? ? ? ? ? ? ? 变长字节数组 ? ? ? ? ? ? ? ? ? ? ? ? 地址字面常数(Address Literals) ? ? ? ? ? ? ? ? ? ? ? ? 有理数和整数字面常数 ? ? ? ? ? ? ? ? ? ? ? ? 字符串字面常数 ? ? ? ? ? ? ? ? ? ? ? ? 十六进制字面常数 ? ? ? ? ? ? ? ? ? ? ? ? 枚举类型 ? ? ? ? ? ? ? ? ? ? ? ? 函数类型 ? ? ? ? ? ? ? ? 引用类型 ? ? ? ? ? ? ? ? ? ? ? ? 数据位置 ? ? ? ? ? ? ? ? ? ? ? ? 数组 ? ? ? ? ? ? ? ? ? ? ? ? 结构体 ? ? ? ? ? ? ? ? 映射 ? ? ? ? ? ? ? ? 涉及LValues的运算符 ? ? ? ? ? ? ? ? ? ? ? ? 删除 ? ? ? ? ? ? ? ? 基本类型之间的转换 ? ? ? ? ? ? ? ? ? ? ? ? 隐式转换 ? ? ? ? ? ? ? ? ? ? ? ? 显式转换 ? ? ? ? ? ? ? ? 类型推断 ? ? ? ? 单位和全局变量 ? ? ? ? ? ? ? ? 以太坊单位 ? ? ? ? ? ? ? ? 时间单位 ? ? ? ? ? ? ? ? 特殊变量和函数 ? ? ? ? ? ? ? ? ? ? ? ? 区块和交易属性 ? ? ? ? ? ? ? ? ? ? ? ? ABI编码函数 ? ? ? ? ? ? ? ? ? ? ? ? 错误处理 ? ? ? ? ? ? ? ? ? ? ? ? 数学和密码学函数 ? ? ? ? ? ? ? ? ? ? ? ? 地址相关 ? ? ? ? ? ? ? ? ? ? ? ? 合约相关 ? ? ? ? 表达式和控制结构 ? ? ? ? ? ? ? ? 输入参数和输出参数 ? ? ? ? ? ? ? ? ? ? ? ? 输入参数 ? ? ? ? ? ? ? ? ? ? ? ? 输出参数 ? ? ? ? ? ? ? ? 控制结构 ? ? ? ? ? ? ? ? 函数调用 ? ? ? ? ? ? ? ? ? ? ? ? 内部函数调用 ? ? ? ? ? ? ? ? ? ? ? ? 外部函数调用 ? ? ? ? ? ? ? ? ? ? ? ? 具名调用和匿名函数参数 ? ? ? ? ? ? ? ? ? ? ? ? 省略函数参数名称 ? ? ? ? ? ? ? ? 通过new创建合约 ? ? ? ? ? ? ? ? 表达式计算顺序 ? ? ? ? ? ? ? ? 赋值 ? ? ? ? ? ? ? ? ? ? ? ? 解构赋值和返回多值 ? ? ? ? ? ? ? ? ? ? ? ? 数组和结构体的复杂性 ? ? ? ? ? ? ? ? 作用域和声明 ? ? ? ? ? ? ? ? 错误处理:Assert,Require,Revert 和 Exceptions ? ? ? ? 合约 ? ? ? ? ? ? ? ? 创建合约 ? ? ? ? ? ? ? ? 可见性和getter函数 ? ? ? ? ? ? ? ? ? ? ? ? Getter函数 ? ? ? ? ? ? ? ? 函数修饰器 ? ? ? ? ? ? ? ? Constant状态常量 ? ? ? ? ? ? ? ? 函数 ? ? ? ? ? ? ? ? ? ? ? ? View函数 ? ? ? ? ? ? ? ? ? ? ? ? Pure函数 ? ? ? ? ? ? ? ? ? ? ? ? Fallback函数 ? ? ? ? ? ? ? ? ? ? ? ? 函数重载 ? ? ? ? ? ? ? ? 事件 ? ? ? ? ? ? ? ? ? ? ? ? 日志的底层接口 ? ? ? ? ? ? ? ? ? ? ? ? 其他学习事件机制的资源 ? ? ? ? ? ? ? ? 继承 ? ? ? ? ? ? ? ? ? ? ? ? 基类构造函数的参数 ? ? ? ? ? ? ? ? ? ? ? ? 多重继承与线性化 ? ? ? ? ? ? ? ? ? ? ? ? 继承有相同名字的不同类型成员 ? ? ? ? ? ? ? ? 抽象合约 ? ? ? ? ? ? ? ? 接口 ? ? ? ? ? ? ? ? 库 ? ? ? ? ? ? ? ? ? ? ? ? 库的调用保护 ? ? ? ? ? ? ? ? Using For ? ? ? ? Solidity汇编 ? ? ? ? ? ? ? ? 内联汇编 ? ? ? ? ? ? ? ? ? ? ? ? 例子 ? ? ? ? ? ? ? ? ? ? ? ? 语法 ? ? ? ? ? ? ? ? ? ? ? ? 操作码 ? ? ? ? ? ? ? ? ? ? ? ? 字面常量 ? ? ? ? ? ? ? ? ? ? ? ? 函数风格 ? ? ? ? ? ? ? ? ? ? ? ? 访问外部变量和函数 ? ? ? ? ? ? ? ? ? ? ? ? 标签 ? ? ? ? ? ? ? ? ? ? ? ? 汇编局部变量声明 ? ? ? ? ? ? ? ? ? ? ? ? 赋值 ? ? ? ? ? ? ? ? ? ? ? ? if ? ? ? ? ? ? ? ? ? ? ? ? Switch ? ? ? ? ? ? ? ? ? ? ? ? 循环 ? ? ? ? ? ? ? ? ? ? ? ? 函数 ? ? ? ? ? ? ? ? ? ? ? ? 注意事项 ? ? ? ? ? ? ? ? ? ? ? ? Solidity惯例 ? ? ? ? ? ? ? ? 独立汇编 ? ? ? ? ? ? ? ? ? ? ? ? 汇编语法 ? ? ? ? 杂项 ? ? ? ? ? ? ? ? 存储中的状态变量存储结构 ? ? ? ? ? ? ? ? 内存中的存储结构 ? ? ? ? ? ? ? ? 调用数据存储结构 ? ? ? ? ? ? ? ? 内部机制-清理变量 ? ? ? ? ? ? ? ? 内部机制-优化器 ? ? ? ? ? ? ? ? 源代码映射 ? ? ? ? ? ? ? ? 技巧和窍门 ? ? ? ? ? ? ? ? 速查表 ? ? ? ? ? ? ? ? ? ? ? ? 操作符优先级 ? ? ? ? ? ? ? ? ? ? ? ? 全局变量 ? ? ? ? ? ? ? ? ? ? ? ? 函数可见性说明符 ? ? ? ? ? ? ? ? ? ? ? ? 修改器 ? ? ? ? ? ? ? ? ? ? ? ? 保留字 ? ? ? ? ? ? ? ? ? ? ? ? 语法表 安全考量 ? ? ? ? 陷阱 ? ? ? ? ? ? ? ? 私有信息和随机性 ? ? ? ? ? ? ? ? 重入 ? ? ? ? ? ? ? ? gas限制和循环 ? ? ? ? ? ? ? ? 发送和接收以太币 ? ? ? ? ? ? ? ? 调用栈深度 ? ? ? ? ? ? ? ? tx.origin ? ? ? ? ? ? ? ? 细枝末节 ? ? ? ? 推荐做法 ? ? ? ? ? ? ? ? 认真对待警告 ? ? ? ? ? ? ? ? 限定以太币数量 ? ? ? ? ? ? ? ? 保持合约简练且模块化 ? ? ? ? ? ? ? ? 使用"检测-生效-交互"(Checkes-Effects-Interactions)模式 ? ? ? ? 形式化验证 合约的元数据 ? ? ? ? 元数据哈希字节码的编码 ? ? ? ? 自动化接口生成和以太坊标准说明格式的使用方法 ? ? ? ? 源代码验证的使用方法 应用二进制接口说明 ? ? ? ? 基本设计 ? ? ? ? 函数选择器 ? ? ? ? 参数编码 ? ? ? ? 类型 ? ? ? ? 编码的形式说明 ? ? ? ? 函数选择器和参数编码 ? ? ? ? 例子 ? ? ? ? 动态类型的使用 ? ? ? ? 事件 ? ? ? ? JSON ? ? ? ? ? ? ? ? 处理元组类型 ? ? ? ? 非标准打包模式 Yul ? ? ? ? Yul语言说明 ? ? ? ? ? ? ? ? 语法层面的限制 ? ? ? ? ? ? ? ? 作用域规则 ? ? ? ? ? ? ? ? 形式规范 ? ? ? ? ? ? ? ? 类型转换函数 ? ? ? ? ? ? ? ? 低级函数 ? ? ? ? ? ? ? ? 后端 ? ? ? ? ? ? ? ? 后端:EVM ? ? ? ? ? ? ? ? 后端:EVM1.5 ? ? ? ? ? ? ? ? 后端:eWASM ? ? ? ? Yul对象说明 风格指南 ? ? ? ? 概述 ? ? ? ? 代码结构 ? ? ? ? ? ? ? ? 缩进 ? ? ? ? ? ? ? ? 制表符或空格 ? ? ? ? ? ? ? ? 空行 ? ? ? ? ? ? ? ? 代码行的最大长度 ? ? ? ? ? ? ? ? 源文件编码格式 ? ? ? ? ? ? ? ? Imports规范 ? ? ? ? ? ? ? ? 函数顺序 ? ? ? ? ? ? ? ? 表达式中的空格 ? ? ? ? ? ? ? ? 控制结构 ? ? ? ? ? ? ? ? 函数声明 ? ? ? ? ? ? ? ? 映射 ? ? ? ? ? ? ? ? 变量声明 ? ? ? ? ? ? ? ? 其他协议 ? ? ? ? 命名规范 ? ? ? ? ? ? ? ? 命名方式 ? ? ? ? ? ? ? ? 应避免的名称 ? ? ? ? ? ? ? ? 合约和库名称 ? ? ? ? ? ? ? ? 结构体名称 ? ? ? ? ? ? ? ? 事件名称 ? ? ? ? ? ? ? ? 函数名称 ? ? ? ? ? ? ? ? 函数参数命名 ? ? ? ? ? ? ? ? 局部变量和状态变量名称 ? ? ? ? ? ? ? ? 常量名称 ? ? ? ? ? ? ? ? 修饰符命名 ? ? ? ? ? ? ? ? 枚举变量命名 ? ? ? ? ? ? ? ? 避免命名冲突 ? ? ? ? ? ? ? ? 一般建议 通用模式 ? ? ? ? 从合约中提款 ? ? ? ? 限制访问 ? ? ? ? 状态机 ? ? ? ? ? ? ? ? 实例 已知bug列表 贡献方式 ? ? ? ? 怎样报告问题 ? ? ? ? Pull Request的工作流 ? ? ? ? 运行编译器测试 ? ? ? ? ? ? ? ? 编写和运行语法测试 ? ? ? ? 通过AFL运行Fuzzer ????????Whiskers模版系统 常见问题 ? ? ? ? 基本问题 ? ? ? ? ? ? ? ? 可以在特定的区块上进行操作吗?(比如发布一个合约或执行一笔交易) ? ? ? ? ? ? ? ? 什么是交易的“有效载荷(payload)”? ? ? ? ? ? ? ? ? 存在反编译器吗? ? ? ? ? ? ? ? ? 创建一个可以被中止并退款的合约 ? ? ? ? ? ? ? ? 调用Solidity方法可以返回一个数组或字符串(string)吗? ? ? ? ? ? ? ? ? 数组可以使用in-line的方式(指在声明变量的同一个语句中)来初始化吗?比如string[]myarray = ["a","b"]; ? ? ? ? ? ? ? ? 合约的函数可以返回结构(struct)吗? ? ? ? ? ? ? ? ? 我从一个返回的枚举类型(enum)中,使用web3.js只得到了整数值,我该如何获取具名数值? ? ? ? ? ? ? ? ? 可以使用in-line的方式来初始化状态变量吗? ? ? ? ? ? ? ? ? 结构(structs)如何使用? ? ? ? ? ? ? ? ? 循环(for? loops)如何使用? ? ? ? ? ? ? ? ? 有没有一些简单的操作字符串的例子(substring,indexOf,chatAt等)? ? ? ? ? ? ? ? ? 我能拼接两个字符串吗? ? ? ? ? ? ? ? ? 为什么大家都选择将合约是梨花编程一个变量(ContractB b;),然后去执行变量的函数(b.doSomething();),而不是直接调用这个低级函数.call()? ? ? ? ? ? ? ? ? 没被使用的gas会被自动退回吗? ? ? ? ? ? ? ? ? 当返回一个值的时候,比如说uint类型的值,可以返回一个undefined或者类似null的值吗? ? ? ? ? ? ? ? ? 注释会被包含在已部署的合约里吗,而且会增加部署的gas吗? ? ? ? ? ? ? ? ? 如果在调用合约的函数时一起发送了以太币,将会发生什么? ? ? ? ? ? ? ? ? 合约对合约的交易可以获得交易回执吗? ? ? ? ? ? ? ? ? 关键字memory是什么?是用来做什么的? ? ? ? ? 高级问题 ? ? ? ? ? ? ? ? 怎样才能在合约中获取一个随机数?(实施一份自动回款的博彩合约) ? ? ? ? ? ? ? ? 从另一份合约中的non-constant函数获取返回值 ? ? ? ? ? ? ? ? 让合约在首次被挖出时就开始做些事情 ????????????????怎样才能创建二维数组 ? ? ? ? ? ? ? ? 当我们复制一个结构(struct)时,结构(struct)中定义的映射会被怎么处理? ? ? ? ? ? ? ? ? 我应该如何初始化一份只包含指定数量wei的合约 ? ? ? ? ? ? ? ? 合约的函数可以接收二维数组吗? ? ? ? ? ? ? ? ? bytes32和string有什么关系吗?为什么bytes32 somevar = "stringliteral";可以生效,还有保存下来的那个32字节的16进制数值有什么含义吗? ? ? ? ? ? ? ? ? 一份合约可以传递一个数组(固定长度)或者一个字符串或者一个bytes(不定长度)给另一份合约吗? ? ? ? ? ? ? ? ? 有些时候,当我想用类似这样的表达式:arrayname.length = 7;来修改数组长度,却会得到一个编译错误Value must be an lvalue,这是为什么 ? ? ? ? ? ? ? ? Solidity的函数可以返回一个字符串数组吗(string[])? ? ? ? ? ? ? ? ? 如果你发起了一次获取数组的调用,有可能获得整个数组吗?还是说另外需要写一个辅助函数来实现? ? ? ? ? ? ? ? ? 如果某个账户只存储了值但没有任何代码,将会发生什么?例子:http://test.ether.camp/account/5f740b3a43fbb99724ce93a879805f4dc89178b5 ? ? ? ? ? ? ? ? 在定制token的合约中,下面这些奇怪的校验是做什么的? ? ? ? ? ? ? ? ? 更多问题?
? ? ? ? 以上就是该篇文档的全部目录。然后就是根据目录按照个人兴趣以及学习目的进行主次的归类,以及学习顺序的确定。本人是实用主义,喜欢由浅入深的学习。所以定制的顺序如下:
智能合约概述=>安装Solidity编译器=>根据例子学习Solidity=>深入理解Solidity=>使用编译器=>合约的元数据=>风格指南=>通用模式=>已知bug列表=>应用二进制接口说明=>贡献方式=>常见问题=>Yul
|