7942951e3fRemove unused g_best_block (Ryan Ofsky)e3a560ca68rpc: use waitTipChanged for longpoll (Ryan Ofsky)460687a09cRemove unused CRPCSignals (Sjors Provoost)dca923150eReplace RPCNotifyBlockChange with waitTipChanged() (Sjors Provoost)2a40ee1121rpc: check for negative timeout arg in waitfor* (Sjors Provoost)de7c855b3arpc: recommend -rpcclienttimeout=0 for waitfor* (Sjors Provoost)77ec072925rpc: fix waitfornewblock description (Sjors Provoost)285fe9fb51rpc: add test for waitforblock and waitfornewblock (Sjors Provoost)b94b27cf05Add waitTipChanged to Mining interface (Sjors Provoost)7eccdaf160node: Track last block that received a blockTip notification (Sjors Provoost)ebb8215f23Rename getTipHash() to getTip() and return BlockRef (Sjors Provoost)89a8f74bbbrefactor: rename BlockKey to BlockRef (Sjors Provoost) Pull request description: This continues the work in #30200 so that a future Stratum v2 Template Provider (see #29432) can avoid accessing node internals. It needs to know when a new block arrives in order to push new templates to connected clients. `waitTipChanged()` uses a new kernel notification `notifications().m_tip_block_mutex`, which this PR also introduces (a previous version used `g_best_block`). In order to ensure the new method works as intended, the `waitfornewblock`, `waitforblock` and `waitforblockheight` RPC methods are refactored to use it. This allows removing `RPCNotifyBlockChange`. There's a commit to add (direct) tests for the methods that are about to be refactored: - `waitfornewblock` was already implicitly tested by `feature_shutdown.py`. - `waitforblockheight` by `feature_coinstatsindex.py` and `example_test.py` This PR renames `getTipHash()` to `getTip()` and returns a `BlockRef` (renamed from `BlockKey`) so that callers can use either the height or hash. The later commits make trivial improvements to the `waitfor*` RPC calls (not needed for this PR). The `waitTipChanged()` method could probably also be used for the longpoll functionality in `getblocktemplate`, but I'm a bit reluctant to touch that. `RPCServer::OnStarted` no longer does anything and `RPCServer::OnStopped` merely prints a log statement. They were added in #5711 as a refactor. This PR drops them entirely. Finally `g_best_block` is also dropped. ACKs for top commit: achow101: ACK7942951e3fryanofsky: Code review ACK7942951e3f. Just rebased since last review TheCharlatan: Re-ACK7942951e3fTree-SHA512: a5559446b4000c95e07aad33284b7ee2e57aafd87e1ae778b3825d59689566d047a8047e47a10f76e6e341e7dc72fd265a65afbc0a9c011d17c4cafd55031837
Internal c++ interfaces
The following interfaces are defined here:
-
Chain— used by wallet to access blockchain and mempool state. Added in #14437, #14711, #15288, and #10973. -
ChainClient— used by node to start & stopChainclients. Added in #14437. -
Node— used by GUI to start & stop bitcoin node. Added in #10244. -
Handler— returned byhandleEventmethods on interfaces above and used to manage lifetimes of event handlers. -
Init— used by multiprocess code to access interfaces above on startup. Added in #19160. -
Ipc— used by multiprocess code to accessInitinterface across processes. Added in #19160.
The interfaces above define boundaries between major components of bitcoin code (node, wallet, and gui), making it possible for them to run in different processes, and be tested, developed, and understood independently. These interfaces are not currently designed to be stable or to be used externally.