【区块链安全 | 第三十三篇】备忘单

在这里插入图片描述

备忘单

操作符优先级备忘单

以下是操作符的优先级顺序,按评估顺序列出:

优先级描述操作符
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:声明该函数、修饰符或公共状态变量修改了基合约中的行为

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值