EVM 中的信标区块根

该EIP提案旨在将信标链区块的哈希树根(parent_beacon_block_root)引入到以太坊执行层区块头中,并通过一个系统智能合约(BEACON_ROOTS_ADDRESS)以环形缓冲区的方式存储这些根的历史记录,从而为EVM提供对共识层状态的信任最小化访问,支持质押池、重质押和跨链桥等多种用例。

markdown

摘要

将每个信标链区块的哈希树根提交到相应的执行负载头中。

将这些根中的每一个存储在一个智能合约中。

动机

信标链区块的根是加密累加器,允许对任意共识状态进行证明。 在 EVM 内部公开这些根允许对共识层进行信任最小化的访问。 此功能支持多种用例,可改善质押池、 再质押结构、智能合约桥接、MEV 缓解等方面的信任假设。

规范

常量
FORK_TIMESTAMP 1710338135
HISTORY_BUFFER_LENGTH 8191
SYSTEM_ADDRESS 0xfffffffffffffffffffffffffffffffffffffffe
BEACON_ROOTS_ADDRESS 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02

背景

高层次的思路是每个执行区块都包含父信标区块的根。即使自上一个区块根以来出现了漏块 (missed slots),区块根也不会改变, 我们只需要恒定大小的空间来在每个执行区块中表示这个“预言机”。为了提高这个预言机的可用性, 合约中存储了少量区块根历史。

为了限制此结构消耗的存储量,使用了一个环形缓冲区,它反映了共识层上的区块根累加器。

区块结构和有效性

从执行时间戳 $FORK\_TIMESTAMP$ 开始,执行客户端必须使用一个附加字段扩展头 schema:$parent\_beacon\_block\_root$。 该根占用 $32$ 字节,并且正是给定执行区块的父信标区块的 哈希树根

因此,头的 RLP 编码结果为:

rlp([
    parent_hash,
    0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347, # ommers hash (叔块哈希)
    coinbase,
    state_root,
    txs_root,
    receipts_root,
    logs_bloom,
    0, # difficulty (难度)
    number,
    gas_limit,
    gas_used,
    timestamp,
    extradata,
    prev_randao,
    0x0000000000000000, # nonce
    base_fee_per_gas,
    withdrawals_root,
    blob_gas_used,
    excess_blob_gas,
    parent_beacon_block_root,
])

父信标区块根的有效性由共识层保证,就像处理提款一样。

当验证区块时,执行客户端必须确保区块头中的根值与共识客户端提供的值匹配。

对于没有现有 $parent\_beacon\_block\_root$ 的创世区块,使用 $32$ 个零字节作为根占位符。

信标根合约

信标根合约有两个操作:getset。输入本身不用于确定要执行哪个函数,而是使用 $caller$ 的结果。如果 $caller$ 等于 $SYSTEM\_ADDRESS$,则执行的操作是 set。否则,执行 get

get
  • 调用者提供查询的 $timestamp$,以 $32$ 字节大端格式编码。
  • 如果输入不正好是 $32$ 字节,合约必须 revert。
  • 如果输入等于 $0$,合约必须 revert。
  • 给定 $timestamp$,合约通过计算模数 $timestamp \% HISTORY\_BUFFER\_LENGTH$ 来计算存储 $timestamp$ 的存储索引,并读取该值。
  • 如果 $timestamp$ 不匹配,合约必须 revert。
  • 最后,与 $timestamp$ 关联的信标根将返回给用户。它存储在 $timestamp \% HISTORY\_BUFFER\_LENGTH + HISTORY\_BUFFER\_LENGTH$ 处。
set
  • 调用者提供父信标区块根作为 calldata 到合约。
  • $header.timestamp \% HISTORY\_BUFFER\_LENGTH$ 处的存储值设置为 $header.timestamp$
  • $header.timestamp \% HISTORY\_BUFFER\_LENGTH + HISTORY\_BUFFER\_LENGTH$ 处的存储值设置为 $calldata[0:32]$
伪代码

if evm.caller == SYSTEM_ADDRESS:
    set()
else:
    get()

def get():
    if len(evm.calldata) != 32:
        evm.revert()

    if to_uint256_be(evm.calldata) == 0:
        evm.revert()

    timestamp_idx = to_uint256_

>- 原文链接: [github.com/nerolation/EI...](https://github.com/nerolation/EIPs/blob/toni/snap-2/EIPS/eip-4788.md)
>- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Nerolation
Nerolation
江湖只有他的大名,没有他的介绍。