跳至主要内容
Change page

區塊

最後編輯: @Xeift(opens in a new tab), 2024年5月26日

區塊為區塊鏈上擁有前一個區塊之雜湊值的交易批次。 透過這種方式,區域連結起來形成區塊鏈,因為雜湊值是透過加密方式從區塊資料中衍生得來的。 這樣就防止了假造,因為對歷史記錄中的任何區塊進行一處變更將會使其後的所有區塊無效,後面的所有雜湊值都會改變,並且所有運行區塊鏈的人都會注意到。

基本資訊

區塊是一個非常簡單易懂的主題。 為了讓你更容易理解本頁,建議你先閱讀帳戶交易及我們的以太坊介紹

為何需要區塊?

為確保所有以太坊網路參與者擁有同步狀態並一致同意明確的交易歷史記錄,我們將交易分批打包成區塊。 此代表數十個(或數百個)交易將同時被提交、同意及同步。

顯示區塊中的交易導致狀態產生變化的圖表 此圖源於以太坊EVM圖解(opens in a new tab)

透過將交易提交間隔分開,所有網路參與者能有足夠時間來達成共識:即便每秒有大量交易請求提出,但在以太坊上,僅以大約 12 秒的時間建立並提交一次區塊。

區塊如何運作?

為了保持交易歷史記錄,區塊嚴格按照順序排列(新建立區塊包含父區塊之參照),而區塊內的交易也是嚴格按照順序排列。 除極個別情形外,在任何給定時間點,所有網路參與者都一致同意區塊的準確數量及歷史記錄,並致力於將當前的即時交易請求批次打包到下一個區塊中。

當隨機挑選的驗證者在網路上生成一個區塊後,區塊將被廣播至全網路;所有節點將此新區塊添加於它們的區塊鏈尾端,接著,挑選一個新的驗證者來產生下一個區塊。 目前區塊生成、提交/共識流程是由以太坊之「權益證明」協議規定的。

權益證明協議

權益證明指的是:

  • 驗證節點必須質押 32 個以太幣至存款合約,做為抵押品以避免惡意行為。 這會幫助保護網路,因為不誠信的活動一經證實會導致部分或全部質押被銷毀。
  • 在每個時隙(12 秒間隔),會隨機挑選一位驗證者做為區塊的提交者。 他們將交易打包、執行並決定新的「狀態」。 他們將此資訊包裝進區塊並傳送給其他驗證者。
  • 其他驗證者接到此新區塊後,重新執行這些交易,以確保他們同意新提交的全域狀態變更。 如果該區塊是有效的,他們將其加入自己的資料庫。
  • 如果驗證者在同一時隙接到兩個衝突的區塊,他們會透過分叉選擇演算法選擇有最多質押以太幣支援的區塊。

更多詳情關於質押證明(PoS)

區塊中有什麼?

區塊內有很多資訊。 在最高層級,區塊包含以下欄位:

欄位描述
時隙區塊所屬的時隙
proposer_index提出區塊的驗證者的識別碼
parent_root前一個區塊的雜湊值
state_root狀態物件的根雜湊值
主旨包含多個欄位的物件,定義如下

區塊的 body 包含以下幾個欄位:

欄位描述
randao_reveal用於選擇下一個區塊提出者的值
eth1_data關於存款合約的資訊
塗鴉用於標記區塊的任意資料
proposer_slashings將被罰沒的驗證者清單
attester_slashings將被罰沒的證明者清單
證明支持當前區塊的證明清單
存款存款合約的新增存款清單
voluntary_exits離開網路的驗證者清單
sync_aggregate服務輕量用端的驗證者子集
execution_payload執行用户端傳送來的交易

attestations 欄位包含區塊中所有證明的清單。 每個證明都有自己的資料類型並包含一些資料。 每個證明包含:

欄位描述
aggregation_bits參與過此證明的驗證者清單
數據資料包含多個子欄位的容器
signature所有證明驗證者的聚合簽名

attestation 中的 data 欄位包含:

欄位描述
時隙與證明相關的時隙
索引證明驗證者的索引
beacon_block_root包含此物件的信標區塊的根雜湊值
來源最後一個合法檢查點
target最新時期的邊界區塊

