什麼是區塊?
區塊(Block)本質上是一個數據塊。 該數據塊存放著一系列交易,用於驗證交易資訊有效性和生成下一個區塊。 由這樣一個一個的區塊按照一定規則有序連結起來的資料結構就是區塊鏈。 區塊即是區塊鏈的基本構成組織。
區塊結構
概括而言,區塊由區塊頭和區塊主體構成。 其中,區塊頭中包括一組中繼資料; 區塊主體則是一系列交易清單。 囙此也可以簡單理解為:區塊=區塊頭+交易。 區塊結構具體如下圖:
區塊頭
區塊頭的長度為80位元組,在整體區塊中所占體量較小。 其包含的中繼資料為:區塊版本、前個區塊雜湊、Merkle Root雜湊、時間戳記、Bits難度、亂數Nonce六大部分。
字段 | 字節 | 說明 |
區塊版本 | 4字節 | 區塊版本號,表示本區塊遵守的驗證規則 |
前個區塊哈希 | 32字節 | 前一區塊的哈希值,由SHA256算法計算得來 |
Merkle Root哈希 | 32字節 | 當前區塊中交易的Merkle Root哈希值 |
時間戳 | 4字節 | 當前區塊產生的近似時間 |
Bits難度 | 4字節 | 該區塊工作量證明算法的難度目標 |
隨機數Nonce | 4字節 | 滿足工作量證明算法難度目標的隨機數 |
1.區塊版本
區塊版本是指區塊版本號,用以標識交易版本和當前區塊交易所參照的驗證規則。可以理解為,類似安卓1.0,區塊也擁有自己的版本號。
2.前個區塊哈希
前個區塊哈希,顧名思義是指對前一個區塊的區塊頭數據進行哈希計算得來的哈希值,也被稱為“父區塊哈希值”。其作用是使得每個新挖出的區塊都能按照秩序鏈接在前一個區塊後面。根據該規則,從當前的區塊可以一直追溯到創世區塊。
3.Merkle Root哈希
區塊鏈中的每個區塊都包含了產生於該區塊的所有交易,這些交易會以Merkle Tree來表示。所謂的Merkle Tree是一種樹形數據結構,其作用是歸納一個區塊中的所有交易,同時生成整個交易集合的數字簽名,即Merkle Root哈希。其具體計算方式如下:
(1)從區塊交易列表中獲取每對Txid,並對它們進行兩次SHA256運算,得到哈希值。
(2)如果為奇數,則復制一份湊成偶數再進行兩次SHA256運算,得到哈希值。
(3)然後以此遞歸(1)、(2),直到區塊中的所有交易運算結束,最終獲得一個哈希,即Merkle Root。
4.時間戳
時間戳是指當前區塊產生的近似時間,具體會精確到秒。其主要作用是保證整條鏈上的區塊都按照時間順序進行排列。
5.Bits難度
Bits難度是指挖礦目標難度Target的壓縮形式。難度目標值是比特幣區塊鍊網絡為了調節挖礦難度而設置的一種機制,以保證挖礦速度在10分鐘左右。每生成2016個區塊後(每兩週)就重新計算一次難度目標。
6.隨機數Nonce
Nonce是指滿足工作量證明算法難度目標的隨機數,也就是我們常說的“挖礦”隨機數。節點需要對區塊頭數據進行不斷的哈希運算,直至找到能使區塊哈希小於挖礦目標難度Target的隨機數。
區塊主體-交易
1.Coinbase交易
每個區塊中第一筆交易都是Coinbase交易,用於獎勵礦工將交易打包進區塊。獎勵分為兩部分:區塊獎勵+除Coinbase交易外的其他交易手續費總和。
2.交易結構
當前比特幣交易存在兩種交易結構,即比特幣白皮書中定義的交易結構和新的隔離見證交易結構。兩者的不同之處在於:白皮書定義的交易結構將簽名數據放在交易輸入裡;隔離見證則將簽名數據“分離”出來,放在交易時間鎖之前。