區塊提案
區塊是區塊鏈的基本單位。區塊是離散的資訊單位,在節點之間傳遞、達成共識並新增至每個節點的資料庫中。本頁面將解釋區塊是如何產生的。
先決條件
區塊提案是權益證明 (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)。
每個時槽只會選擇一名區塊提案者。在正常情況下,單一區塊生產者會在他們專屬的時槽中建立並發布單一區塊。為同一個時槽建立兩個區塊是會被罰沒的違規行為,通常被稱為「模稜兩可」。
區塊是如何建立的?
區塊提案者預期會廣播一個已簽署的信標區塊,該區塊是根據其本地執行的分叉選擇演算法的視角,建立在鏈的最新頂端之上。分叉選擇演算法會套用前一個時槽留下的任何排隊證明,然後在其歷史記錄中找到累積證明權重最大的區塊。該區塊即為提案者所建立之新區塊的父區塊。
區塊提案者透過從其本地資料庫和對鏈的視角收集資料來建立區塊。區塊的內容如下方程式碼片段所示:
class BeaconBlockBody(Container):
randao_reveal: BLSSignature
eth1_data: Eth1Data
graffiti: Bytes32
proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS]
attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS]
attestations: List[Attestation, MAX_ATTESTATIONS]
deposits: List[Deposit, MAX_DEPOSITS]
voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS]
sync_aggregate: SyncAggregate
execution_payload: ExecutionPayload
randao_reveal 欄位採用一個可驗證的隨機值,由區塊提案者透過簽署當前紀元編號來建立。eth1_data 是對區塊提案者對存款合約視角的投票,包含存款默克爾樹的根節點以及使新存款得以被驗證的存款總數。graffiti 是一個可選欄位,可用於在區塊中新增訊息。proposer_slashings 和 attester_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 的獎勵。