C++
如何理解比特幣原始碼
我不是 C++ 專業人士。我將 C++ 作為我本科課程的一部分來閱讀。我對未來的貨幣即比特幣充滿熱情。
但我不明白原始碼結構。如何閱讀原始碼?正如我已經說過的,我對 C++ 有非常基本的了解。
但是,如果不理解某些東西(函式、庫、標題),我可以在路上用Google搜尋。
我面臨的實際問題是
src/
目錄內部。我不明白src/
. 這是我可能應該開始閱讀的第一個文件。誰能以某種樹狀結構向我解釋所有項目的所有流程?~/GitHub/bitcoin/src ❯ ls ✔ master Makefile.am coincontrol.h miner.h script Makefile.bench.include coins.cpp net.cpp secp256k1 Makefile.qt.include coins.h net.h serialize.h Makefile.qttest.include compat netbase.cpp streams.h Makefile.test.include compat.h netbase.h support addrman.cpp compressor.cpp noui.cpp sync.cpp addrman.h compressor.h noui.h sync.h alert.cpp config obj test alert.h consensus obj-test threadsafety.h amount.cpp core_io.h policy timedata.cpp amount.h core_memusage.h pow.cpp timedata.h arith_uint256.cpp core_read.cpp pow.h tinyformat.h arith_uint256.h core_write.cpp prevector.h torcontrol.cpp base58.cpp crypto primitives torcontrol.h base58.h dbwrapper.cpp protocol.cpp txdb.cpp bench dbwrapper.h protocol.h txdb.h bitcoin-cli-res.rc hash.cpp pubkey.cpp txmempool.cpp bitcoin-cli.cpp hash.h pubkey.h txmempool.h bitcoin-tx-res.rc httprpc.cpp qt ui_interface.h bitcoin-tx.cpp httprpc.h random.cpp uint256.cpp bitcoind-res.rc httpserver.cpp random.h uint256.h bitcoind.cpp httpserver.h rest.cpp undo.h bloom.cpp init.cpp reverselock.h univalue bloom.h init.h rpcblockchain.cpp util.cpp chain.cpp key.cpp rpcclient.cpp util.h chain.h key.h rpcclient.h utilmoneystr.cpp chainparams.cpp keystore.cpp rpcmining.cpp utilmoneystr.h chainparams.h keystore.h rpcmisc.cpp utilstrencodings.cpp chainparamsbase.cpp leveldb rpcnet.cpp utilstrencodings.h chainparamsbase.h limitedmap.h rpcprotocol.cpp utiltime.cpp chainparamsseeds.h main.cpp rpcprotocol.h utiltime.h checkpoints.cpp main.h rpcrawtransaction.cpp validationinterface.cpp checkpoints.h memusage.h rpcserver.cpp validationinterface.h checkqueue.h merkleblock.cpp rpcserver.h version.h clientversion.cpp merkleblock.h scheduler.cpp wallet clientversion.h miner.cpp scheduler.h zmq
最近我遇到了一種情況,我必須在比特幣核心 c++ 程式碼庫上工作。來自 c# 背景,我遇到了和你一樣的問題。我還研究了每個人都建議的解決方案,但我想為這個問題提供一個更精確的解決方案:
先決條件
- 您需要了解 C++ 項目結構的基礎知識。像這樣的東西:
root\ lib\ submodule1\ submodule2\ MakeFile.am src\ component1\ comp1.cpp comp1.h component2\ main.cpp Makefile.am .gitmodules .gitignore Makefile.am configure.ac autogen.sh
這是一個非常基本的項目結構,它可以變成一個非常複雜的結構,但只是給出一個想法,讓我們忍受它。我不會向您提供這些文件的詳細資訊,但您可以隨時查看我的 c++ 樣板專用儲存庫。諸如 ,
Makefile.am
等文件configure.ac
用於Autotools
orGNU Build Tools
。基本上,Autotools 是一組工具,Autoconf、Automake、make 實用程序和 Libtools,用於建構 c++ 項目。
- 獲取基本資訊
Autotools
開始吧
- 下載 Bitcoin-core 並打開
/src/Makefile.am
.- 比特幣程式碼庫是幾個程序的組合,如
bitcoind
、和. 您可以看到文件中提到的這些程序,搜尋 bin_PROGRAMS 宏。bitcoin-cli``bitcoin-tx``bitcoin-qt``src/Makefile.am
if BUILD_BITCOIND bin_PROGRAMS += bitcoind endif if BUILD_BITCOIN_CLI bin_PROGRAMS += bitcoin-cli endif if BUILD_BITCOIN_TX bin_PROGRAMS += bitcoin-tx endif
- 知道要調試哪個執行檔很重要?- 我舉一個例子
bitcoind
- 比特幣的開發人員已將模組(共識、伺服器、cli、錢包、通用、加密等)轉換為靜態庫(.a 文件),以便可以在所有這些程序中共享和使用它們。為了了解這些文件是如何管理的,正如我所說,開始查看Makefile.am,它位於 src 目錄中。例如:
- 在比特幣的
src/Makefile.am
文件中,我們有bitcoind
對嗎?讓我們在該文件中搜尋此文本。您將分別獲得該程序的源文件(基本上是定義 main() 的文件)和連結的靜態庫(.a 文件)的宏和bitcoind_SOURCES
程序。bitcoind_LDADD``bitcoind
- 現在讓我們查找其中一個連結庫,例如,
libbitcoin_server
您會找到libbitcoin_server_a_CPPFLAGS
和宏。在宏中,您在那裡定義了所有文件。libbitcoin_server_a_CXXFLAGS``libbitcoin_server_a_SOURCES``libbitcoin_server_a_SOURCES``.cpp``.h
我希望這些能給你一些見解。很快我將寫一篇關於這個主題的部落格。完成後將編輯此答案。
編輯:這是我寫的關於這個主題的部落格。希望這會有所幫助。