速查表¶
运算符的优先级¶
以下是运算符的优先级顺序,按求值顺序列出。
Precedence |
Description |
Operator |
---|---|---|
1 |
Postfix increment and decrement |
|
New expression |
|
|
Array subscripting |
|
|
Member access |
|
|
Function-like call |
|
|
Parentheses |
|
|
2 |
Prefix increment and decrement |
|
Unary minus |
|
|
Unary operations |
|
|
Logical NOT |
|
|
Bitwise NOT |
|
|
3 |
Exponentiation |
|
4 |
Multiplication, division and modulo |
|
5 |
Addition and subtraction |
|
6 |
Bitwise shift operators |
|
7 |
Bitwise AND |
|
8 |
Bitwise XOR |
|
9 |
Bitwise OR |
|
10 |
Inequality operators |
|
11 |
Equality operators |
|
12 |
Logical AND |
|
13 |
Logical OR |
|
14 |
Ternary operator |
|
Assignment operators |
|
|
15 |
Comma operator |
|
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)
: 对给定参数执行 packed encoding。请注意,这种编码可能会产生歧义!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
-th blob 的版本哈希。 版本哈希由一个表示版本的单字节(当前为0x01
)和 KZG 承诺的 SHA256 哈希的最后 31 字节组成(EIP-4844)。 如果不存在具有给定索引的 blob,则返回零。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 限制block.number
(uint
): 当前区块编号block.prevrandao
(uint
): 由信标链提供的随机数(EVM >= Paris
)(见 EIP-4399)block.timestamp
(uint
): 自 Unix 纪元以来的当前区块时间戳(以秒为单位)gasleft() returns (uint256)
: 剩余 gasmsg.data
(bytes
): 完整的 calldatamsg.sender
(address
): 消息的发送者(当前调用)msg.sig
(bytes4
): calldata 的前四个字节(即函数标识符)msg.value
(uint
): 随消息发送的 wei 数量tx.gasprice
(uint
): 交易的 gas 价格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
。
与合约相关¶
this
(当前合约的类型): 当前合约,显式可转换为address
或address payable
super
: 继承层次结构中一个级别更高的合约selfdestruct(address payable recipient)
: 将所有资金发送到给定地址,并(仅在 Cancun 之前的 EVM 或在创建合约的交易中调用时)销毁合约。
类型信息¶
函数可见性说明符¶
function myFunction() <visibility specifier> returns (bool) {
return true;
}
public
: 在外部和内部可见(为存储/状态变量创建 getter 函数)private
: 仅在当前合约中可见external
: 仅在外部可见(仅适用于函数) - 即只能通过消息调用(通过this.func
)internal
: 仅在内部可见
修改器¶
pure
用于函数: 不允许修改或访问状态。view
用于函数: 不允许修改状态。payable
用于函数: 允许它们在调用时接收以太币。constant
用于状态变量: 不允许赋值(除初始化外),不占用存储槽。immutable
用于状态变量: 允许在构造时赋值,并在部署时保持不变。存储在代码中。anonymous
用于事件: 不将事件签名存储为主题。indexed
用于事件参数: 将参数存储为主题。virtual
用于函数和修改器: 允许在派生合约中更改函数或修改器的行为。override
: 表示此函数、修改器或公共状态变量更改了基合约中函数或修改器的行为。