本EIP提议在以太坊PoS升级后,将DIFFICULTY (0x44)操作码更名为PREVRANDAO (0x44)并改变其语义,使其返回信标链的随机数输出。这旨在为依赖DIFFICULTY获取随机数的现有智能合约提供向后兼容性,并允许合约检测PoS升级,同时详细阐述了新随机数来源的安全性考量及其使用建议。
本 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 混合值。
从 TRANSITION_BLOCK 开始,DIFFICULTY (0x44) 指令必须返回 mixHash 字段的值。
注意:DIFFICULTY (0x44) 操作码的 Gas 成本保持不变。
mixHash 字段应该进一步重命名为 prevRandao。
DIFFICULTY (0x44) 操作码应该进一步重命名为 PREVRANDAO (0x44)。
在区块头中包含 RANDAO 输出提供了一种从 EVM 内部访问它的直接方法,因为区块头数据已在 EVM 上下文中可用。
此外,这确保了执行层可以仅通过区块完全执行,而无需共识层提供额外的输入。
将随机性混合到区块头中,可能有助于在区块头其他字段的值与另一个区块头中的相应值匹配的情况下,增加区块哈希的唯一性。
mixHash 字段而不是 difficulty使用 mixHash 头字段而不是 difficulty 是为了避免 PoS 升级后一类隐藏的分叉选择错误。
实现 EIP-3675 之前逻辑的客户端软件严重依赖于 difficulty 值,因为总难度计算是 PoW 分叉选择规则的基础。在 PoS 升级时将 difficulty 字段设置为 0,旨在减少升级后总难度值增长相关的错误表面。
此外,如果随机性输出取代了 difficulty 字段的值,PoS 升级后任何潜在的总难度计算都将容易发生溢出。
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 操作码返回的值作为 PoW difficulty 参数的应用程序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 的偏置,即使它在连续几个槽位中被偏置。
此外,PREVRANDAO (0x44) 指令的语义为提议者提供了另一种对应用程序施加 1 比特影响力的方式。有偏见的提议者可能会审查一个掷骰子交易,强制其包含在下一个区块中,从而强制它使用提议者预先知道的 RANDAO 混合值。在这种情况下,机会成本可以忽略不计。
显然,任何去中心化预言机提供的历史随机性都是 100% 可预测的。相反,未来揭示的随机性在有限程度上是可预测的。
影响信标链未来随机性的输入列表包括但不限于以下项目:
N 的最后一个槽位产生的 RANDAO 混合值是定义纪元 N + MIN_SEED_LOOKAHEAD + 1 中每个槽位的区块提议者的主要输入,即它是定义未来 RANDAO 揭示者的主要因素。1%。这些输入在短期槽位内可能是可预测和可塑的,但尝试的前瞻时间越长,信标链积累的熵就越多。
以下提示旨在减少 PREVRANDAO (0x44) 返回的随机性输出的可预测性和可偏置性:
K 结束时停止接受投标,并使用在槽位 K + N + ε 产生的 RANDAO 混合值来掷骰子,其中 N 是以纪元为单位的前瞻,ε 是纪元 N + 1 中的几个槽位。N + 1 的提议者集合在纪元 K 结束时是未知的,打破了投标者和掷骰者之间的直接联系100%,这降低了用于掷骰子的 RANDAO 混合值的可预测性。ε 设置为一个较小的数字,例如 2 或 4 个槽位,给第三方留下了很少的时间来对用于掷骰子的未来随机性施加影响力。这段时间由 MIN_SEED_LOOKAHEAD 参数定义,在主网上大约是 6 分钟。投标和掷骰子之间合理高的距离旨在使控制一部分验证者的投标者直接利用其影响力的机会很小。最终,这种机会取决于游戏的类型和受控验证者的数量。例如,单个验证者影响一次性游戏的机会微乎其微,而在重复游戏场景中,多个验证者的机会则会变大。
通过 CC0 放弃版权及相关权利。
- 原文链接: github.com/nerolation/EI...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!