# Libraries | Name | Description | |--------------------------|-------------| | *libbitcoin_cli* | RPC client functionality used by *bitcoin-cli* executable | | *libbitcoin_common* | Home for common functionality shared by different executables and libraries. Similar to *libbitcoin_util*, but higher-level (see [Dependencies](#dependencies)). | | *libbitcoin_consensus* | Stable, backwards-compatible consensus functionality used by *libbitcoin_node* and *libbitcoin_wallet*. | | *libbitcoin_kernel* | Consensus engine and support library used for validation by *libbitcoin_node*. | | *libbitcoinqt* | GUI functionality used by *bitcoin-qt* and *bitcoin-gui* executables. | | *libbitcoin_ipc* | IPC functionality used by *bitcoin-node*, *bitcoin-wallet*, *bitcoin-gui* executables to communicate when [`--enable-multiprocess`](multiprocess.md) is used. | | *libbitcoin_node* | P2P and RPC server functionality used by *bitcoind* and *bitcoin-qt* executables. | | *libbitcoin_util* | Home for common functionality shared by different executables and libraries. Similar to *libbitcoin_common*, but lower-level (see [Dependencies](#dependencies)). | | *libbitcoin_wallet* | Wallet functionality used by *bitcoind* and *bitcoin-wallet* executables. | | *libbitcoin_wallet_tool* | Lower-level wallet functionality used by *bitcoin-wallet* executable. | | *libbitcoin_zmq* | [ZeroMQ](../zmq.md) functionality used by *bitcoind* and *bitcoin-qt* executables. | ## Conventions - Most libraries are internal libraries and have APIs which are completely unstable! There are few or no restrictions on backwards compatibility or rules about external dependencies. An exception is *libbitcoin_kernel*, which, at some future point, will have a documented external interface. - Generally each library should have a corresponding source directory and namespace. Source code organization is a work in progress, so it is true that some namespaces are applied inconsistently, and if you look at [`libbitcoin_*_SOURCES`](../../src/Makefile.am) lists you can see that many libraries pull in files from outside their source directory. But when working with libraries, it is good to follow a consistent pattern like: - *libbitcoin_node* code lives in `src/node/` in the `node::` namespace - *libbitcoin_wallet* code lives in `src/wallet/` in the `wallet::` namespace - *libbitcoin_ipc* code lives in `src/ipc/` in the `ipc::` namespace - *libbitcoin_util* code lives in `src/util/` in the `util::` namespace - *libbitcoin_consensus* code lives in `src/consensus/` in the `Consensus::` namespace ## Dependencies - Libraries should minimize what other libraries they depend on, and only reference symbols following the arrows shown in the dependency graph below:
```mermaid %%{ init : { "flowchart" : { "curve" : "basis" }}}%% graph TD; 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; libbitcoin_cli-->libbitcoin_util; libbitcoin_cli-->libbitcoin_common; libbitcoin_common-->libbitcoin_consensus; libbitcoin_common-->libbitcoin_util; libbitcoin_kernel-->libbitcoin_consensus; libbitcoin_kernel-->libbitcoin_util; libbitcoin_node-->libbitcoin_consensus; libbitcoin_node-->libbitcoin_kernel; libbitcoin_node-->libbitcoin_common; libbitcoin_node-->libbitcoin_util; libbitcoinqt-->libbitcoin_common; libbitcoinqt-->libbitcoin_util; libbitcoin_wallet-->libbitcoin_common; libbitcoin_wallet-->libbitcoin_util; libbitcoin_wallet_tool-->libbitcoin_wallet; libbitcoin_wallet_tool-->libbitcoin_util; 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. *Consensus* lib depends on nothing. *Util* lib is depended on by everything. *Kernel* lib depends only on consensus and util. |