Ich bin kein C++-Profi. Ich lese C++ als Teil meines Grundschulkurses. Ich interessiere mich sehr für die zukünftige Währung, dh Bitcoin.
Aber ich verstehe die Quellcodestruktur nicht. Wie liest man den Quellcode? Wie ich bereits sagte, habe ich sehr grundlegende Kenntnisse in C++.
Ich kann jedoch unterwegs googeln, wenn ich etwas nicht verstehe (Funktionen, Bibliotheken, Header).
Das eigentliche Problem, dem ich gegenüberstehe, liegt im src/
Verzeichnis. Ich verstehe den Fluss von Dateien und Verzeichnissen in src/
. Welches ist die erste Datei, die ich wahrscheinlich anfangen sollte zu lesen. Kann mir jemand den gesamten Ablauf des gesamten Projekts in einer Art Baumstruktur erklären?
~/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
Kürzlich befand ich mich in einer Situation, in der ich an der Codebasis von Bitcoin-core c++ arbeiten musste. Da ich aus c # komme, hatte ich das gleiche Problem, mit dem Sie konfrontiert waren. Ich habe mir auch die Lösungen angesehen, die alle vorschlagen, dennoch möchte ich Ihnen eine genauere Lösung für diese Frage geben:
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
Dies ist eine sehr grundlegende Projektstruktur, die zu einer sehr komplexen werden kann, aber nur um eine Vorstellung zu geben, lassen Sie uns damit ertragen. Ich werde Ihnen keine Details zu diesen Dateien geben, aber Sie können jederzeit mein dediziertes Repository für C++-Boilerplates auschecken. Dateien wie , Makefile.am
etc. configure.ac
gibt es für Autotools
oder GNU Build Tools
. Im Grunde genommen handelt es sich bei Autotools um eine Reihe von Tools, Autoconf, Automake, Make Utility und Libtools, die zum Erstellen von C++-Projekten verwendet werden.
Autotools
/src/Makefile.am
.bitcoind
, bitcoin-cli
und . Sie können diese in der Datei erwähnten Programme sehen, suchen Sie nach dem Makro bin_PROGRAMS.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
Die Entwickler von Bitcoin haben Module (Consensus, Server, CLI, Wallet, Common, Crypto usw.) in statische Bibliotheken (.a-Dateien) umgewandelt, damit sie von all diesen Programmen gemeinsam genutzt und verwendet werden können. Um zu verstehen, wie diese Dateien verwaltet werden, werfen Sie, wie gesagt, einen Blick in die Datei Makefile.am , die sich im Verzeichnis src befindet. Zum Beispiel:
In der Bitcoin- src/Makefile.am
Datei haben wir bitcoind
Recht? Suchen wir diesen Text in dieser Datei. Sie erhalten bitcoind_SOURCES
und bitcoind_LDADD
Makros für die Quelldatei dieses Programms (im Grunde die Datei, in der main () definiert ist) und verknüpfte statische Bibliotheken (.a-Dateien) zum bitcoind
Programmieren.
Lassen Sie uns nun nach einer der verknüpften Bibliotheken suchen, sagen wir libbitcoin_server
, Sie werden libbitcoin_server_a_CPPFLAGS
, libbitcoin_server_a_CXXFLAGS
und libbitcoin_server_a_SOURCES
Makros finden. Im libbitcoin_server_a_SOURCES
Makro haben Sie dort alle .cpp
und .h
Dateien definiert.
Ich hoffe, diese hätten Ihnen einige Einblicke gegeben, mit denen Sie beginnen können. Bald werde ich einen Blog zu diesem Thema schreiben. Wird diese Antwort bearbeiten, sobald sie fertig ist.
EDIT: Hier ist ein Blog zu diesem Thema, den ich geschrieben habe. Hoffe das hilft.
Ich bin in meinem letzten Studienjahr und ich erinnere mich, dass ich vor 2 Jahren genau in Ihrer Situation war. Aus meiner Sicht können Sie in diesem Stadium zwei Strategien verfolgen.
Sie müssen zuerst das Protokoll verstehen, und das Lesen von Satoshis Originalpapier oder einer der einfacheren Optionen ist unerlässlich. Es hilft auch sehr, die konzeptionellen Unterschiede zwischen Bitcoin und anderen Währungen wie Ripple und Peercoin zu verstehen.
Wenn Sie so viel wie möglich über die Bitcoin-Implementierung lernen möchten, würde ich vorschlagen, dass Sie Bitcoin-Core aufgeben und zu einer der Python-Implementierungen wechseln. Nun, es gibt ein paar Macken bei den Python-Implementierungen , aber Ihr Lernen wäre viel schneller und Sie wären später in einer viel besseren Position, um den cpp-Code zu verstehen.
Wenn Sie beim Bitcoin-Kern bleiben wollen und bereit sind, eine steile Lernkurve zu tolerieren, gibt es immer noch ein paar Ressourcen, um es zu versüßen. Sie müssen verstehen, dass Sie nicht nur cpp beherrschen müssen, um den Bitcoin-Kern zu verstehen, sondern auch viel vom GNU-Build-System, den Makes und den Autoconfs und so weiter .
Um Ihnen nun zu helfen, die Struktur des Codes in src zu verstehen, können Sie dies überprüfen .
Bearbeiten (7:7:2016): Viele der neuen Diskussionen in der bitcoin:core-Welt drehen sich um die CPP-Sprache selbst. CPP selbst erfährt alle 4 Jahre erhebliche Veränderungen und es gibt viele Diskussionen darüber, welche CPP-Sprachfunktionen in Bitcoin-Core implementiert/integriert werden können. Daher ist es erforderlich, dass Sie ein gründliches Verständnis von CPP haben, zusammen mit neuen Sprachfunktionen, die ständig hinzugefügt werden, und deren Beziehungen zu den vorherigen Funktionen.
Ich habe da einen anderen Zugang. Sie können dies auch verwenden.
Bitcoin verwendet Doxygen -Kommentare, um den Code zu erklären. Sie können die neueste Kopie des Codes nehmen, mit Doxygen selbst eine Klassenhierarchie erstellen und dann durch die verschiedenen Klassen navigieren.
Der nächste Schritt wäre, es zu erstellen und im -regtest-Modus auszuführen.
Verwenden Sie gdb, um Haltepunkte hinzuzufügen, und untersuchen Sie den Fluss.
Sie können mit init- und util-Dateien beginnen und dann andere durchgehen. Sie haben generischen Code, Protokollierung und Dateien. Und dann gehen Sie zu net.cpp, validation.cpp, um die detailliertere Logik zu finden.
Meiner Meinung nach ist es ein viel besserer Ansatz, in den Code einzutauchen und chaotisch zu werden, als mehr zu lesen. Machen Sie sich in den Code schmutzig, schreiben Sie etwas davon, erhalten Sie Fehler und verstehen Sie ihn auf dem Weg.
Der Quellcode von Bitcoin-qt ist aus dem von Satochi geschriebenen Originalcode hervorgegangen. Letzteres ist meiner Meinung nach viel sauberer und einfacher zu lesen. Ich habe ein neues Buch, das den ursprünglichen Quellcode von Statochi auf lulu.com analysiert: A Dissection of Bitcoin
Mikko Ohtamaa
abhimanyuaryan
Mikko Ohtamaa
Fraggle