Solidity

156 阅读4分钟

hello word

pragma solidity ^0.8.7 ^代表比这个版本大的都可以 但不能跨版本 如9.0 图片.png

类型和值

uint 无符号数 无负数

图片.png

函数

状态变量

状态变量相当于你将变量写到区块链上

局部变量

只在函数内部生效 不会写在区块链上 ,局部变量运行在内存中 memory

全局变量

不需要定义,一般是链上和账户的信息

图片.png

只读函数

图片.png

计数器合约

图片.png

变量的默认值

图片.png

常量 constant

一些变量的值是固定的 不会修改 设置为常量 节约gas费

图片.png

只读方法不是不消耗 gas费用吗 常量有时候会在写入函数中再次读取,如果写入函数读取就要花gas

结构控制

图片.png

循环

智能合约中循环尽量要少 gas费 图片.png

报错控制

require

图片.png

revert 不能包含表达式

图片.png

assert 不包含报错信息

图片.png

自定义 使用revert触发

图片.png

图片.png

函数修改器 简化复用的代码

图片.png

图片.png 带参数的修改器

图片.png 三明治方式

图片.png

构造函数

Ownable 合约

图片.png

函数返回值

图片.png

图片.png

数组

图片.png

图片.png

数组删除元素通过移动位置

图片.png

删除数组元素通过替换

打乱数组顺序,但是浪费gas费用

图片.png

映射

图片.png

映射迭代

映射可以自己获取但不能迭代,数组可以迭代但不能直接获取

图片.png

结构体

图片.png

图片.png

枚举

枚举和结构体一样都是一种类型

图片.png 图片.png

部署合约

图片.png

图片.png

图片.png

图片.png

图片.png

存储位置 storage memory calldata

storage :状态变量 memory : 局部变量 不定长都要加 数组 byte string calldata :和memory类似 但只能在输入的参数中

图片.png 在智能合约中 参数尽量用calldata 节约gas

简单存储

图片.png

代办事项列表

图片.png

图片.png

event 事件 一种记录当前状态变量的方法

图片.png

图片.png

继承

图片.png

图片.png

多线继承

图片.png

图片.png

图片.png

图片.png

运行父级合约构造函数

初始化父合约 方法一
要知道父合约构造函数要什么 图片.png 方法二
多个父合约的构造函数执行顺序会按照多线继承规则的顺序 图片.png 方法一 方法二混合使用 图片.png

调用父合约函数

  • F.函数()
  • super.函数() 图片.png

可视范围 private public internal external

图片.png

不可变量 immutable

对于不变的变量,加上不可变可以节约gas 图片.png

图片.png 必须在部署合约的时候赋值

payable 接受以太坊主币

图片.png

回退函数 fallback

不接受数据时会调用receive
图片.png

合约发送主币

图片.png call 会将所有的属于gas全发送过去

图片.png

钱包合约

图片.png

调用其他合约

方法一 图片.png 方法二 图片.png 调用合约并且传递主币

图片.png

接口合约

图片.png 只要知道要调用的函数类型名称和参数,就可以使用接口的方法构建 图片.png

低级call

使用call方法调用合约函数

图片.png 由于携带的gas太少不足以支撑 修改两个状态变量,使用调用会失败 图片.png

图片.png 通过低级调用还可以调用合约中不存在的函数,会触发被调用合约的回退函数。

图片.png

委托调用

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

工厂合约 通过new 部署新合约

图片.png

图片.png

库合约 节约代码量

图片.png

图片.png

图片.png

hash 算法

  • 不管输入多大 输出是定长的
  • 不可逆向推倒 keccak256 输出为byte32 图片.png

图片.png

图片.png

检验签名

图片.png

图片.png 图片.png

权限控制合约

图片.png 升级权限 图片.png 撤销权限

图片.png

自毁合约 selfdesctruct

图片.png

图片.png

小猪存钱罐

大家都可以存钱,存钱罐的拥有者才能取钱,取钱需要打碎存钱罐(自毁合约)

图片.png

ERC20

  • ERC20的标准只包括接口。
  • 什么样的合约叫做ERC20的标准合约呢:只要你满足了IERC20的接口,接口中的方法如何实现自己决定。

图片.png

图片.png

图片.png 授权转账 图片.png 铸币方法

图片.png 销毁币

图片.png

函数签名 也叫函数选择器

用来代表一个合约中一个虚拟机是如何找到一个函数 图片.png

荷兰拍卖

英式拍卖

图片.png 开始拍卖 图片.png 出价 图片.png 没拍到者将钱取出

图片.png 结束合约

图片.png

众筹合约

图片.png 图片.png

图片.png

发行众筹

图片.png

取消众筹

图片.png

参与众筹

图片.png

取消参与众筹

图片.png

项目方取走token

图片.png

众筹失败 参与者取回token

图片.png

create2 通过合约部署合约

  • 使用new方法部署合约 部署的合约地址是不能预测的
  • 使用create2 部署的合约是可以预测的 新部署的合约地址=(当前工厂合约的地址+盐+被部署合约的bytecode)
  • 只有盐可以被改变 盐不变 新合约的地址不变 图片.png

图片.png

Multi call 多重调用

对一个或者多个合约的多次调用打包整合在一个交易中

图片.png

图片.png

图片.png

多重委托调用

图片.png 图片.png 图片.png 图片.png 注意委托调用不能跨合约调用,只能使用当前合约的地址进行委托调用 图片.png 图片.png 多重委托调用尽量不要接收主币 有漏洞

ABI解码

编码 图片.png 解码

图片.png 如何在remix中输入结构体

图片.png

gas 优化

图片.png

图片.png

图片.png

时间锁合约

一些最大操作要放入锁中 锁一段时间 供别人审查 如果发现有问题要回退

获取交易id

图片.png

放入队列

图片.png 图片.png

图片.png

执行方法

图片.png 图片.png

图片.png

取消方法

图片.png

测试

图片.png

图片.png