跳至主要內容
Change page

區塊

區塊是一批交易的集合,並包含鏈中前一個區塊的雜湊。這將區塊(在鏈中)連結在一起,因為雜湊是從區塊資料透過密碼學推導出來的。這可以防止詐欺,因為歷史上任何一個區塊的改變都會使所有後續區塊無效,因為所有後續的雜湊都會改變,而每個運行區塊鏈的人都會注意到。

先決條件

區塊是一個對初學者非常友善的主題。但為了幫助你更了解本頁面,我們建議你先閱讀帳戶交易以及我們的以太坊簡介

為何需要區塊?

為了確保以太坊網路上的所有參與者保持同步的狀態,並對精確的交易歷史達成共識,我們將交易分批放入區塊中。這意味著數十(或數百)筆交易會同時被提交、達成共識並同步。

A diagram showing transaction in a block causing state changes 圖表改編自以太坊 EVM 圖解 (opens in a new tab)

透過拉開提交的間隔,我們給予所有網路參與者足夠的時間來達成共識:即使每秒發生數十次交易請求,以太坊上每十二秒才會建立並提交一次區塊。

區塊如何運作

為了保存交易歷史,區塊有嚴格的排序(每個建立的新區塊都包含對其父區塊的參考),且區塊內的交易也有嚴格的排序。除了極少數情況外,在任何給定時間,網路上的所有參與者都對區塊的確切數量和歷史達成共識,並致力於將當前即時的交易請求分批放入下一個區塊中。

一旦網路上隨機選擇的驗證者組裝好一個區塊,它就會被傳播到網路的其餘部分;所有節點都會將此區塊新增到其區塊鏈的末端,然後選擇一個新的驗證者來建立下一個區塊。確切的區塊組裝過程和提交/共識過程目前由以太坊的「權益證明 (PoS)」協定所規範。

權益證明協定

權益證明 (PoS) 意味著以下幾點:

  • 驗證節點必須將 32 ETH 質押到存款合約中,作為防止不良行為的抵押品。這有助於保護網路,因為可證明的惡意活動會導致部分或全部的質押被銷毀。
  • 在每個時槽(間隔十二秒)中,會隨機選擇一名驗證者作為區塊提案者。他們將交易捆綁在一起、執行它們並決定一個新的「狀態」。他們將這些資訊打包成一個區塊,並將其傳遞給其他驗證者。
  • 收到新區塊消息的其他驗證者會重新執行交易,以確保他們同意對全域狀態提出的變更。假設區塊有效,他們會將其新增到自己的資料庫中。
  • 如果驗證者收到同一個時槽有兩個衝突的區塊,他們會使用其分叉選擇演算法來挑選由最多質押 ETH 支持的那個區塊。

更多關於權益證明的資訊

區塊裡有什麼?

區塊內包含大量資訊。在最高層級,區塊包含以下欄位:

欄位描述
slot該區塊所屬的時槽
proposer_index提出該區塊的驗證者 ID
parent_root前一個區塊的雜湊
state_root狀態物件的根雜湊
body包含多個欄位的物件,定義如下

區塊的 body 本身包含多個欄位:

欄位描述
randao_reveal用於選擇下一個區塊提案者的值
eth1_data關於存款合約的資訊
graffiti用於標記區塊的任意資料
proposer_slashings將被罰沒的驗證者清單
attester_slashings將被罰沒的證明者清單
attestations針對先前時槽所作的證明清單
deposits存款合約的新存款清單
voluntary_exits退出網路的驗證者清單
sync_aggregate用於服務輕客戶端的驗證者子集
execution_payload從執行客戶端傳遞的交易

attestations 欄位包含區塊中所有證明的清單。證明有其專屬的資料類型,其中包含多項資料。每個證明包含:

欄位描述
aggregation_bits參與此證明的驗證者清單
data包含多個子欄位的容器
signature一組驗證者針對 data 部分的聚合簽章

attestation 中的 data 欄位包含以下內容:

欄位描述
slot該證明相關的時槽
index進行證明的驗證者索引
beacon_block_root被視為鏈頭的信標區塊根雜湊
source最後一個已證明的檢查點
target最新的紀元邊界區塊

