區塊鏈學習(6)區塊鏈
寫了幾篇區塊鏈的學習筆記,今天來寫寫比特幣中的區塊鏈。比特幣中區塊鏈是由包含交易信息的區塊從後向前有序鏈接起來的數據結構。每個區塊從後向前有序地鏈接在這個鏈條裏,每個區塊都指向前一個區塊。
區塊結構
區塊是一種數據結構,存放了多組交易,並且塊與塊之間相互連接,每個塊都指向前一個區塊。為了提高性能,一組交易確認打包成塊,下面就是區塊的結構
區塊頭中由版本,父區塊哈希值,Merkle根,時間戳,難度目標,Nonce。Nonce、難度目標和時間戳會用於挖礦過程。
每個區塊通過SHA256算法對區塊頭進行二次哈希計算而得到一個哈希值叫做區塊哈希值,不過只有區塊頭進行了哈希計算。區塊哈希值可以唯一的表示一個區塊。還可以用區塊高度表示區塊,第一個區塊高度為0,第二個區塊為1,之後的區塊依次增加。但區塊高度並不能唯一的表示一個區塊,若區塊鏈出現分叉就有可能出現兩個區塊的高度相同。而一個區塊中的區塊頭內儲存著它上一個區塊的哈希值的引用,而上一個區塊的區塊頭內又有再上一個的區塊的哈希值的引用。這樣就將各區塊組成了區塊鏈。
該區塊中的所有交易都是用Merkle樹表示的,在區塊頭中就儲存了Merkle樹的根。關於Merkle樹這個博客講的是相當詳細https://blog.csdn.net/wo541075754/article/details/54632929
有興趣的可以去看看。
Merkle樹,通常也被稱作Hash樹,樹中的節點儲存的都是哈希值,葉子節點儲存著交易。Merkle樹是自底向上構建的。有A,B,C,D四個交易,先將四個交易進行兩次哈希運算。
HA = SHA256(SHA256(交易A))
HB = SHA256(SHA256(交易B))
HC = SHA256(SHA256(交易C))
HD = SHA256(SHA256(交易D))
分別得到四個哈希值HA,HB,HC.HD作為葉子節點,子節點A和子節點B的兩個32字節的哈希值將被串聯成64字節的字符串。子節點C和子節點D串聯得到一個64字節的字符串。隨後將字符串進行兩次哈希來產生父節點的哈希值,
HAB = SHA256(SHA256(HA + HB))
HCD =SHA256(SHA256(HA + HB))
接著再繼續相同的操作,將HAB和HCD串聯就可以得到Merkle樹的根
Merkle樹是二叉樹,所以它需要偶數個葉子節點。如果僅有奇數個交易,那最後的交易就會被復制一份以構成偶數個葉子節點。有了Merkle樹對於SPV節點只需下載區塊頭,而不需要下載每筆交易和區塊。
區塊鏈學習(6)區塊鏈