以太坊原始碼解讀(4)Block類及其儲存

2021-08-30 13:44:15 字數 2508 閱讀 8536

type block struct 

}

block類實際上就只有兩個部分,header和body。其他的如hash、size、td等都是在接受和驗證區塊後產生的內容,實際上向全網公布的時候block就只有header和body(uncles和transactions)。

header裡有哪些內容呢?

type header struct
1)parenthash:前乙個區塊的hash

2)unclehash:叔區塊hash,如果有多個叔區塊就加到一起

3)coinbase:礦工賬戶

4)root:statedb中的「state trie」的根節點的rlp雜湊值。

5)txhash:「tx trie」的根節點的rlp雜湊值。

6)receipthash:"receipt trie」的根節點的rlp雜湊值。

7)bloom:bloom過濾器(filter),用來快速判斷乙個引數log物件是否存在於一組已知的log集合中。

8)difficulty:難度值

9)number:區塊號

10)gaslimit:區塊內所有gas消耗的理論上限。該數值在區塊建立時設定,與父區塊的gasused有關。

11)gasused:區塊內所有transaction執行時所實際消耗的gas總和。

12)time:時間戳

13)extra:額外資訊

14)nonce:pow產生的數值,也可以用於驗證礦工的工作

在位元幣中,區塊body中的交易通過merkle tree的形式組織,然後將merkle root存在block header中。

而在以太坊中不是merkle-tree,而是merkle-patricatrie(mpt)結構,而且存在三棵樹:state trie、tx trie、receipt trie。

首先,在statedb中,每個賬戶以stateobject物件表示,所有賬戶物件可以逐個插入乙個merkle-patricatrie(mpt)結構裡,形成「state trie」。其次,block的transactions中所有的tx物件,被逐個插入乙個mpt結構,形成「tx trie」。最後,所有transaction執行完後會生成乙個receipt陣列,這個陣列中的所有receipt被逐個插入乙個mpt結構中,形成"receipt trie"

上圖中表示的意思是,首先乙個區塊的幾個重要部分分開儲存在leveldb中,header、body、receipts以rlp編碼的形式儲存在資料庫中,key都是用num+key構成的。另外,我們可以通過『h』+num+hash+'t'查詢區塊鏈的總難度td;『h』+hash可以查詢到blocknumber;在知道num的情況下可以查詢『h』+num+『n』對應的區塊鏈上的hash(即不在規範鏈上的區塊可能也有該num,但是無法通過這個key查詢到);在僅僅知道hash的情況下,通過『l』+hash來查詢區塊hash+區塊號+交易編碼的編碼值,這樣的值僅僅儲存規範鏈上的區塊,所以我們可以快速的檢視某hash對應的區塊是否在規範鏈上。

keyvalue

'h' + num +hash

header的rlp編碼值

'b' + num +hash

body的rlp編碼值

'r' + num +hash

receipt的rlp編碼值

'h' + num + hash + 't'

截止該區塊的總難度值

'h' + num + 'n'

區塊號對應的規範鏈上的區塊的hash(規範鏈 )

'h' + hash

header對應的block number(規範鏈)

'l' + hash

【區塊hash、區塊號num、交易編號】的編碼值,是交易查詢入口(規範鏈)

這些資訊都在強烈的暗示,num(number)和hash是block最為重要的兩個屬性:num用來確定block在整個區塊鏈中所處的位置,hash用來辨識惟一的block/header物件。

通過以上的設計,block結構體的所有重要成員,都被儲存進了底層資料庫。當所有block物件的資訊都已經寫進資料庫後,我們就可以使用blockchain結構體來處理整個塊鏈。

以太坊原始碼解讀(1)以太坊架構與模組結構

以太坊虛擬機器,以太坊中智慧型合約的執行環境 區別去位元幣的utxo,以太坊構建裡賬戶,賬戶分為兩類,內部賬戶和外部賬戶,內部賬戶指合約賬戶,外部賬戶指使用者賬戶 在以太坊網路上的任何乙個訊息的傳遞都是一次交易 以太坊網路的執行機制之一,每執行一步合約 都與要消耗一定的gas,gas的設定一方面是為...

64 原始碼 以太坊交易簽名解析原始碼解讀

上篇文章 以太坊交易簽名過程原始碼解析 從原始碼角度分析了乙個合約呼叫的的簽名過程,簽名後的交易傳送到以太坊節點後,節點需要從簽名交易中還原出公鑰 從公鑰中單向計算出賬號位址 進而將交易放入交易池中。本文從 go ethereum 原始碼的出發,看看如何從簽名交易中還原出公鑰。我們使用上文中最後得到...

原始碼安裝以太坊 wtc

1 安裝go 先更新一下 sudo apt get update sudo apt get y upgradesudo tar xvf go1.9 2.linux amd64.tar gzsudo mv go usr local設定路徑vi etc profile export path path ...