1. 程式人生 > >以太坊的區塊和儲存(一):區塊頭

以太坊的區塊和儲存(一):區塊頭

以太坊的整個實現機制比比特幣複雜得多,所以它的區塊結構也比比特幣的複雜,而且它的儲存不止區塊這一種方式,咱們花幾天的時間來好好學習一下以太坊的區塊和儲存。

先從區塊開始。跟比特幣一樣,以太坊的區塊結構也分為區塊頭和區塊體,這一篇我們先講區塊頭。以太坊的區塊頭包含15個欄位:

ParentHash
這是上一個區塊的雜湊值,跟比特幣一樣,我們可以把它看成一個指標,指向上一個區塊,正是有這個指標,區塊和區塊才串聯起來,才有區塊鏈。

Coinbase
在比特幣裡也有一個coinbase,但那個coinbase是指一筆特殊的交易,就是系統獎勵比特幣給區塊建立者的那筆交易。但在以太坊這裡,是區塊建立者留下的以太坊地址,用於接收系統獎勵和交易手續費。

UncleHash
以太坊有一個獨特的東西,叫叔區塊,咱們下一篇會仔細講講。現在只要知道這個欄位就是所有叔區塊用RLP編碼後再雜湊出來的值即可。

Root
這是一棵MPT樹的根雜湊,這棵樹儲存了所有以太坊賬戶。

TxHash
這也是一棵MPT樹的根雜湊,這棵樹儲存了所有的交易資訊。

ReceiptHash
這還是一棵MPT樹的根雜湊。對於以太坊賬戶和交易我們都已講過,MPT我們也講過,用MPT樹來儲存它們好理解。那這棵樹又是存什麼的呢?其實,這棵樹儲存的是收據資訊。什麼是收據?就是交易完成後會提供一個清單給你,告訴你一些資訊:比如這筆交易被哪個區塊打包了,這筆交易最終花費了多少gas、執行交易時建立的一些日誌等等。

Bloom
我們可以在合約中通過定義“事件”來生成日誌。上面說了,在收據樹裡會儲存一些日誌,這個bloom其實是一個過濾器,通過這個過濾器可以快速搜尋和判斷某個日誌是不是存在於收據中。

Difficulty、 Nonce、mixHash
這三個欄位都和以太坊的挖礦有關,以太坊和比特幣一樣,也是POW模式,所以它也有一個挖礦難度係數,這個係數會根據出塊速度來進行調整。以太坊第一個區塊的難度是131,072,後面區塊的難度會根據前面區塊出塊的速度調整,出得快難度就調高一點,出得慢就調低一點。

Difficulty就是區塊的難度係數,Nonce是目標值,Nonce值小於等於2^256/Difficulty。所以,難度值越高,目標值的範圍越窄,要找到符合的就越難。以太坊具體的挖礦計算比比特幣複雜得多,但大概的流程就是不斷嘗試不同的mixHash來獲得符合條件的Nonce。所以,mixHash可以簡單理解為比特幣區塊頭裡的隨機值。

Number
區塊的序號,每個區塊的序號就是在父區塊的序號上加1。

Time
區塊生成的時間。這個時間不是那麼精確地就是區塊真正生成的時間,有可能就是父區塊的生成時間加上10秒,有可能就是區塊產生時的“大概”時間。

GasLimit
區塊內所有Gas消耗的理論上限。這個理論值與父區塊有關,它允許打包區塊的礦工根據父區塊的情況對這些值做些微調。每個區塊在產生時就必須設定這麼一個gas消耗的理論上限,這個上限值限定了一個區塊打包交易的總量,比如一個區塊的上限值設定為10000,現在有3筆交易的gas設定分別都是5000,那麼這個區塊就最多打包其中的兩筆交易,如果硬要打包3筆,其他節點就不會認這個區塊的。

可以這麼說,這個欄位限定了一個區塊的儲存規模,但仍保有一定彈性。這一點與比特幣不同,比特幣的一個區塊是多大,直接寫死在比特幣軟體裡,要更改的話只能通過硬分叉。

GasUsed
區塊內所有交易執行完後所實際消耗的gas總量。

extraData
這個欄位是留給區塊的建立者,讓他可以記錄一些與該區塊有關的資訊,長度小於等於32位元組即可。

這就是區塊頭的完整資訊,明天咱們繼續學習以太坊的區塊結構以及其他儲存方式。