執行 execution_payload 中的交易會更新全域狀態。所有客戶端都會重新執行 execution_payload 中的交易,以確保新狀態與新區塊 state_root 欄位中的狀態相符。這就是客戶端如何判斷新區塊是否有效且可以安全地新增到其區塊鏈中的方式。execution payload 本身是一個包含多個欄位的物件。還有一個 execution_payload_header,其中包含有關執行資料的重要摘要資訊。這些資料結構的組織方式如下:

execution_payload_header 包含以下欄位:

欄位描述
parent_hash父區塊的雜湊
fee_recipient支付交易費用的帳戶地址
state_root套用此區塊變更後的全域狀態根雜湊
receipts_root交易收據 Trie 的雜湊
logs_bloom包含事件日誌的資料結構
prev_randao用於隨機選擇驗證者的值
block_number當前區塊的編號
gas_limit此區塊允許的最大燃料 (Gas)
gas_used此區塊實際使用的燃料 (Gas) 數量
timestamp區塊時間
extra_data作為原始位元組的任意附加資料
base_fee_per_gas基礎費用值
block_hash執行區塊的雜湊
transactions_root負載中交易的根雜湊
withdrawal_root負載中提款的根雜湊

execution_payload 本身包含以下內容(請注意,這與標頭相同,差別在於它包含實際的交易清單和提款資訊,而不是交易的根雜湊):

欄位描述
parent_hash父區塊的雜湊
fee_recipient支付交易費用的帳戶地址
state_root套用此區塊變更後的全域狀態根雜湊
receipts_root交易收據 Trie 的雜湊
logs_bloom包含事件日誌的資料結構
prev_randao用於隨機選擇驗證者的值
block_number當前區塊的編號
gas_limit此區塊允許的最大燃料 (Gas)
gas_used此區塊實際使用的燃料 (Gas) 數量
timestamp區塊時間
extra_data作為原始位元組的任意附加資料
base_fee_per_gas基礎費用值
block_hash執行區塊的雜湊
transactions將被執行的交易清單
withdrawals提款物件清單

withdrawals 清單包含結構如下的 withdrawal 物件:

欄位描述
address已提款的帳戶地址
amount提款金額
index提款索引值
validatorIndex驗證者索引值

區塊時間

區塊時間是指區塊之間的間隔時間。在以太坊中,時間被劃分為十二秒的單位,稱為「時槽」。在每個時槽中,會選擇一名驗證者來提出區塊。假設所有驗證者都在線且功能完全正常,每個時槽都會有一個區塊,這意味著區塊時間為 12 秒。然而,有時驗證者在被呼叫提出區塊時可能處於離線狀態,這意味著時槽有時會是空的。

這種實作方式不同於基於工作量證明 (PoW) 的系統,後者的區塊時間是機率性的,並由協定的目標挖礦難度進行調整。以太坊的平均區塊時間 (opens in a new tab)就是一個完美的例子,透過新的 12 秒區塊時間的一致性,可以清楚地推斷出從工作量證明到權益證明的過渡。

區塊大小

最後一個重要的注意事項是,區塊本身的大小是有限制的。每個區塊的目標大小為 3,000 萬燃料,但區塊的大小會根據網路需求增加或減少,最高可達 6,000 萬燃料的區塊限制(目標區塊大小的 2 倍)。區塊 Gas 限制可以從前一個區塊的 Gas 限制向上或向下調整 1/1024 的倍數。因此,驗證者可以透過共識來改變區塊 Gas 限制。區塊中所有交易所消耗的燃料總量必須小於區塊 Gas 限制。這很重要,因為它確保了區塊不能任意變大。如果區塊可以任意變大,那麼效能較差的全節點將會因為空間和速度的要求而逐漸無法跟上網路。區塊越大,在下一個時槽到來前及時處理它們所需的運算能力就越大。這是一種中心化的力量,而限制區塊大小正是為了抵抗這種力量。

延伸閱讀

知道有什麼社群資源對你有幫助嗎?編輯此頁面並加入它!

頁面最後更新: 2026年2月23日