Proof-of-Stake

乙太坊 2.0 如何選擇區塊提議者?

  • May 26, 2020

我正在為大學做一些關於乙太坊 2.0 的研究。我想我理解它的工作方式,但我對插槽中的提議者選擇感到困惑,尤其是在閱讀了這裡的程式碼之後:https ://github.com/ethereum/eth2.0-specs

據我了解,在插槽開始時,驗證器通過使用compute_proposer_index來檢查他是否是提議者,該計算將信標狀態、驗證器序列和種子作為參數。一般來說,所有資訊都來自信標狀態:slot、epoch、randao_mixes、活動驗證者列表……

我的問題是:假設狀態僅隨著一個塊(如 eth 1)發生變化,如果提議者在其插槽期間沒有發送塊,保持相同的狀態,那麼下一個提議者是如何選擇的?隨機變數不應該保持不變,導致同一個提議者一遍又一遍地選舉,直到他發出一個塊?

範例:我在插槽 500,因此狀態設置為插槽:500;根據我在狀態中獲得的資訊,下一個提議者應該是 X,但是在插槽 501 X 離線並且狀態不變:如果在插槽 502 我再次執行程式碼我應該再次獲得 X,因為沒有任何變化,並且區塊鏈卡住,直到 X 重新上線。

Ofc 不是這樣的,我錯過了一些東西,我只是看不到什麼。你能幫助我嗎?提前謝謝了。

如果提議者在其時隙期間沒有發送塊,保持相同的狀態,那麼如何選擇下一個提議者?

不會保持相同的狀態,每個插槽都有不同的狀態。get_beacon_proposer_index函式用於播種state.slot提議者洗牌。

如果提議者未能在 slot 發布塊n,則下一個 slot 的提議者將在 slot 狀態上建構他們的塊n + 1

範例:我在插槽 500,因此狀態設置為插槽:500;根據我在狀態中獲得的資訊,下一個提議者應該是 X,但是在插槽 501 X 離線並且狀態不變:如果在插槽 502 我再次執行程式碼我應該再次獲得 X,因為沒有任何變化,並且區塊鏈卡住,直到 X 重新上線。

在您的範例中,您的頭塊具有block.slot == 500. 這意味著 所state代表的block.state_root也將具有state.slot == 500

在提議者 forslot == 502產生他們將呼叫的塊之前,從toprocess_slots(state, 502)增加。state.slot``500``502

如果提議者 forslot == 501產生了一個塊,他們會呼叫process_slots(state, 501),這會在呼叫 時導致不同的結果get_beacon_proposer_index(state)

規範說:

選擇的父級必須滿足 parent.slot < block.slot。

沒有parent.slot必須的要求block.slot - 1。因此驗證者將簡單地選擇在較早插槽中產生的最新塊。

然後明確說明:

注意:父級和塊之間可能有“跳過”的插槽

引用自:https://ethereum.stackexchange.com/questions/83553