【区块链】复习九之以太坊数据结构
以太坊數據結構
- 1、賬戶
- 1.1賬戶分類
- 1.1.1外部賬戶
- 1.1.2合約賬戶
- 2、MPT樹
- 2.1Trie樹
- 2.2Patricia Trie
- 2.3MPT樹
- 3、消息和交易
- 4、狀態轉換函數
- 5、以太坊區塊
- 5.1區塊頭
- 5.2區塊體
1、賬戶
比特幣是采用基于交易的賬本模式,優點有:隱私保護比較好;缺點有:沒有顯示地記錄賬戶余額,交易不方便(要一次性花出去)
以太坊是基于賬戶的賬本模式。
優點:顯示地記錄賬戶余額
交易更加方便
對雙花攻擊(支付方不誠實)有著天然的防御
缺點:易遭受重放攻擊(收款方不誠實)。
1.1賬戶分類
以太坊為了實現智能合約,將賬戶分為:外部賬戶EOA和合約賬戶
外部賬戶:由密鑰控制,無代碼與之關聯
合約賬戶:由智能合約代碼控制,有代碼與之關聯
1.1.1外部賬戶
是由人們通過私鑰創建的賬戶,是真實世界的金融賬戶的映射,擁有該賬戶私鑰的任何人都可以控制該賬戶,這也是人類與以太坊賬本溝通的唯一媒介。
外部賬戶包括balance(以太幣余額)和nonce隨機數(用于確定每筆交易只能被處理一次的計數器)
特點
- 擁有以太幣余額
- 能發送交易,包括轉賬和執行合約代碼
- 被私鑰控制
- 沒有相關的可執行代碼
1.1.2合約賬戶
被外部賬戶或者合約創建,合約在創建時被自動分配到一個賬戶地址,用于存儲合約代碼啊以及合約部署或者執行過程中產生的存儲數據。
合約賬戶地址是通過SHA3哈希算法產生。只能通過外部賬戶來驅動合約執行合約代碼。
合約賬戶包括code合約代碼和storage賬戶的存儲
特點
- 有相關的可執行代碼
- 不能發起交易
- 合約代碼能夠被交易或者其他合約消息使用
- 合約代碼被執行時可再調用其他合約代碼
- 合約代碼被執行時可執行復雜運算,可永久地改變合約內部的數據存儲
為了智能合約,簽合約需要穩定的賬戶模式,所以設計了這樣的賬戶模式。
2、MPT樹
2.1Trie樹
前綴樹或字典樹,是一種有序樹狀的數據結構,其中的鍵通常時字符串。
與二叉樹不同,鍵時由節點在樹中的位置決定。一個節點的所有子孫都有相同的前綴,節點對應的key是根節點到該節點路徑上的所有節點key值前后拼接而成。根節點對應空字符串key。
2.2Patricia Trie
空間使用率經過優化的Trie。但是在Patricia Trie里如果存在一個父節點只有一個子節點,那么這個父節點將與子節點合并,大大加快搜索節點速度。
2.3MPT樹
結合了字典樹和默克爾樹的優點
MPT樹中的節點類型:
- 葉子節點:沒有子節點,表示為[key,value]的一個鍵值對(偶數2奇數3)
- 擴展節點:也是這樣一個鍵值對,但是value是其他節點的hash值,通過hash連接到其他節點,只有一個子節點(偶數0奇數1)
- 分支節點:是一個長度為17的list,分支節點的父節點必然是擴展節點,可以有多個子節點
- 空節點:空字符串
構建例題見習題
3、消息和交易
以太坊可以看作是基于交易的狀態機。一個交易表示從一個狀態轉換至另一個狀態的合法過度。
從全局狀態變化的角度看,以太坊可看作是一個狀態連,通過交易來驅動賬戶的狀態發生變化。
從具體實現的角度看,以太坊可看作是一個區塊鏈。
從賬本的角度看,以太坊可看作是一個交易的堆棧。
以太坊中有兩種類型的交易:創建合約和發送消息
區塊的順序是由某個共識算法來決定。
4、狀態轉換函數
APPLY(S,TX)->S’
S是初始狀態,TX是一筆新的交易。
交易是外部世界和以太坊內部狀態的橋梁
5、以太坊區塊
包括區塊頭和區塊體。
區塊頭較為輕量級,包含了一系列的數值、引用的數值和哈希值
區塊體:較為重量級,包含了該區塊收納的交易列表和叔塊列表
5.1區塊頭
- parentHash父區塊哈希
通過此紀錄才能完整的將區塊有序組織,形成一條區塊鏈,并且可以防止父區塊內容被修改 - sha3Uncles叔父區塊集的哈希
表示區塊引用的多個叔背區塊。在以太坊中,不能成為主鏈一部分的孤兒區塊如果有幸被猴籠的區塊收留近區塊鏈就變成了叔塊。通過叔塊獎勵機制,來降低以太坊軟分叉和平衡網速慢的礦工利益。 - miner挖出該區塊的全節點地址
- stateRoot狀態樹根哈希
表示執行完此區塊中的所有交易后以太坊狀態快照ID。 - transactionsRoot交易樹根哈希
可以驗證某交易是否包含在此區塊中,類似默克爾根哈希 - receiptRoot收據樹根哈希
由區塊交易在執行完成后生成的交易回執信息集合生成。類似購物后的小票,上面由交易真實花費的汽油、日志等等 - logsBloom日志布隆過濾器
是一個256長度byte數組,提取自receipt,用于快速定位查找和驗證交易回執中的智能合約事件信息。 - difficulty挖礦難度系數
- nubmer區塊高度
- gasLimit汽油量上限(動態調整的)
- gasUsed實際消耗汽油量
- misHash混合哈希
用于校驗區塊是否正確挖出,實際上是區塊頭數據不包含nonce時的一個哈希值 - nonce以太坊挖礦隨機數,長度8byte.mixhash只有用一個正確的nonce才能進行POW。
5.2區塊體
包括:交易集合和叔輩區塊頭集合。
總結
以上是生活随笔為你收集整理的【区块链】复习九之以太坊数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch:RuntimeError
- 下一篇: 象棋机器人 1 引言