本人15年畢業后一直從事Java電商平臺的開發工作,2017年4月開始接觸區塊鏈技術,隨后慢慢自學了《精通比特幣》,談談區塊鏈,以太坊,Solidity等相關內容。前不久開始閱讀bitcoin的源碼,在網上找資料的過程中,發現并加入了區塊鏈研習社。隨后在編譯比特幣源碼的過程中與菜菜子進行了一系列的技術交流。剛好比特幣源碼班二期開班,隨后報名加入該班級,開啟了比特幣源碼的研讀之旅。源碼的閱讀相對枯燥無味,希望自己能在堅持下去。好了,廢話不多說,Let’s get started.
本系列文章基于bitcoin-0.15, 下載地址: https://github.com/bitcoin/bitcoin. 我們先從宏觀上看下源碼的目錄結構以及數據目錄的結構。項目源碼的目錄結構如下:
接下來我們簡要分析下src目錄下幾個關鍵的模塊,后續隨著我們對源碼的不斷研究將詳細分析各個模塊的內容。
./:網絡處理模塊,塊的產生,初始化模塊,鏈的操作模塊等
compact:處理文件兼容性相關的細節,較為low level
consensus:交易/塊的驗證,merkle tree相關的計算,一些共識參數的定義
crypto:加密HASH函數,SHA256、RIPEMD160等
leveldb:bitcoin使用level db存儲block、tx、utxo等內容(文章后面有相關描述)https://github.com/google/leveldb
policy:與consensus相反,用戶可以根據自身的需求定義不同的policy,例如是否轉發大小為100k以上的交易等
primitives:塊和交易相關的基本數據類型定義
qt:桌面客戶端源程序
rpc:遠程過程調用接口的相關實現
script:腳本引擎,定義了操作碼,交易簽名的生成與驗證等
secp256k1:橢圓曲線函數庫
univalue:univalue庫https://github.com/jgarzik/univalue
wallet:錢包相關操作,地址的管理,交易的生成等
zmq:zmq是一個高性能的異步消息庫
接下來,我們來看一下數據目錄結構并簡要分析下一些主要的文件:
? blocks/blk*.dat:所有的區塊數據,這部分數據只有在錢包需要重新掃描丟失的交易,重組鏈以及向其他節點提供區塊數據等情況時被使用。
? blocks/rev*.dat:這些文件可以理解為“撤銷”(undo)文件。區塊鏈在某一種程度上可以看做是一個狀態機,每一種狀態我們叫做chain state(UTXOs),每當接收到了一個塊,經過一系列的處理(狀態轉換函數)變成了另一個chain state。所以我們可以把一個塊當作是某個chain state的一個補丁(patch),同時把這些“撤銷”文件當作是回退(reverse)操作的patch。當發生區塊鏈重組(reorganization)的時候,這些數據可以方便快捷的回滾chain state.
? blocks/index/*:該目錄下是level db的存儲文件,記錄了該節點上所有塊的元數據信息以及怎樣在磁盤中找到塊的具體數據。如果沒有這部分數據,查找一個塊將會非常的慢。
? chainstate/*:該目錄下是UTXO的level db存儲文件以及相關的一些meta信息,可以用于驗證塊和交易的有效性。這部分數據也可以通過參數-reindex根據blocks重新生成。如果沒有這部分數據,需要掃描所有的塊進行區塊和交易的驗證將會非常耗時。
? wallet.data:最為重要的錢包文件,該文件中存儲著錢包中所有的密鑰信息。我們常說的備份bitcoin core錢包,就是備份該文件。只要有了該文件,把文件放到對應的錢包數據目錄下,你可以在任何其他任何bitcoin core節點操作你的錢包。
? debug.log:該文件記錄的程序運行的各種提示信息。在遇到問題時,可以通過查看該文件獲得具體的信息提示。啟動bitcoind時,可以通過參數-debug設置日志級別。
本篇文章簡要分析了比特幣源碼的目錄結構以及數據存儲目錄結構,接下來的文章我們將進入源碼的閱讀。