C++

如何理解比特幣原始碼

  • March 7, 2019

我不是 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用於Autotoolsor GNU 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

我希望這些能給你一些見解。很快我將寫一篇關於這個主題的部落格。完成後將編輯此答案。

編輯:這是我寫的關於這個主題的部落格。希望這會有所幫助。

引用自:https://bitcoin.stackexchange.com/questions/41692