跳转到主要内容
Change page

区块提议

区块是区块链的基本单位。区块是在节点之间传递、达成共识并添加到每个节点数据库的离散信息单元。本页面将解释它们是如何产生的。

前提条件

区块提议是权益证明 (PoS) 协议的一部分。为了帮助理解本页面,我们建议你阅读有关权益证明区块架构的内容。

谁产生区块?

验证者账户提议区块。验证者账户由节点操作员管理,他们运行验证者软件作为其执行客户端和共识客户端的一部分,并且已经向存款合约存入了至少 32 个 ETH。然而,每个验证者只是偶尔负责提议区块。以太坊以时隙和时段来衡量时间。每个时隙为 12 秒,32 个时隙(6.4 分钟)组成一个时段。每个时隙都是在以太坊上添加新区块的机会。

随机选择

在每个时隙中,会伪随机地选择一个验证者来提议区块。区块链中不存在真正的随机性,因为如果每个节点都生成真正的随机数,它们就无法达成共识。相反,其目的是使验证者选择过程不可预测。以太坊上的随机性是通过一种名为 RANDAO 的算法实现的,该算法将来自区块提议者的哈希与每个区块更新的种子混合在一起。该值用于从总验证者集中选择特定的验证者。验证者的选择会提前两个时段固定下来,以此作为防止某些类型的种子操纵的保护措施。

尽管验证者在每个时隙都会向 RANDAO 添加数据,但全局 RANDAO 值每个时段仅更新一次。为了计算下一个区块提议者的索引,RANDAO 值与时隙编号混合,从而在每个时隙中给出一个唯一值。单个验证者被选中的概率并非简单的 1/N(其中 N = 活跃验证者总数)。相反,它是根据每个验证者的有效 ETH 余额进行加权的。最大有效余额为 32 个 ETH(这意味着 balance < 32 ETH 的权重低于 balance == 32 ETH,但 balance > 32 ETH 的权重不会高于 balance == 32 ETH)。

每个时隙只选择一个区块提议者。在正常情况下,单个区块生产者在其专用时隙中创建并发布单个区块。为同一个时隙创建两个区块是一种可罚没的违规行为,通常被称为“双签”。

区块是如何创建的?

区块提议者需要广播一个签名的信标区块,该区块根据其本地运行的分叉选择算法的视图,构建在链的最新头部之上。分叉选择算法应用上一个时隙遗留下来的任何排队证明,然后找到其历史记录中累积证明权重最大的区块。该区块就是提议者创建的新区块的父区块。

区块提议者通过从其本地数据库和链视图中收集数据来创建区块。区块的内容如下面的代码片段所示:

randao_reveal 字段采用一个可验证的随机值,该值由区块提议者通过对当前时段编号进行签名来创建。eth1_data 是对区块提议者关于存款合约视图的投票,包括存款默克尔树的根以及使新存款能够被验证的存款总数。graffiti 是一个可选字段,可用于向区块添加消息。proposer_slashingsattester_slashings 字段包含根据提议者的链视图,某些验证者犯下可罚没违规行为的证明。deposits 是区块提议者已知的新验证者存款列表,而 voluntary_exits 是区块提议者在共识层八卦网络上听说的希望退出的验证者列表。sync_aggregate 是一个向量,显示哪些验证者之前被分配到同步委员会(为轻客户端数据提供服务的验证者子集)并参与了数据签名。

execution_payload 使得有关交易的信息能够在执行客户端和共识客户端之间传递。execution_payload 是嵌套在信标区块内的一块执行数据。execution_payload 内的字段反映了以太坊黄皮书中概述的区块结构,不同之处在于没有叔块 (ommers),并且存在 prev_randao 代替了 difficulty。执行客户端可以访问其在自己的八卦网络上听说的本地交易池。这些交易在本地执行,以生成称为后状态 (post-state) 的更新状态树。这些交易作为名为 transactions 的列表包含在 execution_payload 中,而后状态则提供在 state-root 字段中。

所有这些数据都被收集在一个信标区块中,进行签名,并广播给区块提议者的对等节点,后者再将其传播给他们的对等节点,依此类推。

阅读更多关于区块剖析的内容。

区块会发生什么?

区块被添加到区块提议者的本地数据库中,并通过共识层八卦网络广播给对等节点。当验证者收到区块时,它会验证其中的数据,包括检查区块是否具有正确的父区块、是否对应于正确的时隙、提议者索引是否符合预期、RANDAO 揭示是否有效以及提议者是否未被罚没。execution_payload 被解包,验证者的执行客户端重新执行列表中的交易,以检查提议的状态更改。假设区块通过了所有这些检查,每个验证者都会将该区块添加到自己的规范链中。然后,该过程在下一个时隙中重新开始。

区块奖励

区块提议者会因其工作获得报酬。有一个 base_reward,它是根据活跃验证者的数量及其有效余额计算得出的函数。然后,区块提议者会为区块中包含的每个有效证明获得一小部分 base_reward;证明该区块的验证者越多,区块提议者的奖励就越大。举报应被罚没的验证者也会获得奖励,每罚没一个验证者,奖励等于 1/512 * effective balance

更多关于奖励和惩罚的内容

进一步阅读