hello word
pragma solidity ^0.8.7 ^代表比这个版本大的都可以 但不能跨版本 如9.0
类型和值
uint 无符号数 无负数
函数
状态变量
状态变量相当于你将变量写到区块链上
局部变量
只在函数内部生效 不会写在区块链上 ,局部变量运行在内存中 memory
全局变量
不需要定义,一般是链上和账户的信息
只读函数
计数器合约
变量的默认值
常量 constant
一些变量的值是固定的 不会修改 设置为常量 节约gas费
只读方法不是不消耗 gas费用吗 常量有时候会在写入函数中再次读取,如果写入函数读取就要花gas
结构控制
循环
智能合约中循环尽量要少 gas费
报错控制
require
revert 不能包含表达式
assert 不包含报错信息
自定义 使用revert触发
函数修改器 简化复用的代码
带参数的修改器
三明治方式
构造函数
Ownable 合约
函数返回值
数组
数组删除元素通过移动位置
删除数组元素通过替换
打乱数组顺序,但是浪费gas费用
映射
映射迭代
映射可以自己获取但不能迭代,数组可以迭代但不能直接获取
结构体
枚举
枚举和结构体一样都是一种类型
部署合约
存储位置 storage memory calldata
storage :状态变量 memory : 局部变量 不定长都要加 数组 byte string calldata :和memory类似 但只能在输入的参数中
在智能合约中 参数尽量用calldata 节约gas
简单存储
代办事项列表
event 事件 一种记录当前状态变量的方法
继承
多线继承
运行父级合约构造函数
初始化父合约
方法一
要知道父合约构造函数要什么
方法二
多个父合约的构造函数执行顺序会按照多线继承规则的顺序
方法一 方法二混合使用
调用父合约函数
- F.函数()
- super.函数()
可视范围 private public internal external
不可变量 immutable
对于不变的变量,加上不可变可以节约gas
必须在部署合约的时候赋值
payable 接受以太坊主币
回退函数 fallback
不接受数据时会调用receive
合约发送主币
call 会将所有的属于gas全发送过去
钱包合约
调用其他合约
方法一
方法二
调用合约并且传递主币
接口合约
只要知道要调用的函数类型名称和参数,就可以使用接口的方法构建
低级call
使用call方法调用合约函数
由于携带的gas太少不足以支撑 修改两个状态变量,使用调用会失败
通过低级调用还可以调用合约中不存在的函数,会触发被调用合约的回退函数。
委托调用
工厂合约 通过new 部署新合约
库合约 节约代码量
hash 算法
- 不管输入多大 输出是定长的
- 不可逆向推倒
keccak256 输出为byte32
检验签名
权限控制合约
升级权限
撤销权限
自毁合约 selfdesctruct
小猪存钱罐
大家都可以存钱,存钱罐的拥有者才能取钱,取钱需要打碎存钱罐(自毁合约)
ERC20
- ERC20的标准只包括接口。
- 什么样的合约叫做ERC20的标准合约呢:只要你满足了IERC20的接口,接口中的方法如何实现自己决定。
授权转账
铸币方法
销毁币
函数签名 也叫函数选择器
用来代表一个合约中一个虚拟机是如何找到一个函数
荷兰拍卖
英式拍卖
开始拍卖
出价
没拍到者将钱取出
结束合约
众筹合约
发行众筹
取消众筹
参与众筹
取消参与众筹
项目方取走token
众筹失败 参与者取回token
create2 通过合约部署合约
- 使用new方法部署合约 部署的合约地址是不能预测的
- 使用create2 部署的合约是可以预测的 新部署的合约地址=(当前工厂合约的地址+盐+被部署合约的bytecode)
- 只有盐可以被改变 盐不变 新合约的地址不变
Multi call 多重调用
对一个或者多个合约的多次调用打包整合在一个交易中
多重委托调用
注意委托调用不能跨合约调用,只能使用当前合约的地址进行委托调用
多重委托调用尽量不要接收主币 有漏洞
ABI解码
编码
解码
如何在remix中输入结构体
gas 优化
时间锁合约
一些最大操作要放入锁中 锁一段时间 供别人审查 如果发现有问题要回退
获取交易id
放入队列
执行方法