區塊
頁面最後更新時間: 2026年2月23日
區塊為區塊鏈上擁有前一個區塊之雜湊值的交易批次。 透過這種方式,區域連結起來形成區塊鏈,因為雜湊值是透過加密方式從區塊資料中衍生得來的。 這樣就防止了假造,因為對歷史記錄中的任何區塊進行一處變更將會使其後的所有區塊無效,後面的所有雜湊值都會改變,並且所有運行區塊鏈的人都會注意到。
先決條件
區塊是一個非常簡單易懂的主題。 但為協助您更瞭解此頁面,我們建議您先閱讀帳戶、交易,以及我們的以太坊簡介。
為何需要區塊?
為確保所有以太坊網路參與者擁有同步狀態並一致同意明確的交易歷史記錄,我們將交易分批打包成區塊。 此代表數十個(或數百個)交易將同時被提交、同意及同步。
圖表改編自 Ethereum EVM illustrated (opens in a new tab)
透過將交易提交間隔分開,所有網路參與者能有足夠時間來達成共識:即便每秒有大量交易請求提出,但在以太坊上,僅以大約 12 秒的時間建立並提交一次區塊。
區塊的運作方式
為了保持交易歷史記錄,區塊嚴格按照順序排列(新建立區塊包含父區塊之參照),而區塊內的交易也是嚴格按照順序排列。 除極個別情形外,在任何給定時間點,所有網路參與者都一致同意區塊的準確數量及歷史記錄,並致力於將當前的即時交易請求批次打包到下一個區塊中。
當隨機挑選的驗證者在網路上生成一個區塊後,區塊將被廣播至全網路;所有節點將此新區塊添加於它們的區塊鏈尾端,接著,挑選一個新的驗證者來產生下一個區塊。 目前區塊生成、提交/共識流程是由以太坊之「權益證明」協議規定的。
權益證明協議
權益證明指的是:
- 驗證節點必須質押 32 個以太幣至存款合約,做為抵押品以避免惡意行為。 這會幫助保護網路,因為不誠信的活動一經證實會導致部分或全部質押被銷毀。
- 在每個時隙(12 秒間隔),會隨機挑選一位驗證者做為區塊的提交者。 他們將交易打包、執行並決定新的「狀態」。 他們將此資訊包裝進區塊並傳送給其他驗證者。
- 其他驗證者接到此新區塊後,重新執行這些交易,以確保他們同意新提交的全域狀態變更。 如果該區塊是有效的,他們將其加入自己的資料庫。
- 如果驗證者在同一時隙接到兩個衝突的區塊,他們會透過分叉選擇演算法選擇有最多質押以太幣支援的區塊。
區塊中有什麼?
區塊內有很多資訊。 在最高層級,區塊包含以下欄位:
| 欄位 | 描述 |
|---|---|
slot | 區塊所屬的時隙 |
proposer_index | 提出區塊的驗證者的識別碼 |
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 | 交易收據樹的雜湊值 |
logs_bloom | 包含事件記錄的資料結構 |
prev_randao | 用於隨機選擇驗證者的值 |
block_number | 目前區塊號碼 |
gas_limit | 此區塊允許的最高燃料用量 |
gas_used | 此區塊實際消耗的燃料用量 |
timestamp | 區塊時間 |
extra_data | 原始字節位元組格式的任意額外資料 |
base_fee_per_gas | 基本費用的值 |
block_hash | 執行區塊的雜湊值 |
transactions_root | 有效負載中交易的根雜湊值 |
withdrawal_root | 有效負載中提款的根雜湊值 |
execution_payload 本身包含以下內容 (請注意,這與標頭相同,只不過它包含的是實際的交易清單和提款資訊,而非交易的根哈希):
| 欄位 | 描述 |
|---|---|
parent_hash | 父區塊的雜湊值 |
fee_recipient | 用於支付交易費的帳戶地址 |
state_root | 在應用此區塊中的變更後全域狀態的根雜湊值 |
receipts_root | 交易收據樹的雜湊值 |
logs_bloom | 包含事件記錄的資料結構 |
prev_randao | 用於隨機選擇驗證者的值 |
block_number | 目前區塊號碼 |
gas_limit | 此區塊允許的最高燃料用量 |
gas_used | 此區塊實際消耗的燃料用量 |
timestamp | 區塊時間 |
extra_data | 原始字節位元組格式的任意額外資料 |
base_fee_per_gas | 基本費用的值 |
block_hash | 執行區塊的雜湊值 |
transactions | 要執行交易的清單 |
withdrawals | 提款物件清單 |
withdrawals 清單包含依下列方式建構的 withdrawal 物件:
| 欄位 | 描述 |
|---|---|
address | 已提款的帳戶地址 |
amount | 提款金額 |
index | 提款索引值 |
validatorIndex | 驗證者索引值 |
區塊時間
區塊時間指的是分隔區塊的時間。 在以太坊上,時間被分割成 12 秒的單位,稱為「時隙」。 在每個時隙中,都會選擇一個驗證者來提交區塊。 假設所有驗證者都在線且功能完整,那每個時隙中都會有一個區塊,表示區塊時間為 12 秒。 然而,偶爾,當被要求提交區塊時驗證者可能下線,這表示時隙有時候會是空白的。
這種實作與基於工作量證明的系統不同,在工作量證明系統中,區塊時間是機率性的,並根據協議的目標挖礦難度調整。 以太坊的平均區塊時間 (opens in a new tab)就是一個很好的例子,根據新的 12 秒區塊時間的一致性,可以清楚地推斷出從工作量證明到權益證明的轉換。
區塊大小
最後一個重要事項:區塊本身具大小限制。 每個區塊的目標大小為 3,000 萬 gas,但區塊大小會根據網路需求增減,直到 6,000 萬 gas 的區塊上限 (目標區塊大小的 2 倍)。 區塊的燃料限制可以比前一個區塊的燃料限制上調或下調 1/1024。 因此,驗證者可以透過共識來改變區塊的燃料限制。 區塊中所有交易消耗的總燃料用量須少於區塊燃料限制。 這一點非常重要,因其確保區塊不能成為任意大小。 若區塊可以任意大,由於空間及速度方面的要求,那些效能一般的全節點可能逐漸跟不上網路。 區塊愈大,在下一個時隙中及時處理它們所需的算力就愈多。 這是一種中心化力量,可以透過限制區塊大小來抵制。
延伸閱讀
知道一個曾經幫助你學習更多社區或社團資源? 歡迎在本頁自由編輯或添加內容!