Skip to content
Merged
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
72 changes: 43 additions & 29 deletions library-structure.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -5,53 +5,67 @@
== Library structure

Bitcoin Core compilation outputs a number of libraries, some which are designed to be used internally, and some which are designed to be re-used by external applications.
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.
The internally-used libraries generally have unstable APIs making them unsuitable for re-use, but `libbitcoin_kernel` (still a WIP) is 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-->libbitcoin_cli;

bitcoind-->libbitcoin_node;
bitcoind-->libbitcoin_wallet;

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

bitcoin-wallet-->libbitcoin_wallet;
bitcoin-wallet-->libbitcoin_common;
bitcoin-wallet-->libbitcoin_util;

bitcoin-node-->libbitcoin_node;
bitcoin-node-->libbitcoin_ipc;
bitcoin-node-->libbitcoin_wallet;

bitcoin-gui-->libbitcoinqt;
bitcoin-gui-->libbitcoin_node;
bitcoin-gui-->libbitcoin_ipc;

libbitcoin_cli-->libbitcoin_common;
libbitcoin_cli-->libbitcoin_util;

bitcoind ---> libbitcoin_wallet
bitcoind --> libbitcoin_node
libbitcoin_consensus-->libbitcoin_crypto;

bitcoin-cli ---> libbitcoin-cli
libbitcoin_common-->libbitcoin_consensus;
libbitcoin_common-->libbitcoin_util;

libbitcoin_wallet_tool --> libbitcoin_wallet
libbitcoin_wallet_tool --> libbitcoin_util
libbitcoinkernel-->libbitcoin_crypto;

libbitcoin-cli --> libbitcoin_common
libbitcoin-cli --> libbitcoin_util
libbitcoin_node-->libbitcoin_common;
libbitcoin_node-->libbitcoin_util;
libbitcoin_node-->libbitcoin_zmq;

libbitcoin_node --> libbitcoin_common
libbitcoin_node --> libbitcoin_consensus
libbitcoin_node --> libbitcoin_kernel
libbitcoin_node --> libbitcoin_util
libbitcoinqt-->libbitcoin_cli;
libbitcoinqt-->libbitcoin_wallet;

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

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

libbitcoin_common --> libbitcoin_util
libbitcoin_common --> libbitcoin_consensus
libbitcoin_ipc-->libbitcoin_util;

libbitcoin_kernel --> libbitcoin_consensus
libbitcoin_kernel --> libbitcoin_util
libbitcoin_zmq-->libbitcoin_util;
libbitcoin_zmq-->libbitcoin_common;

classDef types fill:green,color:white,stroke:green;
class bitcoin-wallet,bitcoind,bitcoin-cli,bitcoin-qt types
classDef types fill:green,color:white,stroke:green;
class bitcoin-wallet,bitcoind,bitcoin-cli,bitcoin-qt,bitcoin-node,bitcoin-gui types
....
**Dependency graph**. Arrows show linker symbol dependencies. `libbitcoin_crypto` depends on nothing and is fundamental. `libbitcoin_util` depends on crypto. `libbitcoinkernel` (experimental kernel library) depends only on crypto.

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.