diff --git a/src/interfaces/mining.h b/src/interfaces/mining.h index c1aa2dd36a7d1..a78e8e7fbd3c4 100644 --- a/src/interfaces/mining.h +++ b/src/interfaces/mining.h @@ -88,10 +88,14 @@ class Mining virtual std::optional waitTipChanged(uint256 current_tip, MillisecondsDouble timeout = MillisecondsDouble::max()) = 0; /** - * Construct a new block template + * Construct a new block template. + * + * During node initialization, this will + * wait until the tip is connected. * * @param[in] options options for creating the block - * @returns a block template + * @retval BlockTemplate a block template. + * @retval empty if node is shutting down */ virtual std::unique_ptr createNewBlock(const node::BlockCreateOptions& options = {}) = 0; diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp index 622cb85b67820..8133716fda53d 100644 --- a/src/node/interfaces.cpp +++ b/src/node/interfaces.cpp @@ -994,6 +994,9 @@ class MinerImpl : public Mining std::unique_ptr createNewBlock(const BlockCreateOptions& options) override { + // Ensure m_tip_block is set so consumers of BlockTemplate can rely on that. + if (!waitTipChanged(uint256::ZERO, MillisecondsDouble::max())) return {}; + BlockAssembler::Options assemble_options{options}; ApplyArgsManOptions(*Assert(m_node.args), assemble_options); return std::make_unique(BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(), m_node);