diff --git a/library-structure.adoc b/library-structure.adoc index c45a05a..0d22ed5 100644 --- a/library-structure.adoc +++ b/library-structure.adoc @@ -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.