科普:解讀以太坊黃皮書(2/7)
編者按:本文來自以太坊愛好者(ID:Ethfans)編者按:本文來自
以太坊愛好者(ID:Ethfans)
編者按:本文來自
編者按:本文來自
,作者:Lucas Saldanha,翻譯&校對: 安仔Clint & 阿劍,Odaily經授權轉載。
二級標題
希望屏幕面前的你在閱讀之後能明白默克爾樹到底是什麼,以及它在以太坊中的作用;能理解“世界狀態”和“賬戶狀態”的概念;能在腦海中勾勒出交易以及區塊的結構。
二級標題
二級標題

在討論以太坊的主要數據對象之前,我想先向各位簡要介紹一下默爾克樹到底是什麼,以使得它得以發揮作用的屬性特徵。
圖片描述
默克爾-帕特里夏樹有許多有意思的屬性,如果你想更深入地了解其在以太坊中的應用,我推薦你閱讀這篇文章。
圖片描述
在默克爾樹中,由葉子節點保存區塊數據的哈希,而由非葉子節點保存其子節點的哈希。
-默克爾樹示意圖(包括節點以及他們之間的關係)-
在判斷兩棵默克爾樹所指向數據是否完全相同時,我們不需要比較每個葉子節點,而只需比較根節點所保存的哈希。
二級標題
二級標題

圖片描述
圖片描述
二級標題
圖片描述
二級標題
nonce
-世界狀態樹與賬戶存儲-
balance
二級標題
storageRoot
賬戶狀態
codeHash
以太坊中有兩種賬戶類型:外部所有賬戶(Externally Owned Accounts 簡稱EOA)以及合約賬戶。我們用來互相收發以太幣、部署智能合約的賬戶就是EOA 賬戶,而部署智能合約時自動生成的賬戶則是合約賬戶。每一個智能合約都有其獨一無二的以太坊賬戶。
賬戶狀態反映了一個以太坊賬戶的各項信息。例如,它存儲了當前賬戶以太幣的餘額信息、當前賬戶發送過的交易數量...每一個賬戶都有賬戶狀態。
下面就來看看賬戶狀態中都包括什麼:
此賬號所擁有的以太幣數量(以Wei 計量)。

-賬戶狀態與賬戶存儲樹-
交易
二級標題
交易
二級標題
交易
二級標題
交易
nonce
交易推動當前狀態到下一狀態的轉變。在以太坊中有三種交易:
gasPrice
EOA 之間傳輸值的交易(例如,改變發送方和接收方餘額大小)。
gasLimit
發送消息來調用合約的交易(例如,通過發送消息調用來觸發setter 方法,以設置合約中的值)。
to
用於部署合約的交易(由此創建了合約賬戶)。
(從技術角度來講,前兩種交易是一樣的...它們都是通過消息調用來改變賬戶狀態的交易,只不過一個是EOA 賬戶,一個是合約賬戶。此處將交易分為三種是為了方便讀者的理解。)
交易由以下部分組成:
value
此賬戶發出的交易序號數(校對注:可以粗略理解為“這是該賬戶的第幾筆交易”)。
執行此交易、進行計算時為每單位gas 所支付的費用(以Wei 計量)。
執行此交易時可以使用的最大gas 數量。
v, r, s
如果此交易用於傳送以太幣,此處為接收以太幣的EOA 地址。
data如果此交易用於向合約發送消息(例如,調用智能合約中的方法),此處為合約的地址。
如果此交易用於創建合約,此處值為空。
init如果此交易用於收發以太幣,此處為發往接收賬戶的、以Wei 計量的代幣數量。
如果此交易用於發送對合約的消息調用,此處為向接收此消息智能合約所給付的Wei 數量。
如果此交易用於創建合約,此處為合約初始化時賬戶存放的以Wei 計量的以太幣數量。
相信不出你的意料,區塊中所有的交易也是存儲在默克爾樹中的。並且這棵樹的根節點哈希值由區塊頭保存!下面我們就來剖析一下以太坊區塊結構。
區塊
二級標題
區塊
區塊

區塊
圖片描述
parentHash
區塊頭就是以太坊中的區塊鏈部分。它保存了前一個區塊(也可稱為父區塊)的哈希值,通過區塊頭的連接形成了一條由密碼學背書的鏈。
ommersHash
圖片描述
beneficiary
區塊體包含了此區塊中記錄的一系列交易,以及叔塊(ommer)區塊頭列表。如果想要進一步了解叔塊,我推薦閱讀這篇文章。
stateRoot
圖片描述
transactionsRoot
-以太坊區塊的抽象示意圖-
receiptsRoot
下面就來介紹區塊頭包括哪些部分。
logsBloom
前一個區塊的區塊頭哈希值。每個區塊都包含前序區塊的哈希值,一路可回溯至鏈上的創世塊。這也就是維護數據不會被篡改的結構設計(任何對前序區塊的篡改都會影響後續所有區塊的哈希值)。
difficulty
叔塊頭以及部分區塊體的哈希值。
number
因為挖到此區塊而獲得收益的以太坊賬戶。
gasLimit
世界狀態樹的根節點哈希值(在所有交易被執行後)。
gasUsed
交易樹根節點的哈希值。這棵樹包含了區塊體的所有交易。
timestamp
每當交易執行時,以太坊都會生成對應結果的交易收據。此處就是這個交易收據樹的根節點哈希。
extraData
布隆過濾器,用於判斷某區塊的交易是否產生了某日誌(如果對這方面感興趣,可以查閱Stack Overflow 的這個答案)。這避免了在區塊中存儲日誌信息(節省了大量空間)。
mixHash
此區塊的難度值。這是當前區塊挖礦難度的度量值(此處不對此概念的細節和計算作介紹)。
nonce
前序區塊的總數。這標示了區塊鏈的高度(即區塊鏈上有多少區塊)。創世區塊的number 為0 。
哎呀...真是講到我嘴都酸了...建議你別著急,慢慢吸收!不過我要再次強調,閱讀本文不應以記住每一個名詞及其作用為目標(在谷歌上這些都能搜到)。我的寫作初衷是想用一種簡單的方式(至少比黃皮書簡單)介紹以太坊對象的方方面面,來幫助新手理解那些專業名詞代表什麼。把這篇文章當作“笨方法學以太坊對象”就好了! 🙂
結論
二級標題
結論
二級標題
結論
二級標題
結論
讓我們簡要回顧一下學到了什麼!總體而言,以太坊有四種前綴樹:
世界狀態樹包括了從地址到賬戶狀態之間的映射。世界狀態樹的根節點哈希值由區塊保存(在stateRoot 字段),它標示了區塊創建時的當前狀態。整個網絡中只有一個世界狀態樹。
賬戶存儲樹保存了與某一智能合約相關的數據信息。由賬戶狀態保存賬戶存儲樹的根節點哈希值(在storageRoot 字段)。每個賬戶都有一個賬戶存儲樹。
交易樹包含了一個區塊中的所有交易信息。由區塊頭(在transactionsRoot 區域)保存交易樹的根節點哈希值。每個區塊都有一棵交易樹。
我們今天討論的對像有:

賬戶狀態: 保存著每個以太坊賬戶的狀態信息。賬戶狀態同樣保存著賬戶狀態樹的storageRoot,後者包含了該賬戶的存儲數據。
圖片描述


