本人15年畢業(yè)后一直從事Java電商平臺的開發(fā)工作,2017年4月開始接觸區(qū)塊鏈技術(shù),隨后慢慢自學(xué)了《精通比特幣》,談?wù)剠^(qū)塊鏈,以太坊,Solidity等相關(guān)內(nèi)容。前不久開始閱讀bitcoin的源碼,在網(wǎng)上找資料的過程中,發(fā)現(xiàn)并加入了區(qū)塊鏈研習(xí)社。隨后在編譯比特幣源碼的過程中與菜菜子進行了一系列的技術(shù)交流。剛好比特幣源碼班二期開班,隨后報名加入該班級,開啟了比特幣源碼的研讀之旅。源碼的閱讀相對枯燥無味,希望自己能在堅持下去。好了,廢話不多說,Let’s get started.
本系列文章基于bitcoin-0.15, 下載地址: https://github.com/bitcoin/bitcoin. 我們先從宏觀上看下源碼的目錄結(jié)構(gòu)以及數(shù)據(jù)目錄的結(jié)構(gòu)。項目源碼的目錄結(jié)構(gòu)如下:

接下來我們簡要分析下src目錄下幾個關(guān)鍵的模塊,后續(xù)隨著我們對源碼的不斷研究將詳細分析各個模塊的內(nèi)容。
./:網(wǎng)絡(luò)處理模塊,塊的產(chǎn)生,初始化模塊,鏈的操作模塊等
compact:處理文件兼容性相關(guān)的細節(jié),較為low level
consensus:交易/塊的驗證,merkle tree相關(guān)的計算,一些共識參數(shù)的定義
crypto:加密HASH函數(shù),SHA256、RIPEMD160等
leveldb:bitcoin使用level db存儲block、tx、utxo等內(nèi)容(文章后面有相關(guān)描述)https://github.com/google/leveldb
policy:與consensus相反,用戶可以根據(jù)自身的需求定義不同的policy,例如是否轉(zhuǎn)發(fā)大小為100k以上的交易等
primitives:塊和交易相關(guān)的基本數(shù)據(jù)類型定義
qt:桌面客戶端源程序
rpc:遠程過程調(diào)用接口的相關(guān)實現(xiàn)
script:腳本引擎,定義了操作碼,交易簽名的生成與驗證等
secp256k1:橢圓曲線函數(shù)庫
univalue:univalue庫https://github.com/jgarzik/univalue
wallet:錢包相關(guān)操作,地址的管理,交易的生成等
zmq:zmq是一個高性能的異步消息庫
接下來,我們來看一下數(shù)據(jù)目錄結(jié)構(gòu)并簡要分析下一些主要的文件:

? blocks/blk*.dat:所有的區(qū)塊數(shù)據(jù),這部分數(shù)據(jù)只有在錢包需要重新掃描丟失的交易,重組鏈以及向其他節(jié)點提供區(qū)塊數(shù)據(jù)等情況時被使用。
? blocks/rev*.dat:這些文件可以理解為“撤銷”(undo)文件。區(qū)塊鏈在某一種程度上可以看做是一個狀態(tài)機,每一種狀態(tài)我們叫做chain state(UTXOs),每當(dāng)接收到了一個塊,經(jīng)過一系列的處理(狀態(tài)轉(zhuǎn)換函數(shù))變成了另一個chain state。所以我們可以把一個塊當(dāng)作是某個chain state的一個補?。╬atch),同時把這些“撤銷”文件當(dāng)作是回退(reverse)操作的patch。當(dāng)發(fā)生區(qū)塊鏈重組(reorganization)的時候,這些數(shù)據(jù)可以方便快捷的回滾chain state.
? blocks/index/*:該目錄下是level db的存儲文件,記錄了該節(jié)點上所有塊的元數(shù)據(jù)信息以及怎樣在磁盤中找到塊的具體數(shù)據(jù)。如果沒有這部分數(shù)據(jù),查找一個塊將會非常的慢。
? chainstate/*:該目錄下是UTXO的level db存儲文件以及相關(guān)的一些meta信息,可以用于驗證塊和交易的有效性。這部分數(shù)據(jù)也可以通過參數(shù)-reindex根據(jù)blocks重新生成。如果沒有這部分數(shù)據(jù),需要掃描所有的塊進行區(qū)塊和交易的驗證將會非常耗時。
? wallet.data:最為重要的錢包文件,該文件中存儲著錢包中所有的密鑰信息。我們常說的備份bitcoin core錢包,就是備份該文件。只要有了該文件,把文件放到對應(yīng)的錢包數(shù)據(jù)目錄下,你可以在任何其他任何bitcoin core節(jié)點操作你的錢包。
? debug.log:該文件記錄的程序運行的各種提示信息。在遇到問題時,可以通過查看該文件獲得具體的信息提示。啟動bitcoind時,可以通過參數(shù)-debug設(shè)置日志級別。
本篇文章簡要分析了比特幣源碼的目錄結(jié)構(gòu)以及數(shù)據(jù)存儲目錄結(jié)構(gòu),接下來的文章我們將進入源碼的閱讀。