1. 程式人生 > >比特幣區塊鏈的資料結構解析

比特幣區塊鏈的資料結構解析

區塊鏈(資料區塊、資料塊、資料塊鏈)作為比特幣的核心概念,對於理解比特幣結構起著至關重要的作用。在《什麼是資料區塊》中,編者從資料區塊分散式交易記錄的角度簡單的介紹了資料區塊的概念。今天,編者從資料區塊的程式結構上來詳細的分析資料區塊裡面到底記錄了什麼資訊。

資料區塊檔案的位置
如果你用的是Bitcoin-Qt客戶端,那麼資料區塊的資訊就存在你的電腦裡面。每次當你開啟Bitcoin-Qt,資料區塊都會跟整個P2P網路分散式資料庫同步。根據作業系統的不同,資料區塊目錄blocks一般存放路徑為:

Windows: %APPDATA%\Bitcoin\ 
Linux:~/.bitcoin/ 
Mac OS: ~/Library/Application Support/Bitcoin/ 

開啟資料區塊檔案
我們開啟blocks資料夾,便可以看到很多名為blkXXX.dat的檔案,這些檔案中儲存了傳說中的資料區塊記錄。


blkXXX.dat檔案在終端下面可以用hexdump開啟。
hexdump -n 10000 -C blk00000.dat

資料區塊結構
hexdump程式把資料區塊檔案轉化為十六進位制+ASCII表示,編者解釋一下:每一個數據區塊記錄了六個內容:神奇數、區塊大小、資料區塊頭部資訊、交易計數、交易詳情。在這當中,資料區塊頭部資訊的HASH值是下一個新區塊的HASH值的參考目標數,最後一項交易詳情記錄了該區塊中所有的交易記錄(編者會在以後詳細說明交易記錄的結構)。
資料區塊結構如下圖:

資料區塊頭部結構
資料區塊頭部結構中記錄了:版本號、前一個區塊的記錄、Merkle樹的根值、時間戳、目標特徵值、隨機數。
在比特幣礦工挖礦的過程就是產生新的資料區塊的過程(編者以後會詳細說明),這個過程需要對比前一個數據區塊頭部的HASH值和隨機數,如果滿足一定條件則生成新的區塊。Merkle樹的根值為該區塊中所有被記錄交易的根節點HASH值,中本聰用一個HASH樹來對每一比交易進行數字簽名,以確保每一比交易都不可偽造和沒有重複交易,Merkle樹就是HASH樹的一種。資料區塊頭部結構如下圖:


交易記錄

交易記錄就像一個記賬本一樣,記錄了所有比特幣的交易資訊,每一個比特幣玩家的比特幣收支情況都被永久的嵌入了資料區塊中以供別人查詢,這也就是為什麼每一比比特幣交易都是可以查詢到的。這個這些資料區塊中的交易資料存放在每一個比特幣玩家的客戶端節點中,所有的這些節點則組成了比特幣那及其堅韌的分散式資料庫系統。任何一個節點的資料被破壞都不會影響整個資料庫的正常運轉,因為其它的健康節點中都儲存了完整的資料庫。
在本文中,編者將詳細解析資料區塊中交易記錄的結構。

交易記錄結構
資料區塊的交易記錄中,詳細記載了比特幣的交易記錄和相關細節。其中在比特幣收支詳情裡面,記錄了收支的
比特幣地址
和merkle節點值等情況,因此收支詳情是交易記錄中最重要的部分。
完整的交易記錄結構如下表格:


比特幣支出和接收交易的結構
在資料塊中,比特幣支出和接收交易是寫在一起的,整個收支記錄包括很多比記錄。每一比記錄都有自己的索引編號以供查詢。

每一比記錄中包括了生成時間、引用交易的雜湊值、交易記錄索引編號、比特幣支出地址、支出地址數量等細節。每一比收支交易記錄都有一個Merkle節點值,這個hash節點值是整個Merkle樹的一部分,決定了每一個地址都不能重複交易和被偽造。
收支交易結構圖如下: