Wie man den Bitcoin-Quellcode versteht

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
Ich denke, der gute Ausgangspunkt wäre ein Online-Kurs in C++. Andernfalls würden Sie eine Fremdsprache lesen, von der Sie keine Ahnung haben.
Ich kenne C++. Ich bin auch Update mit C++, C++14. Es ist nur so, dass ich nie an einem großen Projekt gearbeitet habe, also kenne ich den Arbeitsablauf nicht. @MikkoOhtamaa würden Sie mir eine gute Ressource vorschlagen, die nicht die Sprachgrundlagen abdeckt und die erweiterten Funktionen der Sprache selbst abdeckt? Derzeit zähle ich auf Videos, die auf channel9.msdn gepostet werden, ist das in Ordnung?
Alle Microsoft-Quellen sind ziemlich anständig, was fortgeschrittenes C++ betrifft. Ich schlage auch vor, dass Sie sich eine gute IDE besorgen, die Autocompletion, Code Insight und so funktioniert, dass Sie sich im Codebaum entsprechend dem Codefluss bewegen können.
Nun, das ist keine vollständige Antwort, aber es gibt eine Menge Dinge in main.cpp zu sehen. Da würde ich anfangen.

Antworten (4)

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:

Voraussetzungen

  • Sie müssen die Grundlagen der C++-Projektstruktur verstehen. etwas wie das:
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.ametc. configure.acgibt es für Autotoolsoder 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.

  • Holen Sie sich die Grundlagen vonAutotools

Lasst uns beginnen

  • Laden Sie Bitcoin-Core herunter und öffnen Sie /src/Makefile.am.
  • Die Bitcoin-Codebasis ist eine Kombination aus mehreren Programmen wie bitcoind, bitcoin-cliund . Sie können diese in der Datei erwähnten Programme sehen, suchen Sie nach dem Makro bin_PROGRAMS.bitcoin-txbitcoin-qtsrc/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
  • Es ist wichtig zu wissen, welche ausführbare Datei Sie debuggen möchten. - Ich gebe ein Beispiel fürbitcoind
  • 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.amDatei haben wir bitcoindRecht? Suchen wir diesen Text in dieser Datei. Sie erhalten bitcoind_SOURCESund bitcoind_LDADDMakros für die Quelldatei dieses Programms (im Grunde die Datei, in der main () definiert ist) und verknüpfte statische Bibliotheken (.a-Dateien) zum bitcoindProgrammieren.

  • Lassen Sie uns nun nach einer der verknüpften Bibliotheken suchen, sagen wir libbitcoin_server, Sie werden libbitcoin_server_a_CPPFLAGS, libbitcoin_server_a_CXXFLAGSund libbitcoin_server_a_SOURCESMakros finden. Im libbitcoin_server_a_SOURCESMakro haben Sie dort alle .cppund .hDateien 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.

Bitcoin Core wechselt in der kommenden Version 0.13 zu C++11. Inzwischen ist C++14 bereits standardisiert und C++17 ist in vollem Gange. Die Aussage, dass Bitcoin Core immer die neuesten Funktionen verwendet, scheint eine seltsame Aussage zu sein.
Ich habe diese Aussage in etwas moderateres geändert, hoffe ich :). Ich werde nicht mit Einstein über die Relativitätstheorie streiten. :)

Ich habe da einen anderen Zugang. Sie können dies auch verwenden.

  1. 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.

  2. Der nächste Schritt wäre, es zu erstellen und im -regtest-Modus auszuführen.

  3. Verwenden Sie gdb, um Haltepunkte hinzuzufügen, und untersuchen Sie den Fluss.

  4. 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.

  5. 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