今天我們要介紹Merkle Tree機制和區塊的組成,我們依照Hash的結構可以分成線性的Hash和Merkle Tree Hash,Merkle Tree是一種樹形資料結構,讓一筆筆的Hash值(就像樹的葉子一樣),兩兩一對組成一個新Hash值的方式,最後產生的一個Hash值,被稱為Merkle Tree Root(就像樹根一樣),這個最後的Hash值會被記錄到區塊頭(Block Header)中,Merkle Tree結構在計算交易或狀態更改的Hash上很有效率。
大概長這樣!!!
提到了區塊頭(Block Header),就讓我們來了解一下區塊的組成吧!
在以太坊區塊鏈中,區塊可以分成兩個部分,區塊頭(Block Header)和區塊身體(Block Body),區塊身體(Block Body)中的數據是我們的交易資料,那我們來看看區塊頭(Block Header)中的數據有哪些呢?有很多我們之前提過的東西,大家應該會有印象,包括及Nonce 隨機數、Gas的費用和限制、Difficulty區塊的難度和timestamp 時間戳(就是訊息記錄的時間)等,今天我們要講的是在區塊頭中,三個用Merkle Tree的Hash 值。
以太坊區塊鏈中有三個Merkle Tree Root的Hash值,我們的三大樹根是狀態根Hash值(StateRoot)、交易根Hash值(TransactionsRoot)以及收據根Hash值(ReceiptsRoot)。以太坊區塊鏈的交易執行完成後,會發生狀態(state)的改變,因此會計算狀態根的Hash值,區塊中的全部交易會構成交易根的Hash值,每筆交易的收據則構成收據根的Hash值。
現在,讓我們用狀態根的Hash值來舉例,以太坊的智能合約執行會導致狀態的改變,每個狀態更改都會重新計算狀態根Hash,但並不是所有狀態(state)的Hash,只需要重新計算樹結構中受影響的路徑,我們以簡單的數學計算來舉例,當狀態5改變為13時,這導致19的路徑和狀態根64(實際上是Hash值)被重新計算。如果要驗證任何交易,你也不必檢查驗證整個交易,只需要檢查一個樹的路徑就可以(某根樹枝)。
我們甚麼時候使用線性的Hash?甚麼時候又要使用Merkle Tree Hash呢?
當我們計算狀態根、交易根以及收據根的Hash值,我們使用樹結構來計算,那當我們要驗證計算的是包括上面這三個的整個區塊時,我們就可以使用線性的Hash。
加上我們今天所提到的三個樹根,在以太坊中有很多種Hash,包括帳戶地址、數字簽名、狀態根Hash值(StateRoot)、交易根Hash值(TransactionsRoot)、收據根Hash值(ReceiptsRoot)和區塊頭Hash,區塊組成中還有所謂的Parent Hash和Ommer Hash,我們還沒提到,下一篇我將帶大家了解Ommer Block,我們又會提到一次PoW喔!那我們明天見~