速查表
运算符优先级顺序
以下是运算符优先级顺序,按评估顺序排列。
优先级 |
描述 |
运算符 |
---|---|---|
1 |
后缀增量和减量 |
|
新表达式 |
|
|
数组下标 |
|
|
成员访问 |
|
|
函数式调用 |
|
|
括号 |
|
|
2 |
前缀增量和减量 |
|
一元负号 |
|
|
一元运算符 |
|
|
逻辑非 |
|
|
按位非 |
|
|
3 |
指数运算 |
|
4 |
乘法、除法和模运算 |
|
5 |
加法和减法 |
|
6 |
按位移位运算符 |
|
7 |
按位与 |
|
8 |
按位异或 |
|
9 |
按位或 |
|
10 |
不等式运算符 |
|
11 |
等式运算符 |
|
12 |
逻辑与 |
|
13 |
逻辑或 |
|
14 |
三元运算符 |
|
赋值运算符 |
|
|
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))), ...)
bytes
和 string
成员
bytes.concat(...) returns (bytes memory)
: 将可变数量的参数连接到一个字节数组string.concat(...) returns (string memory)
: 将可变数量的参数连接到一个字符串数组
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.blobbasefee
(uint
): 当前区块的 blob 基础费用 (EIP-7516 和 EIP-4844)block.chainid
(uint
): 当前链 IDblock.coinbase
(address payable
): 当前区块矿工的地址block.difficulty
(uint
): 当前区块难度 (EVM < Paris
)。对于其他 EVM 版本,它充当block.prevrandao
的过时别名,将在下一个重大版本中删除block.gaslimit
(uint
): 当前区块的 gas limitblock.number
(uint
): 当前区块编号block.prevrandao
(uint
): 信标链提供的随机数 (EVM >= Paris
) (参见 EIP-4399 )block.timestamp
(uint
): 自 Unix 纪元以来的当前区块时间戳(以秒为单位)gasleft() returns (uint256)
: 剩余 gasmsg.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
。
类型信息
函数可见性说明符
function myFunction() <visibility specifier> returns (bool) {
return true;
}
public
: 在外部和内部可见(为存储/状态变量创建 getter 函数)private
: 仅在当前合约中可见external
: 仅在外部可见(仅用于函数) - 即只能通过消息调用(通过this.func
)internal
: 仅在内部可见
修饰符
pure
用于函数: 禁止修改或访问状态。view
用于函数: 禁止修改状态。payable
用于函数: 允许它们在调用时接收以太坊。constant
用于状态变量: 禁止赋值(除了初始化),不占用存储槽位。immutable
用于状态变量: 允许在构建时赋值,并在部署后为常量。存储在代码中。anonymous
用于事件: 不将事件签名存储为主题。indexed
用于事件参数: 将参数存储为主题。virtual
用于函数和修饰符: 允许在派生合约中更改函数或修饰符的行为。override
: 说明此函数、修饰符或公共状态变量更改了基类合约中函数或修饰符的行为。