Skip to content

Commit ebb15ea

Browse files
committed
Merge bitcoin#26207: rest: add verbose and mempool_sequence query params for mempool/contents
1ff5d61 doc: add mempool/contents rest verbose and mempool_sequence args (Andrew Toth) 52a31dc tests: mempool/contents verbose and mempool_sequence query params tests (Andrew Toth) a518fff rest: add verbose and mempool_sequence query params for mempool/contents (Andrew Toth) Pull request description: The verbose mempool json response can get very large. This adds an option to return the non-verbose response of just the txids. It is identical to the rpc response so the diff here is minimal. This also adds the mempool_sequence parameter for rpc consistency. Verbose defaults to true to remain backwards compatible. It uses query parameters to be compatible with the efforts in bitcoin#25752. ACKs for top commit: achow101: ACK 1ff5d61 stickies-v: re-ACK [1ff5d61](bitcoin@1ff5d61) pablomartin4btc: tested ACK 1ff5d61. Tree-SHA512: 1bf08a7ffde2e7db14dc746e421feedf17d84c4b3f1141e79e36feb6014811dfde80e1d8dbc476c15ff705de2d3c967b3081dcd80536d76b7edf888f1a92e9d1
2 parents 609c95d + 1ff5d61 commit ebb15ea

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

doc/REST-interface.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,15 @@ Returns various information about the transaction mempool.
134134
Only supports JSON as output format.
135135
Refer to the `getmempoolinfo` RPC help for details.
136136

137-
`GET /rest/mempool/contents.json`
137+
`GET /rest/mempool/contents.json?verbose=<true|false>&mempool_sequence=<false|true>`
138138

139139
Returns the transactions in the mempool.
140140
Only supports JSON as output format.
141-
Refer to the `getrawmempool` RPC help for details.
141+
Refer to the `getrawmempool` RPC help for details. Defaults to setting
142+
`verbose=true` and `mempool_sequence=false`.
143+
144+
*Query parameters for `verbose` and `mempool_sequence` available in 25.0 and up.*
145+
142146

143147
Risks
144148
-------------

src/rest.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,20 @@ static bool rest_mempool(const std::any& context, HTTPRequest* req, const std::s
652652
case RESTResponseFormat::JSON: {
653653
std::string str_json;
654654
if (param == "contents") {
655-
str_json = MempoolToJSON(*mempool, true).write() + "\n";
655+
const std::string raw_verbose{req->GetQueryParameter("verbose").value_or("true")};
656+
if (raw_verbose != "true" && raw_verbose != "false") {
657+
return RESTERR(req, HTTP_BAD_REQUEST, "The \"verbose\" query parameter must be either \"true\" or \"false\".");
658+
}
659+
const std::string raw_mempool_sequence{req->GetQueryParameter("mempool_sequence").value_or("false")};
660+
if (raw_mempool_sequence != "true" && raw_mempool_sequence != "false") {
661+
return RESTERR(req, HTTP_BAD_REQUEST, "The \"mempool_sequence\" query parameter must be either \"true\" or \"false\".");
662+
}
663+
const bool verbose{raw_verbose == "true"};
664+
const bool mempool_sequence{raw_mempool_sequence == "true"};
665+
if (verbose && mempool_sequence) {
666+
return RESTERR(req, HTTP_BAD_REQUEST, "Verbose results cannot contain mempool sequence values. (hint: set \"verbose=false\")");
667+
}
668+
str_json = MempoolToJSON(*mempool, verbose, mempool_sequence).write() + "\n";
656669
} else {
657670
str_json = MempoolInfoToJSON(*mempool).write() + "\n";
658671
}

test/functional/interface_rest.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,34 @@ def run_test(self):
347347
assert_equal(json_obj[tx]['spentby'], txs[i + 1:i + 2])
348348
assert_equal(json_obj[tx]['depends'], txs[i - 1:i])
349349

350+
# Check the mempool response for explicit parameters
351+
json_obj = self.test_rest_request("/mempool/contents", query_params={"verbose": "true", "mempool_sequence": "false"})
352+
assert_equal(json_obj, raw_mempool_verbose)
353+
354+
# Check the mempool response for not verbose
355+
json_obj = self.test_rest_request("/mempool/contents", query_params={"verbose": "false"})
356+
raw_mempool = self.nodes[0].getrawmempool(verbose=False)
357+
358+
assert_equal(json_obj, raw_mempool)
359+
360+
# Check the mempool response for sequence
361+
json_obj = self.test_rest_request("/mempool/contents", query_params={"verbose": "false", "mempool_sequence": "true"})
362+
raw_mempool = self.nodes[0].getrawmempool(verbose=False, mempool_sequence=True)
363+
364+
assert_equal(json_obj, raw_mempool)
365+
366+
# Check for error response if verbose=true and mempool_sequence=true
367+
resp = self.test_rest_request("/mempool/contents", ret_type=RetType.OBJ, status=400, query_params={"verbose": "true", "mempool_sequence": "true"})
368+
assert_equal(resp.read().decode('utf-8').strip(), 'Verbose results cannot contain mempool sequence values. (hint: set "verbose=false")')
369+
370+
# Check for error response if verbose is not "true" or "false"
371+
resp = self.test_rest_request("/mempool/contents", ret_type=RetType.OBJ, status=400, query_params={"verbose": "TRUE"})
372+
assert_equal(resp.read().decode('utf-8').strip(), 'The "verbose" query parameter must be either "true" or "false".')
373+
374+
# Check for error response if mempool_sequence is not "true" or "false"
375+
resp = self.test_rest_request("/mempool/contents", ret_type=RetType.OBJ, status=400, query_params={"verbose": "false", "mempool_sequence": "TRUE"})
376+
assert_equal(resp.read().decode('utf-8').strip(), 'The "mempool_sequence" query parameter must be either "true" or "false".')
377+
350378
# Now mine the transactions
351379
newblockhash = self.generate(self.nodes[1], 1)
352380

0 commit comments

Comments
 (0)