以太坊入門-運行原理二

以太坊運行原理筆記:

(參考以太坊黃皮書)

以太坊入門-運行原理二

以太坊區塊組成:

區塊:相關信息片段(區塊頭)+區塊內交易+其他的區塊頭(一些上一級區塊和上上級區塊,稱為ommers)。

先說下ommers:當前區塊的上一級區塊(父區塊)和當前區塊上一級區塊(父區塊)的上上級區塊(爺區塊)是相同的。(有點拗口)

以太坊的出塊時間大概在15-17秒,那麼和比特幣對比起來肯定是快了很多,這樣的話整個交易處理會更快。在同一時間點,這個時候會出現同時出現兩個競爭區塊的情況也就會多一些,那麼最終只有一個會被鏈接下去,其他的就稱為孤區塊。當然如果是完全拋棄了,那麼也就沒有意義了。ommers獎勵礦工納入這些區塊,這些區塊有效就也能獲得一定的獎勵。有效的判定為:ommers必須在上一級(父區塊)的第6個子區塊之內或更小範圍內。在第6個子區塊之後,之前的孤區塊將不會再被引用。

獎勵如下:

叔區塊顧名思義是區塊的父區塊的兄弟區塊。那麼區塊鏈只有一條主鏈,故叔區塊不在主鏈上,導致叔區塊的原因,由於是網絡的延遲沒有同步,那麼一個叔區塊如果引用在有效的主鏈上,挖出叔區塊的礦工獲得4.375個以太幣(區塊獎勵的7/8)。上文說到叔區塊的引用獲得獎勵,那麼這個獎勵對挖到叔區塊的礦工也是有一個間隔層數的關係。具體如下:

間隔的層數獲取的比例以太幣17/84.37526/83.7535/83.12544/82.553/81.87562/81.25

回過頭看以太坊區塊頭組成:

  • parentHash:父區塊頭的Hash值,Keccak 256位hash值
  • ommersHash:當前區塊ommers列表的Hash值,Keccak 256位hash值
  • beneficiary:挖到該區塊的礦工的地址,用於接收所有交易費用,160位的接收地址
  • stateRoot:所有交易執行完且區塊定稿後的狀態樹根節點的Keccak 256位hash值(三棵樹之一)
  • transactionsRoot:當前區塊所有交易的樹的根節點的Keccak 256位hash值(三棵樹之一)
  • receiptsRoot:當前區塊所列的所有交易收據的樹的根節點的Keccak 256位hash值(三棵樹之一)
  • logsBloom:當前區塊中所有交易收據數據中可索引信息組成的Bloom過濾器
  • difficulty:當前區塊難度水平的純量值,通過前一個區塊的難度水平和時間戳來計算。
  • number:當前區塊的計數,創世紀塊的區塊序號為0,後續區塊序號都增加1
  • gasLimit:區塊的gas上限
  • gasUsed: 當前區塊中交易所用的總gas量
  • timestamp:當前區塊初始化時的unix的時間戳
  • extraData:當前區塊相關的任意字節數據,32字節以內
  • mixHash:256位Hash值,當與nonce組合時,證明此區塊已經執行了足夠的計算
  • nonce:64位Hash值,當與mixHash組合時,證明此區塊已經執行了足夠的計算

上文中提到的三棵樹,簡單說明:

Merkle Patricia Tree(簡稱MPT樹,實際上是一種trie前綴樹)是以太坊中的一種加密認證的數據結構,可以用來存儲所有的(key,value)對。以太坊區塊的頭部包括一個區塊頭,一個交易的列表和一個uncle區塊的列表。在區塊頭部包括了交易的hash樹根,用來校驗交易的列表。在p2p網絡上傳輸的交易是一個簡單的列表,它們被組裝成一個叫做trie樹的特殊數據結構,來計算根hash。值得注意的是,除了校驗區塊外,這個數據結構並不是必須的,一旦區塊被驗證正確,那麼它在技術上是可以忽略的。但是,這意味著交易列表在本地以trie樹的形式存儲,發送給客戶端的時候序列化成列表。客戶端接收到交易列表後重新構建交易列表trie樹來驗證根hash。RLP(Recursive length prefix encoding,遞歸長度前綴編碼),用來對trie樹種所有的條目進行編碼.參考:http://www.cnblogs.com/fengzhiwu/p/5565559.html

針對merkle樹和Trie樹的特點,以太坊對其改進。

目標一:保證樹的加密安全,那麼每個節點的散列值引用,在levelDB中查詢。在非葉節點,數據的表現形式:key代碼RLP編碼的SHA3散列值,value是節點RLP編碼。在獲取一個節點的內容,只要根據節點的散列值去訪問數據庫然後獲得RLP編碼,解碼即可。

目標二:引入多節點來提高效率。Merkle Patricia Tree節點分為下面幾種,

1.空節點,就理解為一個空串。

2.葉節點,鍵值對應為列表,key為16進制編碼,value是RLP編碼。

3.擴展節點,鍵值對應列表,value是其他節點散列值,通過這個散列值去鏈接到其他的節點。

4.分支節點,長度為17的列表,key還是編碼為16進制編碼,加上value,前16個元素對應key的16個十六進制字符,如果一個鍵值在這個分支終止了,那麼最後的一個元素表示為一個值。分支節點既是搜索的終止也可是路徑的中間點。

MPT樹中是16進制的hex-prefix,HP編碼,對key編碼。所以每個節點可能有16個孩子,引入一種特殊的終止標識符來標識key所對應的值是真實的值,還是其他節點的hash值。

一旦終止標識打開,那麼key是葉節點,對應真實的value。

終止標識關閉,那麼值就是在數據塊中查詢對應節點的hash。

不論key是奇偶長度,HP對其編碼後,一個單獨的hex字符或者4bit二進制數字,稱為一個nibble。

一個nibble加上key前面,對終止奇偶符編碼,最低位標奇偶性,第二低位編碼終止符狀態,一旦key是偶數,那麼加上另外一個nibble,值0來保證整體的偶性。


分享到:


相關文章: