摘要
Monad 是一个高度优化的系统,在所有维度上都引入了效率提升 —— 计算、状态访问和带宽利用。 然而,相对于传统 EVM 系统的乘数在所有维度上并不相等。因此,需要一些 opcode 的 gas 价格 调整,以便应用程序能够充分释放链的全部潜力。 为了尽量减少 gas 价格变更的数量,Monad 没有下调几乎所有 opcode 的 gas 定价, 而是上调了少数 opcode 的价格。这与打折几乎所有 opcode 具有相同的相对效果。 以下费用发生了变化: 所有其他费用与以太坊相同;evm.codes 是一个有用的参考。这些变更在 Monad 初始规范提案中涵盖。
为什么需要变更?
EVM 当前的定价模型需要调整以支持高性能、低费用的模式。定价模型根据每个 opcode 对系统感知的 成本为其分配权重(gas 数量),然后仅根据计算出的权重总和向用户收费。随着资源稀缺性的变化 —— 特别是在完全新系统的情况下 —— 这些权重必须进行修订。 本页面描述的变更做出了最小限度的调整,以允许 Monad 提供高性能和低费用, 同时最大限度地减少对用户的干扰,并保护系统免受 DOS 攻击。冷访问成本
为了考虑 Monad 执行客户端中从磁盘读取状态与计算相比相对较高的成本, “冷”账户和存储访问成本发生了变化:
由于 gas 成本的差异,以下 opcode 受到影响:
- 账户访问:
BALANCE、EXTCODESIZE、EXTCODECOPY、EXTCODEHASH、CALL、CALLCODE、DELEGATECALL、STATICCALL、SELFDESTRUCT - 存储访问:
SLOAD、SSTORE
Monad 中的暖账户访问(100 gas)和存储访问(100 gas)的 gas 成本与以太坊相同。
存储页
存储 slot 被分组为每页 128 个连续 slot。一个 slot 所在的页,是把 slot 索引最低 7 位剥除后的值:mapping 的每个 key 仍然解析到自己的页,但该 key 下存储的结构体字段共享同一页。
SLOAD
SSTORE
SSTORE 对页 I/O 和状态增长分别收费。所适用的组成部分累加:
状态增长在交易内按页取历史最高水位统计,因此在同一页中新建一个 slot 来替代此前清零的 slot 时,不会因增长而收费。 以太坊为写入全新 slot 收取的 20,000 gas 和为覆盖已有 slot 收取的 2900 gas 都不再适用。
成本示例
一次交易内针对同一账户的连续操作的成本:
一条 EIP-2930 访问列表条目会将所列 key 所在的整个页 预热,而
eth_createAccessList 会按页对存储 key 去重。
预编译
一些预编译被重新定价,以准确反映其在执行中的相对成本。
一个点是由
G1 和 G2 元素组成的 192 字节对,如 EIP-1108 所定义。
内存扩展
内存扩展按线性定价,并且交易可以使用的内存上限为 8 MB(8,388,608 字节)。
其中 是以 32 字节字为单位的内存大小。扩展到 8 MB 上限花费 131,072 gas。
内存在 call frame 之间累计:子调用可用的内存为 8 MB 减去当前调用及其父调用已使用的内存。 一旦调用返回,内存就返回到池中。
超出限制会异常终止 call frame,消耗该帧所获得的所有 gas 并回滚其状态变更。从调用者的角度来看, 这与普通的 gas 耗尽无法区分。
这些变更在
MONAD_NINE 修订版本中激活。
