速查表

运算符优先级顺序

以下是运算符优先级顺序,按评估顺序排列。

优先级

描述

运算符

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-解码提供的 data。类型以括号形式作为第二个参数给出。示例:(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))), ...)

bytesstring 成员

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)。

  • block.basefee (uint): 当前区块的基础费用 (EIP-3198EIP-1559)

  • block.blobbasefee (uint): 当前区块的 blob 基础费用 (EIP-7516EIP-4844)

  • block.chainid (uint): 当前链 ID

  • block.coinbase (address payable): 当前区块矿工的地址

  • block.difficulty (uint): 当前区块难度 (EVM < Paris)。对于其他 EVM 版本,它充当 block.prevrandao 的过时别名,将在下一个重大版本中删除

  • block.gaslimit (uint): 当前区块的 gas limit

  • block.number (uint): 当前区块编号

  • block.prevrandao (uint): 信标链提供的随机数 (EVM >= Paris) (参见 EIP-4399 )

  • block.timestamp (uint): 自 Unix 纪元以来的当前区块时间戳(以秒为单位)

  • gasleft() returns (uint256): 剩余 gas

  • msg.data (bytes): 完整的调用数据

  • msg.sender (address): 消息的发送方(当前调用)

  • msg.sig (bytes4): 调用数据的头四个字节(即函数标识符)

  • msg.value (uint): 消息发送的 wei 数

  • tx.gasprice (uint): 交易的燃气价格

  • tx.origin (address): 交易的发送方(完整调用链)

验证和断言

  • assert(bool condition): 如果条件为 false,则中止执行并回滚状态更改(用于内部错误)

  • require(bool condition): 如果条件为 false,则中止执行并回滚状态更改(用于格式错误的输入或外部组件中的错误)

  • require(bool condition, string memory message): 如果条件为 false,则中止执行并回滚状态更改(用于格式错误的输入或外部组件中的错误)。还会提供错误消息。

  • 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,其中加法使用任意精度执行,不会在 2**256 处环绕。从版本 0.5.0 开始断言 k != 0

  • mulmod(uint x, uint y, uint k) returns (uint): 计算 (x * y) % k,其中乘法使用任意精度执行,不会在 2**256 处环绕。从版本 0.5.0 开始断言 k != 0

类型信息

  • type(C).name (string): 合约的名称

  • 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: 在外部和内部可见(为存储/状态变量创建 getter 函数

  • private: 仅在当前合约中可见

  • external: 仅在外部可见(仅用于函数) - 即只能通过消息调用(通过 this.func

  • internal: 仅在内部可见

修饰符

  • pure 用于函数: 禁止修改或访问状态。

  • view 用于函数: 禁止修改状态。

  • payable 用于函数: 允许它们在调用时接收以太坊。

  • constant 用于状态变量: 禁止赋值(除了初始化),不占用存储槽位。

  • immutable 用于状态变量: 允许在构建时赋值,并在部署后为常量。存储在代码中。

  • anonymous 用于事件: 不将事件签名存储为主题。

  • indexed 用于事件参数: 将参数存储为主题。

  • virtual 用于函数和修饰符: 允许在派生合约中更改函数或修饰符的行为。

  • override: 说明此函数、修饰符或公共状态变量更改了基类合约中函数或修饰符的行为。