EIP-4399: 用 PREVRANDAO 替代 DIFFICULTY 操作码
通过替换 DIFFICULTY 操作码的语义,在 EVM 中公开信标链随机性
Authors | Mikhail Kalinin (@mkalinin), Danny Ryan (@djrtwo) |
---|---|
Created | 2021-10-30 |
Requires | EIP-3675 |
Table of Contents
摘要
本 EIP 替换了现有 DIFFICULTY (0x44)
操作码的返回值语义,并将操作码重命名为 PREVRANDAO (0x44)
。
此更改后,DIFFICULTY (0x44)
指令的返回值是由信标链提供的随机性信标的输出。
动机
应用程序可以受益于使用信标链累积的随机性。因此,EVM 中应可访问由信标链产生的随机性输出。
在 EIP-3675 中描述的权益证明(PoS)升级的 TRANSITION_BLOCK
时刻,difficulty
区块字段 必须 在此后为 0
,因为区块上不再有任何工作量证明(PoW)封印。这意味着 DIFFICULTY (0x44)
指令不再具有其先前的语义含义,也没有明确的“正确”返回值。
鉴于之前对 DIFFICULTY
使用情况的分析,该指令的值与其他值混合是智能合约用于获取随机性的常见模式。与 DIFFICULTY
操作码编号相同的指令返回信标链 RANDAO 实现的输出,使得升级到 PoS 与从 DIFFICULTY
指令获取随机性的现有智能合约向后兼容。
此外,此 EIP 提出的更改允许智能合约确定是否已发生升级到 PoS。这可以通过分析 DIFFICULTY
指令的返回值来完成。大于 2**64
的值表示该交易正在 PoS 区块中执行。如果包含相关交易的区块数据可用,反编译器和其他类似工具也可以使用此技巧来辨别该指令的新语义。
规范
定义
TRANSITION_BLOCK
该区块的定义可以在 EIP-3675 的定义部分中找到。
区块结构
从 TRANSITION_BLOCK
开始,客户端软件 必须 将 mixHash
的值,即区块头中编号为 13
(从 0 开始索引)的字段,设置为前一个区块的后信标状态的最新 RANDAO 混合值。
EVM
从 TRANSITION_BLOCK
开始,DIFFICULTY (0x44)
指令 必须 返回 mixHash
字段的值。
注意:DIFFICULTY (0x44)
操作码的 gas 成本保持不变。
重命名
mixHash
字段 应该 进一步重命名为 prevRandao
。
DIFFICULTY (0x44)
操作码 应该 进一步重命名为 PREVRANDAO (0x44)
。
理由
在区块头中包含 RANDAO 输出
在区块头中包含 RANDAO 输出提供了一种直接的方法,可以从 EVM 内部访问它,因为区块头数据已经在 EVM 上下文中可用。
此外,这确保了执行层可以仅使用该区块完全执行,而无需从 PoS 共识层获得额外的输入。
将随机性混合到区块头中可能有助于区块哈希的唯一性,以防区块头的其他字段的值与另一个区块头对应的值匹配。
使用 mixHash
字段而不是 difficulty
使用 mixHash
头部字段而不是 difficulty
以避免 PoS 升级后的一类隐藏的 forkchoice 错误。
实现 pre-EIP-3675 逻辑的客户端软件严重依赖 difficulty
值,因为总难度计算是 PoW 分叉选择规则的基础。在 PoS 升级时将 difficulty
字段设置为 0
旨在减少与升级后总难度值增长相关的错误范围。
此外,如果在 PoS 升级后任何潜在的总难度计算都将取代 difficulty
字段的值,则很容易出现溢出。
重用现有字段而不是附加新字段
mixHash
字段在 PoS 升级时已弃用,此后设置为零字节数组。将现有字段重新用作随机性输出的位置,每个区块可节省 32 字节,并有效地消除了由升级引起的某个字段的弃用。
重用 DIFFICULTY
操作码而不是引入新的操作码
请参见 动机。
重命名字段和操作码
应该进行重命名以使字段和操作码名称在语义上合理。
使用 TRANSITION_BLOCK
而不是区块或插槽号
通过利用 TRANSITION_BLOCK
来触发本 EIP 中定义的逻辑变更,而不是区块或插槽号,本 EIP 与 EIP-3675 定义的 PoS 升级紧密相关。
通过与 PoS 升级紧密结合,我们确保对于随机性使用此操作码没有不连续性 - 这是重用 DIFFICULTY
而不是创建新操作码的主要动机。
使用 2**64
阈值来确定 PoS 区块
RANDAO 值落在 0
和 2**64
之间的范围内,因此与 PoW 难度值混合的概率非常低。虽然,提议的阈值似乎与以太坊主网上的难度值没有足够的距离(目前约为 2**54
),但它需要算力增加一千倍才能使此阈值不安全。预计在即将到来的共识升级之前不可能发生这种增长。
向后兼容性
本 EIP 引入了对 EVM 状态转换的执行和验证的向后不兼容的更改。如此编写,本 EIP 利用 TRANSITION_BLOCK
,因此与 EIP-3675 中引入的 PoS 升级紧密相关。如果要采纳此 EIP,则 必须 与 EIP-3675 同时安排。
此外,对于以下类别的应用程序,建议的更改可能向后不兼容:
- 使用
DIFFICULTY
操作码返回的值作为 PoWdifficulty
参数的应用程序 - 逻辑依赖于
DIFFICULTY
操作码返回相对于字段的完整 256 位大小的相对较小的数字的应用程序。
第一类已经受到将共识机制切换到 PoS 的影响,并且本规范未引入其他破坏性更改。
第二类由在可能导致溢出或下溢错误的操作中使用 DIFFICULTY
操作码返回值的应用程序组成。虽然理论上可以编写一个应用程序,其中此操作码可能返回的值范围的变化可能导致安全漏洞,但这种可能性微乎其微。
测试用例
- 在
TRANSITION_BLOCK
的一个祖先中,部署一个将DIFFICULTY (0x44)
的返回值存储到状态的合约 - 检查在
TRANSITION_BLOCK
的父节点中执行的交易中DIFFICULTY (0x44)
返回的值是否等于difficulty
字段值 - 检查在
TRANSITION_BLOCK
中执行的交易中PREVRANDAO (0x44)
返回的值是否等于prevRandao
字段值
安全考虑
PoS 以太坊(基于信标链 RANDAO 实现)中的 PREVRANDAO (0x44)
操作码是一种随机性来源,与 PoW 网络中 BLOCKHASH (0x40)
或 DIFFICULTY (0x44)
操作码提供的随机性具有不同的属性。
可偏置性
信标链 RANDAO 实现为每个区块提议者每个插槽提供 1 位的影响力。提议者可以故意拒绝提议区块,以机会成本为代价,提议者和交易费用以防止信标链随机性(一个 RANDAO 混合)在特定插槽中被更新。
提议者影响力的影响在时间上是有限的,并且持续到之后进行第一次诚实的 RANDAO 显示为止。当 n
个连续插槽的提议者串通以获得 n
位的影响力时,也存在此限制。简而言之,即使 RANDAO 在连续几个插槽中被偏置,一个诚实的区块提议也足以消除 RANDAO 的偏置。
此外,PREVRANDAO (0x44)
指令的语义为提议者提供了另一种在应用程序上获得 1 位影响力的方式。有偏见的提议者可以审查一个掷骰子的交易,以强制将其包含到下一个区块中,因此,强制其使用提议者预先知道的 RANDAO 混合。在这种情况下,机会成本将微不足道。
可预测性
显然,任何去中心化预言机提供的历史随机性都是 100% 可预测的。相反,未来揭示的随机性在有限的程度上是可预测的。
影响信标链上未来随机性的输入列表包括但不限于以下项目:
- 累积的随机性。 由信标链在 epoch
N
的最后一个插槽中产生的 RANDAO 混合是定义 epochN + MIN_SEED_LOOKAHEAD + 1
的每个插槽中的区块提议者的函数的主要输入,即它是定义未来 RANDAO 揭示者的主要因素。 - 活动验证者的数量。 整个 epoch 中的活动验证者的数量是区块提议者函数的另一个输入。
- 有效余额。 在所有其他因素相同的情况下,验证者的有效余额越低,该验证者被指定为插槽中的提议者的机会就越低。
- 意外错过的提议。 网络状况和其他导致意外错过提议的因素是高度定性的熵的来源,会影响 RANDAO 混合。主网上的通常错过提议率为
1%
左右。
这些输入可能在短时间内的插槽范围内是可预测和可塑的,但尝试的提前越多,信标链累积的熵就越多。
给应用程序开发者的提示
以下提示试图减少 PREVRANDAO (0x44)
返回的随机性输出的可预测性和可偏置性:
- 使您的应用程序依赖于具有相当高的提前量的未来随机性。例如,应用程序在 epoch
K
结束时停止接受投标,并使用在插槽K + N + ε
中产生的 RANDAO 混合来掷骰子,其中N
是 epoch 中的提前量,ε
是 epochN + 1
中的几个插槽。 - 至少四个 epoch 的提前量会导致以下结果:
- 在 epoch
K
结束时,epochN + 1
的提议者集未知,从而打破了投标者和掷骰者之间的直接联系 - 在每个 epoch 结束时更新活动验证者的数量,从而影响下一 epoch 的提议者集,从而影响应用程序用于掷骰子的 RANDAO 混合
- 由于主网统计信息,在此期间网络意外错过提议的机会约为
100%
,这降低了用于掷骰子的 RANDAO 混合的可预测性。
- 在 epoch
- 将
ε
设置为一个小数,例如 2 或 4 个插槽,会给第三方一点时间来影响用于掷骰子的未来随机性。此时间由MIN_SEED_LOOKAHEAD
参数定义,在主网上约为 6 分钟。
在投标和掷骰子之间保持相当高的距离试图减少投标者控制一部分验证者以直接利用其影响力的机会。最终,这种机会取决于游戏的类型和控制的验证者的数量。例如,单个验证者影响一次性游戏的机会可以忽略不计,并且在重复游戏场景中,多个验证者的机会会变大。
版权
通过 CC0 放弃版权及相关权利。
Citation
Please cite this document as:
Mikhail Kalinin (@mkalinin), Danny Ryan (@djrtwo), "EIP-4399: 用 PREVRANDAO 替代 DIFFICULTY 操作码," Ethereum Improvement Proposals, no. 4399, October 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4399.