EIP-3332: MEDGASPRICE 操作码
Authors | Justice Hudson (@jchancehud) |
---|---|
Created | 2021-03-05 |
Discussion Link | https://ethereum-magicians.org/t/medgasprice-opcode-eip/5480 |
简要总结
一个用于获取父区块的 median gas price 的操作码。
摘要
添加 MEDGASPRICE (0x46)
操作码,该操作码返回父区块的 median gas price。
动机
随着 rollups 作为扩展以太坊的核心机制的出现,存在许多常见的交易可能被抢跑。 Optimistic rollups 依赖于 fraud proofs 的提交来维持其系统的完整性。因此,提交 fraud proofs 的参与者通常会获得经济奖励。这就产生了一种简单的抢跑策略,即观察 mempool 中 fraud proof 的提交,并以更高的 gas price 复制这些交易以获取奖励。这种抢跑者不独立执行验证,并降低其他人执行验证的积极性。为交易强制执行 gas price 上限的机制可以有效地防御此类抢跑攻击。
考虑一个想要实现先到先得机制的智能合约。这种机制必须克服 gas price 市场中固有的 pay-to-win 性质。为交易强制执行最大 gas price 取决于以下事实:相同 gas price 的交易通常由以太坊矿工以先进先出的方式处理。合约目前设置最大 gas price 的选择很少:
- 以当前 gas price 的合理费率设置一个常量值
- 允许个人或一组人随着时间的推移调整最大 gas price
可能会构建更精细的方案,但所有方案都将涉及在链上存储 gas price 信息,从而增加交易数量并花费 Ether。
给定一个 median gas price 操作码,合约可以将最大 gas price 设置为最后一个区块 gas price 的函数。这可以使用如下策略轻松实现:
// 假设 block.medgasprice 绑定到 MEDGASPRICE (0x46)
function submitFraudProof(bytes calldata proof) public {
require(tx.gasprice <= maxGasPrice());
// 处理 fraud proof 并提供奖励(如果有效)
}
function maxGasPrice() public view returns (uint) {
return 3 * block.medgasprice;
}
给定上述合约实现,客户端只需调用 maxGasPrice
来确定提交 fraud proof 时要使用的 gas price。此特定实现允许使用最多为最后一个区块 median gas price 的 3 倍。
向前兼容性
EIP-1559 计划以多种方式改变费用市场。最值得注意的是创建了一个被销毁的 base fee。在这种情况下,“inclusion fee”仍然作为总费用的一部分存在。考虑以下两种情况:
区块大小正在增加(所有可用 gas 正在被消耗)
在这种情况下,inclusion fee 将存在竞标争夺,以激励矿工包含交易。 median gas price 运算符仍然有用,因为攻击者可以提供高 inclusion fee 来篡改诚实的交易。
区块大小正在减小(有剩余 gas 可用)
在这种情况下,攻击者可以指定高 inclusion fee 以激励矿工在区块中尽早包含他们的交易。矿工有动力这样做,因为首先包含昂贵的交易可以降低发生 revert(和部分退款)的风险。
鉴于这两种情况,此 EIP 在 EIP-1559 的上下文中似乎是相关的。
在 EIP-1559 之后,MEDGASPRICE (0x46)
应返回上一个区块的 median effective_gas_price
。
实现上述策略需要 EIP-3198。通过包含 BASEFEE (0x48)
,合约可以从 effective_gas_price
中减去 base_fee_per_gas
,以确定为交易支付的每个 gas 的 inclusion fee,从而实现上限。
规范
如果 block.number >= TBD
,则添加一个新的操作码 MEDGASPRICE (0x46)
:
将父区块的 median gas price 推送到堆栈上。
Op | Input | Output | Cost |
---|---|---|---|
0x46 | 0 | 1 | 8 |
理由
访问当前的 gas price 经济情况允许合约实现更强大和自动化的逻辑,围绕可接受的交易 gas price。
命名说明
选择名称 MEDGASPRICE
是因为网络的 median gas price 只能从最新的完整区块计算。因此,正在执行的交易应期望 median gas price 从上一个区块计算得出。
向后兼容性
没有已知的向后不兼容性问题。
安全注意事项
通过设置交易 gas price 的上限来防止抢跑的策略有一些注意事项:
- 它依赖于矿工的公正性。重新排序具有相同 gas price 的交易是破坏此策略的一种简单方法。
MEDGASPRICE (0x46)
返回的值可能在区块之间快速波动。如果交易没有立即包含,则可能会失败(如果 gas price 下降)或容易受到抢跑的影响(如果 gas price 增加)。
版权
在 CC0 下放弃版权和相关权利。
Citation
Please cite this document as:
Justice Hudson (@jchancehud), "EIP-3332: MEDGASPRICE 操作码 [DRAFT]," Ethereum Improvement Proposals, no. 3332, March 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3332.