Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 38 additions & 28 deletions library-structure.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -8,50 +8,60 @@ Bitcoin Core compilation outputs a number of libraries, some which are designed
The internally-used libraries generally have unstable APIs making them unsuitable for re-use, but `libbitcoin_consensus` and `libbitcoin_kernel` are designed to be re-used by external applications.

Bitcoin Core has a https://github.com/bitcoin/bitcoin/blob/master/doc/design/libraries.md[guide^] which describes the various libraries, their conventions, and their various dependencies.
The dependency graph is shown below for convenience, but may not be up-to-date with the Bitcoin Core document.

[id=library-dependency-graph]
.Bitcoin library dependency graph
[mermaid, target=bitcoin-lib-dependencies]
[mermaid, target=bitcoion-lib-dependencies]

....
flowchart TB
bitcoin-wallet --> libbitcoin_wallet_tool
bitcoin-wallet --> libbitcoin_wallet

bitcoin-qt ---> libbitcoin_wallet
bitcoin-qt ---> libbitcoinqt
bitcoin-qt ---> libbitcoin_node
bitcoin-cli[bitcoin-cli]-->libbitcoin_cli;

bitcoind[bitcoind]-->libbitcoin_node;
bitcoind[bitcoind]-->libbitcoin_wallet;

bitcoin-qt[bitcoin-qt]-->libbitcoin_node;
bitcoin-qt[bitcoin-qt]-->libbitcoinqt;
bitcoin-qt[bitcoin-qt]-->libbitcoin_wallet;

bitcoin-wallet[bitcoin-wallet]-->libbitcoin_wallet;
bitcoin-wallet[bitcoin-wallet]-->libbitcoin_wallet_tool;

bitcoind ---> libbitcoin_wallet
bitcoind --> libbitcoin_node
libbitcoin_cli-->libbitcoin_util;
libbitcoin_cli-->libbitcoin_common;

bitcoin-cli ---> libbitcoin-cli
libbitcoin_consensus-->libbitcoin_crypto;

libbitcoin_wallet_tool --> libbitcoin_wallet
libbitcoin_wallet_tool --> libbitcoin_util
libbitcoin_common-->libbitcoin_consensus;
libbitcoin_common-->libbitcoin_crypto;
libbitcoin_common-->libbitcoin_util;

libbitcoin-cli --> libbitcoin_common
libbitcoin-cli --> libbitcoin_util
libbitcoin_kernel-->libbitcoin_consensus;
libbitcoin_kernel-->libbitcoin_crypto;
libbitcoin_kernel-->libbitcoin_util;

libbitcoin_node --> libbitcoin_common
libbitcoin_node --> libbitcoin_consensus
libbitcoin_node --> libbitcoin_kernel
libbitcoin_node --> libbitcoin_util
libbitcoin_node-->libbitcoin_consensus;
libbitcoin_node-->libbitcoin_crypto;
libbitcoin_node-->libbitcoin_kernel;
libbitcoin_node-->libbitcoin_common;
libbitcoin_node-->libbitcoin_util;

libbitcoinqt --> libbitcoin_util
libbitcoinqt --> libbitcoin_common
libbitcoinqt-->libbitcoin_common;
libbitcoinqt-->libbitcoin_util;

libbitcoin_wallet --> libbitcoin_util
libbitcoin_wallet --> libbitcoin_common
libbitcoin_util-->libbitcoin_crypto;

libbitcoin_common --> libbitcoin_util
libbitcoin_common --> libbitcoin_consensus
libbitcoin_wallet-->libbitcoin_common;
libbitcoin_wallet-->libbitcoin_crypto;
libbitcoin_wallet-->libbitcoin_util;

libbitcoin_kernel --> libbitcoin_consensus
libbitcoin_kernel --> libbitcoin_util
libbitcoin_wallet_tool-->libbitcoin_wallet;
libbitcoin_wallet_tool-->libbitcoin_util;

classDef types fill:green,color:white,stroke:green;
class bitcoin-wallet,bitcoind,bitcoin-cli,bitcoin-qt types
classDef bold stroke-width:2px, font-weight:bold, font-size: smaller;
class bitcoin-qt,bitcoind,bitcoin-cli,bitcoin-wallet bold
....
**Dependency graph**. Arrows show linker symbol dependencies. `libbitcoin_crypto` depends on nothing. `libbitcoin_util` is depended on by everything. `libbitcoin_kernel` depends only on consensus, crypto, and util.

It follows that API changes to the libraries which are internally-facing can be done slightly easier than for libraries with externally-facing APIs, for which more care for compatibility must be taken.