跳到主要内容

速查表

内容来自 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: 子合约中声明在函数、修饰符或公共状态变量会改变基础合约中的函数或修饰符的行为