待字閨中開發(fā)了一門區(qū)塊鏈方面的課程:《深入淺出ETH原理與智能合約開發(fā)》,馬良老師講授嗅辣。此簡書文集記錄我的學習筆記蓬抄。
課程共8節(jié)課埋心。其中揩慕,前四課講ETH原理抄课,后四課講智能合約厢破。
第三課分為三部分:
- 以太坊區(qū)塊結構
- GHOST協(xié)議
- 搭建測試網(wǎng)絡
這篇文章是第三課第一部分的學習筆記:以太坊區(qū)塊結構峭沦。
1蒸辆、以太坊區(qū)塊結構詳細分解
以太坊區(qū)塊主要包括三部分:
- 區(qū)塊頭
- 交易
- 兩個叔塊的區(qū)塊頭散列值征炼。
區(qū)塊頭的詳細內容
- Parent header hash 父區(qū)塊的區(qū)塊頭散列值。
- Ommers List hash 兩個叔塊的區(qū)塊頭散列值所組成的列表的單向散列值躬贡。
- Beneficiary 收益地址谆奥,160位
- State Root Trie Hash 全局狀態(tài)根MPT的散列值
- Transaction Trie Hash 交易MPT樹的散列值
- Receipt Trie Hash 收據(jù)MPT樹的散列值。每一個交易都有一個收據(jù)拂玻,有多少個交易就有多少個收據(jù)酸些。主要包括交易執(zhí)行后衍生出的信息,包含四部分的內容檐蚜。
以上的三個根魄懂,保證了所有節(jié)點保存的狀態(tài)一致、交易一致闯第、交易結果一致市栗,再通過對整個區(qū)塊頭進行Hash操作,保證歷史一致咳短。這樣就保證了這個區(qū)塊鏈的公信力填帽。 - logs Bloom 整個區(qū)塊日志的Bloom過濾器,供查詢區(qū)塊的信息诲泌。
- Difficulty 區(qū)塊難度盲赊。有很多因素決定,由一個公式算出敷扫。
- Number 直系父節(jié)點的個數(shù)
- GasLimit gas上限哀蘑。比特幣通過大小限制區(qū)塊尺寸诚卸,而以太坊通過gas上限。
- GasUsed 當區(qū)塊被挖出時绘迁,實際的gas消耗合溺。
- Time 時間戳
- Extra Data
- mixHash
- nonce
后三個是與挖礦相關的參數(shù)。
2缀台、以太坊數(shù)據(jù)分布結構與控制流
- 全局狀態(tài)樹 State Trie
如果這是一個合約賬戶棠赛,其中的一個葉子節(jié)點將包含以下四個部分。
①是隨機值膛腐,②是余額睛约,③是相關代碼的散列值,④是合約的相關全局變量的MPT哲身。在后面的代碼中辩涝,全經(jīng)常看到 storage 勘天。
其中怔揩,代碼存儲在交易中。
- 交易樹 Txs Trie
本區(qū)塊中脯丝,所有交易組成的MPT樹商膊。
- 收據(jù)樹 Receipt Trie
每一個區(qū)塊中,有自己的交易樹和收據(jù)樹宠进,但全局狀態(tài)則不同晕拆,它會重用歷史信息,只更新需要更新的一小部分砰苍。
圖中潦匈,左邊部分的數(shù)據(jù)都不在以太坊的區(qū)塊鏈上,區(qū)塊鏈上只包括前一小節(jié)里提到的數(shù)據(jù)赚导。左邊這些數(shù)據(jù)都是根據(jù)交易信息在虛擬機中執(zhí)行推導出來的茬缩,其它由Level DB 持久化存儲。
以太坊數(shù)據(jù)的控制流如上圖吼旧,簡述如下:
?交易信息輸入到虛擬機中凰锡。
?虛擬機根據(jù)交易信息從全局狀態(tài)樹中取得一些需要的信息。
?執(zhí)行合約的一些操作后圈暗, 會修改全局狀態(tài)樹掂为,及收據(jù)樹。
?最后员串,左邊的這些數(shù)據(jù)會串行化勇哗、持久化到 level DB。
3寸齐、以太坊全局狀態(tài)Trie的變遷
前面提到欲诺,全局狀態(tài)樹并不是全部重新生成抄谐,只更新變化的部分。
上圖中扰法,從區(qū)塊175223到區(qū)塊175334過程蛹含,發(fā)生了一筆交易,賬號175收到了18eth塞颁,余額發(fā)生了變化浦箱,藍色的部分都發(fā)生了變化。而紅色部分沒有變化祠锣,所以在175334區(qū)塊中酷窥,綠色的數(shù)據(jù)是新的,黃色和紅色則可以重用上一區(qū)塊锤岸。
不足之處竖幔,請批評指正。