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