@@ -107,6 +107,27 @@ static CTxMemPool* GetMemPool(const std::any& context, HTTPRequest* req)
107
107
return node_context->mempool .get ();
108
108
}
109
109
110
+ /* *
111
+ * Get the node context chainstatemanager.
112
+ *
113
+ * @param[in] req The HTTP request, whose status code will be set if node
114
+ * context chainstatemanager is not found.
115
+ * @returns Pointer to the chainstatemanager or nullptr if none found.
116
+ */
117
+ static ChainstateManager* GetChainman (const std::any& context, HTTPRequest* req)
118
+ {
119
+ auto node_context = util::AnyPtr<NodeContext>(context);
120
+ if (!node_context || !node_context->chainman ) {
121
+ RESTERR (req, HTTP_INTERNAL_SERVER_ERROR,
122
+ strprintf (" %s:%d (%s)\n "
123
+ " Internal bug detected: Chainman disabled or instance not found!\n "
124
+ " You may report this issue here: %s\n " ,
125
+ __FILE__, __LINE__, __func__, PACKAGE_BUGREPORT));
126
+ return nullptr ;
127
+ }
128
+ return node_context->chainman ;
129
+ }
130
+
110
131
static RetFormat ParseDataFormat (std::string& param, const std::string& strReq)
111
132
{
112
133
const std::string::size_type pos = strReq.rfind (' .' );
@@ -181,7 +202,9 @@ static bool rest_headers(const std::any& context,
181
202
std::vector<const CBlockIndex *> headers;
182
203
headers.reserve (count);
183
204
{
184
- ChainstateManager& chainman = EnsureAnyChainman (context);
205
+ ChainstateManager* maybe_chainman = GetChainman (context, req);
206
+ if (!maybe_chainman) return false ;
207
+ ChainstateManager& chainman = *maybe_chainman;
185
208
LOCK (cs_main);
186
209
CChain& active_chain = chainman.ActiveChain ();
187
210
tip = active_chain.Tip ();
@@ -252,7 +275,9 @@ static bool rest_block(const std::any& context,
252
275
CBlockIndex* pblockindex = nullptr ;
253
276
CBlockIndex* tip = nullptr ;
254
277
{
255
- ChainstateManager& chainman = EnsureAnyChainman (context);
278
+ ChainstateManager* maybe_chainman = GetChainman (context, req);
279
+ if (!maybe_chainman) return false ;
280
+ ChainstateManager& chainman = *maybe_chainman;
256
281
LOCK (cs_main);
257
282
tip = chainman.ActiveChain ().Tip ();
258
283
pblockindex = chainman.m_blockman .LookupBlockIndex (hash);
@@ -541,7 +566,9 @@ static bool rest_getutxos(const std::any& context, HTTPRequest* req, const std::
541
566
std::string bitmapStringRepresentation;
542
567
std::vector<bool > hits;
543
568
bitmap.resize ((vOutPoints.size () + 7 ) / 8 );
544
- ChainstateManager& chainman = EnsureAnyChainman (context);
569
+ ChainstateManager* maybe_chainman = GetChainman (context, req);
570
+ if (!maybe_chainman) return false ;
571
+ ChainstateManager& chainman = *maybe_chainman;
545
572
{
546
573
auto process_utxos = [&vOutPoints, &outs, &hits](const CCoinsView& view, const CTxMemPool& mempool) {
547
574
for (const COutPoint& vOutPoint : vOutPoints) {
@@ -644,7 +671,9 @@ static bool rest_blockhash_by_height(const std::any& context, HTTPRequest* req,
644
671
645
672
CBlockIndex* pblockindex = nullptr ;
646
673
{
647
- ChainstateManager& chainman = EnsureAnyChainman (context);
674
+ ChainstateManager* maybe_chainman = GetChainman (context, req);
675
+ if (!maybe_chainman) return false ;
676
+ ChainstateManager& chainman = *maybe_chainman;
648
677
LOCK (cs_main);
649
678
const CChain& active_chain = chainman.ActiveChain ();
650
679
if (blockheight > active_chain.Height ()) {
0 commit comments