Danksharding 中 PBS 方案的具体设计
来源 | ethresear.ch
译者注:目前新的分片方案 Danksharding 融合了 PBS (提议者/构建者分离方案) 和 crList 的设计。其中,PBS 方案的构造设计采用的是两个 slot 的 PBS,这也是 crList 的设计基础。关于这种“混合式 PBS” 的抗审查分析,可以参见《Vitalik: 如何提高 PBS 方案的交易抗审查性》。本文是两个 slot 的 PBS 方案的具体设计。
如果错失了一个信标区块,下一个 slot 会被换为信标区块而不是中间区块。
在发布出价那一步,构建者看到执行头部,并知道它是否安全 (如果有很多反对票或缺失的证明,这个执行头部可能是不安全的)。
在发布中间区块时,会有两种情况:
这确保了如果证明委员会是诚实的,且网络延迟没有非常严重的情况下,构建者就能保证:
构建者有大约 5.33—8 秒的时间发布区块。在他们看到信标区块时可以放心马上发布;但是,他们可能会想等看到更多证明时再发布,因为他们打包证明会得到奖励 (被打包的证明者也会得到奖励)。他们可以自由地在这段时间内 ( 即 5.33 秒的窗口,获得打包证明奖励与第 8 秒的窗口没能获得打包证明奖励)协商权衡。
get_random_proposer_index(state: State)
设为现在 get_beacon_proposer_index(state)
返回的内容。chosen_builder_index
和 chosen_exec_block_hash
。如果 slot 是空的,设 state.chosen_builder_index = NO_BUILDER
(一个等于 2**64 - 1
的常量)。如果 slot 包含一个信标区块,它会包含 BuilderBid
,设:
state.chosen_builder_index = builder_bid.message.builder_index
state.chosen_exec_block_hash = builder_bid.message.exec_block_hash
get_beacon_proposer_index(state: State)
的定义如下:
state.chosen_builder_index == NO_BUILDER
,返回 get_random_proposer_index(state)
state.chosen_builder_index
state.chosen_builder_index == NO_BUILDER
,这个区块需要包含一个 BuilderBid
,且可能不包含一个 ExecBody
。builder_bid
需要通过以下检查,且其中 val = state.validators[builder_bid.message.builder_index]
:
bls.Verify(val.pubkey, compute_signing_root(builder_bid.message), builder_bid.signature)
val.activation_epoch == FAR_FUTURE_EPOCH or val.withdrawable_epoch <= get_current_epoch(state)
val.balance >= builder_bid.bid_amount
val.balance -= builder_bid.bid_amount
state.validators[get_beacon_proposer_index(state)].balance += builder_bid.bid_amount
get_committee_count_per_slot
改为接受输入 (state: BeaconState, slot: Slot)
( 而不是 epoch )。如果一个 slot 出现 state.chosen_builder_index == NO_BUILDER
,委员会数应该返回 1。state.chosen_builder_index != NO_BUILDER
,区块需要包含一个 ExecBody
且可能不包含 BuilderBid
。ExecBody
需要通过以下的检查:
hash_tree_root(exec_body) == state.chosen_exec_block_hash
eth1_validate(exec_body, pre_state=state.latest_exec_state_root)
state.latest_exec_state_root = exec_body.post_state_root
get_committee_count_per_slot
应该返回 (get_epoch_committee_count(epoch) - state.committees_in_this_epoch_so_far) // (slots_remaining_in_epoch)
state.chosen_builder_index != NO_BUILDER
,设 state.chosen_builder_index = NO_BUILDER
,无论是否有区块。如果中间区块的构建者在 slot N 不发布区块,在 slot N+1 就没有交易捆可选。整个提议者序列会被往后推一个 slot (因此 slot N+1 的构建者会变成 slot N+2 的提议者,以此类推),且 slot N+1 需要选出一个新的随机提议者。构建者会获得另一个机会 (即额外的 12 秒作为松弛空间) 来发布。该 slot N+1 执行区块不能包含任何高价值的共识交易 (例如罚没)。但是,他们会被罚款 block.basefee * block.target_gas_limit
。
原因是他们的执行区块被延迟了一个 slot,并前置了一个空的执行区块,因此他们需要为这个 slot 付费。提议者序列被延迟确保延迟某个提议者的执行区块对于当被提议的区块是高价值时窃取未来的提议权是没用的。
ECN的翻译工作旨在为中国以太坊社区传递优质资讯和学习资源,文章版权归原作者所有,转载须注明原文出处以及ethereum.cn,若需长期转载,请联系eth@ecn.co进行授权。
本文首发于:https://news.ethereum.cn/Eth2/two-slot-proposer-builder-separation
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!