速查表
内容来自 Cheatsheet
abi
-
abi.decode(bytes memory encodedData, (...)) returns (...)
: 解码给定的参数 -
abi.encode(...) returns (bytes memory)
: 编码给定的参数, 每个参数会填充为 32 字节的数据function encodeData(uint256 value, address addr) public pure returns (bytes memory) {
return abi.encode(value, addr);
}
function decodeData(bytes memory encodedData) public pure returns (uint256, address) {
(uint256 value, address addr) = abi.decode(encodedData, (uint256, address));
return (value, addr);
} -
abi.encodePacked(...) returns (bytes memory)
: 功能同abi.encode
, 但不会填充参数字节数 -
abi.encodeWithSelector(bytes4 selector, ...) returns (bytes memory)
: 将函数选择器与其他参数一起编码abi.encodeWithSelector(bytes4(keccak256("add(uint,uint)")), 10, 20)
-
abi.encodeCall(function functionPointer, (...)) returns (bytes memory)
: 编码函数调用,包括函数选择器和函数参数,需要被调用合约的源码或接口。functionPointer
是函数指针, 而不是函数选择器// 合约源码
contract Target {
function multiply(uint256 a, uint256 b) public pure returns (uint256) {
return a * b;
}
}
function encode(Target target, uint256 a, uint256 b) public pure returns (bytes memory) {
return abi.encodeCall(target.multiply, (a, b));
}
// 接口
interface ITarget {
function multiply(uint256 a, uint256 b) external pure returns (uint256);
}
function encode(address target, uint256 a, uint256 b) public pure returns (bytes memory) {
return abi.encodeCall(ITarget(target).multiply, (a, b));
} -
abi.encodeWithSignature(string memory signature, ...) returns (bytes memory)
: 将函数签名于其他参数一起编码abi.encodeWithSelector("add(uint,uint)", 10, 20)
bytes 和 string
-
bytes.concat(...) returns (bytes memory)
: 连接两个或多个字节数组 -
string.concat(...) returns (string memory)
: 连接两个或多个字符串
地址
-
<address>.balance
: 获取账户余额 -
<address>.code
: 获取地址的代码, 地址是合约地址时, 返回合约的字节码,否则返回空字节 -
<address>.codehash
: 获取合约代码的keccak256
哈希值 -
<address payable>.send(uint256 amount) returns (bool)
: 将指定数量的wei
发送到地址,如果失败则返回false
-
<address payable>.transfer(uint256 amount)
: 将指定数量的wei
发送到地址,如果失败则抛出异常
区块和交 易
-
blockhash(uint blockNumber) returns (bytes32)
: 获取给定区块的区块 hash, 只可用于最近的 256 个区块 -
block.basefee (uint)
: 当前区块的basefee
-
block.chainid (uint)
: 当前chainId
-
block.coinbase (address payable)
: 当前区块矿工地址 -
block.difficulty (uint)
: 当前区块难度 -
block.gaslimit (uint)
: 当前区块gaslimit
-
block.number (uint)
: 当前区块高度 -
block.prevrandao (uint)
: 由信标链提供的随机数 (见EIP-4399
) -
block.timestamp (uint)
: 当前区块时间戳 -
gasleft() returns (uint256)
: 在交易执行过程中, 获取的剩余gas
-
msg.data (bytes)
: 交易携带的数据calldata
-
msg.sender (address)
: 交易发送者地址 -
msg.sig (bytes4)
: 交易携带的数据calldata
前四个字节, 如果是合约方法调用的话,可以理解为函数选择器 -
msg.value (uint)
: 交易携带的wei
数量 -
tx.gasprice (uint)
: 交易的gasprice
, 等于basefee + maxPriorityFee
-
tx.origin (address)
: 交易的原始发起者地址
验证
-
assert(bool condition)
: 如果条件为假,则中止执行并恢复 状态更改(用于内部错误) -
require(bool condition)
: 如果条件为假,则中止执行并恢复状态更改(用于输入错误或外部组件错误) -
require(bool condition, string memory message)
: 如果条件为假(用于输入错误或外部组件错误),则中止执行并恢复状态更改。同时提供错误消息。 -
revert()
: 中止执行并恢复状态更改 -
revert(string memory message)
: 中止执行并恢复状态更改,提供错误信息。
数学和加密函数
-
keccak256(bytes memory) returns (bytes32)
: 计算 Keccak-256 哈希值 -
sha256(bytes memory) returns (bytes32)
: 计算 SHA-256 哈希值 -
ripemd160(bytes memory) returns (bytes20)
: 计算 RIPEMD-160 哈希值 -
ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)
: 从椭圆曲线签名中恢复与公钥相关联的地址,在错误时返回零 -
addmod(uint x, uint y, uint k) returns (uint)
: 计算(x + y) % k
-
mulmod(uint x, uint y, uint k) returns (uint)
: 计算(x * y) % k
合约
-
this
: 当前合约 -
super
: 父级合约 -
selfdestruct(address payable recipient)
: 销毁当前合约,并将其中资金发送到指定地址
type
-
type(C).name
: 合约名称 -
type(C).creationCode (bytes memory)
: 合约的创建字节码 -
type(C).runtimeCode (bytes memory)
: 合约的运行时字节码 -
type(I).interfaceId (bytes4)
: 接口的EIP-165
标识符 -
type(T).min (T)
: 整数类型T
最小值 -
type(T).max (T)
: 整数类型T
最大值
函数可见性
function myFunction() <visibility specifier> returns (bool) {
return true;
}
-
public
: 可以在任何地方调用,不管是内部还是外部 -
private
: 只能被合约内部调用 -
external
: 只能从合约外部调用 -
internal
: 能被合约内部调用,还能被继承的合约调用
Modifiers
-
pure
: 用于函数, 禁止修改或访问状态 -
view
: 用于函数, 禁止修改状态, 用于读取链上数据 -
payable
: 用于函数, 允许被调用时接收ETH
-
constant
: 用于状态变量, 禁止赋值(除了初始化),不占用存储槽位 -
immutable
: 用于状态变量, 允许在构建时进行赋值,并在部署后保持不变。存储于代码中 -
anonymous
: 用于事件:不将事件签名存储为日志主题 -
indexed
: 用于事件参数:将参数存储为在日志的topics
中,而不是日志的数据部分,在一个事件中,最多只能有 3 个indexed
参数 -
virtual
: 用于函数和修饰符(modifier
), 允许在子合约中改变函数或修饰符的行为 -
override
: 子合约中声明在函数、修饰符或公共状态变量会改变基础合约中的函数或修饰符的行为