
备忘单
操作符优先级备忘单
以下是操作符的优先级顺序,按评估顺序列出:
| 优先级 | 描述 | 操作符 |
|---|---|---|
| 1 | 后缀递增和递减 | ++, -- |
| 新表达式 | new <typename> | |
| 数组下标 | <array>[<index>] | |
| 成员访问 | <object>.<member> | |
| 类似函数的调用 | <func>(<args...>) | |
| 括号 | (<statement>) | |
| 2 | 前缀递增和递减 | ++, -- |
| 一元减 | - | |
| 一元操作符 | delete | |
| 逻辑非 | ! | |
| 按位非 | ~ | |
| 3 | 指数运算 | ** |
| 4 | 乘法、除法和取余 | *, /, % |
| 5 | 加法和减法 | +, - |
| 6 | 按位移位操作符 | <<, >> |
| 7 | 按位与 | & |
| 8 | 按位异或 | ^ |
| 9 | 按位或 | ` |
| 10 | 不等式操作符 | <, >, <=, >= |
| 11 | 等式操作符 | ==, != |
| 12 | 逻辑与 | && |
| 13 | 逻辑或 | ` |
| 14 | 三元操作符 | <conditional> ? <if-true> : <if-false> |
| 赋值操作符 | =, ` | |
| 15 | 逗号操作符 | , |
ABI 编码和解码函数
-
abi.decode(bytes memory encodedData, (…)) returns (…): ABI 解码提供的数据。类型作为第二个参数传递。例如:(uint a, uint[2] memory b, bytes memory c) = abi.decode(data, (uint, uint[2], bytes))
-
abi.encode(…) returns (bytes memory): ABI 编码给定的参数。
-
abi.encodePacked(…) returns (bytes memory): 对给定的参数进行打包编码。注意,这种编码可能会产生歧义。
-
abi.encodeWithSelector(bytes4 selector, …) returns (bytes memory): ABI 编码给定的参数,从第二个开始并预先加上给定的四字节选择器。
-
abi.encodeCall(function functionPointer, (…)) returns (bytes memory): ABI 编码对 functionPointer 的调用,并使用元组中的参数。执行完整的类型检查,确保类型与函数签名匹配。结果等同于 abi.encodeWithSelector(functionPointer.selector, …)。
-
abi.encodeWithSignature(string memory signature, …) returns (bytes memory): 等同于 abi.encodeWithSelector(bytes4(keccak256(bytes(signature))), …)。
bytes 和 string 的成员
bytes.concat(…) returns (bytes memory): 将多个参数连接为一个字节数组。参考:
https://docs.soliditylang.org/en/latest/types.html#bytes-concat
string.concat(…) returns (string memory): 将多个参数连接为一个字符串数组。参考:
https://docs.soliditylang.org/en/latest/types.html#string-concat
Address 的成员
<address>.balance (uint256):该地址的余额(单位:Wei)
<address>.code (bytes memory):该地址上的合约字节码(可能为空)
<address>.codehash (bytes32):该地址上的代码哈希值
<address>.call(bytes memory) returns (bool, bytes memory):对该地址执行底层 CALL 操作,传入指定数据,返回是否成功及返回数据
<address>.delegatecall(bytes memory) returns (bool, bytes memory):对该地址执行底层 DELEGATECALL 操作,传入指定数据,返回是否成功及返回数据
<address>.staticcall(bytes memory) returns (bool, bytes memory):对该地址执行底层 STATICCALL 操作,传入指定数据,返回是否成功及返回数据
<address payable>.send(uint256 amount) returns (bool):向该地址发送指定数量的 Wei,失败时返回 false
<address payable>.transfer(uint256 amount):向该地址发送指定数量的 Wei,失败时会抛出异常
区块与交易属性
blockhash(uint blockNumber) returns (bytes32):返回指定区块号的区块哈希(仅支持最近 256 个区块)
blobhash(uint index) returns (bytes32):返回当前交易中第 index 个 blob 的版本化哈希。该哈希由一个版本字节(当前为 0x01)和 KZG 承诺的 SHA256 哈希的后 31 字节组成(见 EIP-4844)。若该索引不存在对应 blob,则返回 0。
block.basefee (uint):当前区块的基础手续费(参考 EIP-3198 与 EIP-1559)
block.blobbasefee (uint):当前区块的 blob 基础费用(参考 EIP-7516 与 EIP-4844)
block.chainid (uint):当前链的 Chain ID
block.coinbase (address payable):当前区块的矿工地址(出块奖励接收者)
block.difficulty (uint):当前区块的难度值(仅适用于 Paris 之前的 EVM 版本,在后续版本中会被
block.prevrandao 替代)
block.gaslimit (uint):当前区块的 gas 上限
block.number (uint):当前区块号
block.prevrandao (uint):信标链提供的伪随机数(适用于 Paris 之后的 EVM,见 EIP-4399)
block.timestamp (uint):当前区块的时间戳(自 Unix 纪元起的秒数)
gasleft() returns (uint256):当前剩余的 gas 数量
msg.data (bytes):完整的调用数据(calldata)
msg.sender (address):当前调用的发送者地址
msg.sig (bytes4):调用数据的前四个字节(即函数选择器)
msg.value (uint):此次调用携带的 Wei 数量
tx.gasprice (uint):交易的 gas 单价
tx.origin (address):最初发起交易的外部账户地址(完整调用链的源头)
校验和断言
1.assert(bool condition):如果条件为 false,终止执行并回滚状态更改(用于内部错误)
2.require(bool condition):如果条件为 false,终止执行并回滚状态更改(用于格式错误的输入或外部组件错误)
3.require(bool condition, string memory message):如果条件为 false,终止执行并回滚状态更改(用于格式错误的输入或外部组件错误),同时提供错误信息。
4.revert():终止执行并回滚状态更改
5.revert(string memory message):终止执行并回滚状态更改,并提供解释信息
数学和加密函数
1.keccak256(bytes memory) returns (bytes32):计算输入的 Keccak-256 哈希
2.sha256(bytes memory) returns (bytes32):计算输入的 SHA-256 哈希
3.ripemd160(bytes memory) returns (bytes20):计算输入的 RIPEMD-160 哈希
4.ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address):从椭圆曲线签名中恢复与公钥关联的地址,出错时返回零地址
5.addmod(uint x, uint y, uint k) returns (uint):计算 (x + y) % k,其中加法使用任意精度,不会在 2**256 处溢出。从 0.5.0 版本开始,要求 k != 0
6.mulmod(uint x, uint y, uint k) returns (uint):计算 (x * y) % k,其中乘法使用任意精度,不会在 2**256 处溢出。从 0.5.0 版本开始,要求 k != 0
合约相关
1.this(当前合约类型):当前合约,可以显式转换为 address 或 address payable
2.super:继承层次结构中高一级的合约
3.selfdestruct(address payable recipient):将所有资金发送到指定地址,并销毁合约(仅在 Cancun 升级前的 EVM 或在创建合约的交易中调用时有效)
类型信息
1.type©.name (string):合约 C 的名称
2.type©.creationCode (bytes memory):给定合约的创建字节码
3.type©.runtimeCode (bytes memory):给定合约的运行时字节码
4.type(I).interfaceId (bytes4):给定接口的 EIP-165 接口标识符
5.type(T).min (T):整数类型 T 可表示的最小值
6.type(T).max (T):整数类型 T 可表示的最大值
函数可见性说明符
function myFunction() <visibility specifier> returns (bool) {
return true;
}
1.public:外部和内部可见(对存储/状态变量自动生成 getter 函数)
2.private:仅在当前合约中可见
3.external:仅外部可见(仅用于函数),只能通过消息调用(this.func)
4.internal:仅内部可见
修饰符
1.pure 用于函数:不允许修改或访问状态
2.view 用于函数:不允许修改状态
3.payable 用于函数:允许在调用时接收以太币
4.constant 用于状态变量:不允许赋值(初始化除外),不占用存储槽
5.immutable 用于状态变量:构造时可赋值,部署后为常量,存储在代码中
6.anonymous 用于事件:不会将事件签名作为 topic 存储
7.indexed 用于事件参数:将参数作为 topic 存储
8.virtual 用于函数和修饰符:允许在派生合约中修改行为
9.override:声明该函数、修饰符或公共状态变量修改了基合约中的行为
2万+

被折叠的 条评论
为什么被折叠?