執行 execution_payload 中的交易會更新全域狀態。 所有用戶端都重新執行 execution_payload 中的交易,以確保新的狀態與新區塊中 state_root 欄位中的狀態相符。 這就是用戶端辨別新區塊是否有效並可以安全添加至其區塊鏈中的方式。 execution payload 自身是一個有許多欄位的物件。 還有一個 execution_payload_header 欄位,其中包含了關於執行資料的重要摘要資訊。 這些資料結構組織方式如下:

xecution_payload_header 包含以下欄位:

欄位描述
家長_雜湊值父區塊的雜湊值
fee_recipient用於支付交易費的帳戶地址
state_root在應用此區塊中的變更後全域狀態的根雜湊值
receipts_root交易收據樹的雜湊值
logs_bloom包含事件記錄的資料結構
prev_randao用於隨機選擇驗證者的值
block_number目前區塊號碼
gas_limit此區塊允許的最高燃料用量
gas_used此區塊實際消耗的燃料用量
時間戳區塊時間
extra_data原始字節位元組格式的任意額外資料
base_fee_per_gas基本費用的值
block_hash執行區塊的雜湊值
transactions_root有效負載中交易的根雜湊值
withdrawal_root有效負載中提款的根雜湊值

execution_payload 自身包含了以下欄位(請注意,這些欄位與標頭相同,只是它不包含交易的根雜湊值,而是包含實際的交易清單和提款資訊):

欄位描述
家長_雜湊值父區塊的雜湊值
fee_recipient用於支付交易費的帳戶地址
state_root在應用此區塊中的變更後全域狀態的根雜湊值
receipts_root交易收據樹的雜湊值
logs_bloom包含事件記錄的資料結構
prev_randao用於隨機選擇驗證者的值
block_number目前區塊號碼
gas_limit此區塊允許的最高燃料用量
gas_used此區塊實際消耗的燃料用量
時間戳區塊時間
extra_data原始字節位元組格式的任意額外資料
base_fee_per_gas基本費用的值
block_hash執行區塊的雜湊值
交易(transactions)要執行交易的清單
提款提款物件清單

withdrawals 清單包含 withdrawals 物件,具下列結構:

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

區塊時間

區塊時間指的是分隔區塊的時間。 在以太坊上,時間被分割成 12 秒的單位,稱為「時隙」。 在每個時隙中,都會選擇一個驗證者來提交區塊。 假設所有驗證者都在線且功能完整,那每個時隙中都會有一個區塊,表示區塊時間為 12 秒。 然而,偶爾,當被要求提交區塊時驗證者可能下線,這表示時隙有時候會是空白的。

這種實作與基於工作量證明的系統不同,在工作量證明系統中,區塊時間是機率性的,並根據協議的目標挖礦難度調整。 以太坊的平均區塊時間(opens in a new tab)就是個完美的範例,可以透過一致性的 12 秒區塊時間清楚地推斷出,已經由工作量證明過渡到權益證明了。

區塊大小

最後一個重要事項:區塊本身具大小限制。 每個區塊具 15M 單位燃料用量之目標大小,但區塊大小將跟隨網路需求增減,最大可達到 30M 燃料用量的區塊大小限制(目標區塊大小之兩倍)。 區塊的燃料限制可以比前一個區塊的燃料限制上調或下調 1/1024。 因此,驗證者可以透過共識來改變區塊的燃料限制。 區塊中所有交易消耗的總燃料用量須少於區塊燃料限制。 這一點非常重要,因其確保區塊不能成為任意大小。 若區塊可以任意大,由於空間及速度方面的要求,那些效能一般的全節點可能逐漸跟不上網路。 區塊愈大,在下一個時隙中及時處理它們所需的算力就愈多。 這是一種中心化力量,可以透過限制區塊大小來抵制。

衍生閱讀

知道對你有幫助的社群資源嗎? 請編輯此頁面並新增資源!

  • 交易
  • 燃料
  • 權益證明(PoS)

這篇文章對你有幫助嗎?