aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJameson Lopp <jameson.lopp@gmail.com>2023-09-30 15:06:36 -0400
committerglozow <gloriajzhao@gmail.com>2024-04-17 13:47:50 +0100
commitbf5b6fc8a7c7e6c13520671bb7b2d4d1d110c2bb (patch)
tree02523b69b0abeb726e5e220c549520e232bae2a3
parenta81a9228fbaaa10d6308299f11d6093485d645e5 (diff)
Throw error if invalid parameters passed to getnetworkhashps RPC endpoint
Github-Pull: #28554 Rebased-From: 9ac114e5cd9d8ade3a1d9f3d76a08ff59a3f1658
-rw-r--r--src/rpc/mining.cpp19
-rwxr-xr-xtest/functional/rpc_blockchain.py27
2 files changed, 40 insertions, 6 deletions
diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp
index 76170c3201..a1894a3030 100644
--- a/src/rpc/mining.cpp
+++ b/src/rpc/mining.cpp
@@ -49,13 +49,22 @@ using node::UpdateTime;
/**
* Return average network hashes per second based on the last 'lookup' blocks,
- * or from the last difficulty change if 'lookup' is nonpositive.
- * If 'height' is nonnegative, compute the estimate at the time when a given block was found.
+ * or from the last difficulty change if 'lookup' is -1.
+ * If 'height' is -1, compute the estimate from current chain tip.
+ * If 'height' is a valid block height, compute the estimate at the time when a given block was found.
*/
static UniValue GetNetworkHashPS(int lookup, int height, const CChain& active_chain) {
+ if (lookup < -1 || lookup == 0) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid nblocks. Must be a positive number or -1.");
+ }
+
+ if (height < -1 || height > active_chain.Height()) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Block does not exist at specified height");
+ }
+
const CBlockIndex* pb = active_chain.Tip();
- if (height >= 0 && height < active_chain.Height()) {
+ if (height >= 0) {
pb = active_chain[height];
}
@@ -63,7 +72,7 @@ static UniValue GetNetworkHashPS(int lookup, int height, const CChain& active_ch
return 0;
// If lookup is -1, then use blocks since last difficulty change.
- if (lookup <= 0)
+ if (lookup == -1)
lookup = pb->nHeight % Params().GetConsensus().DifficultyAdjustmentInterval() + 1;
// If lookup is larger than chain, then set it to chain length.
@@ -97,7 +106,7 @@ static RPCHelpMan getnetworkhashps()
"Pass in [blocks] to override # of blocks, -1 specifies since last difficulty change.\n"
"Pass in [height] to estimate the network speed at the time when a certain block was found.\n",
{
- {"nblocks", RPCArg::Type::NUM, RPCArg::Default{120}, "The number of blocks, or -1 for blocks since last difficulty change."},
+ {"nblocks", RPCArg::Type::NUM, RPCArg::Default{120}, "The number of previous blocks to calculate estimate from, or -1 for blocks since last difficulty change."},
{"height", RPCArg::Type::NUM, RPCArg::Default{-1}, "To estimate at the time of the given height."},
},
RPCResult{
diff --git a/test/functional/rpc_blockchain.py b/test/functional/rpc_blockchain.py
index 53163720bb..b485227d78 100755
--- a/test/functional/rpc_blockchain.py
+++ b/test/functional/rpc_blockchain.py
@@ -436,7 +436,6 @@ class BlockchainTest(BitcoinTestFramework):
def _test_getnetworkhashps(self):
self.log.info("Test getnetworkhashps")
- hashes_per_second = self.nodes[0].getnetworkhashps()
assert_raises_rpc_error(
-3,
textwrap.dedent("""
@@ -448,7 +447,33 @@ class BlockchainTest(BitcoinTestFramework):
""").strip(),
lambda: self.nodes[0].getnetworkhashps("a", []),
)
+ assert_raises_rpc_error(
+ -8,
+ "Block does not exist at specified height",
+ lambda: self.nodes[0].getnetworkhashps(100, self.nodes[0].getblockcount() + 1),
+ )
+ assert_raises_rpc_error(
+ -8,
+ "Block does not exist at specified height",
+ lambda: self.nodes[0].getnetworkhashps(100, -10),
+ )
+ assert_raises_rpc_error(
+ -8,
+ "Invalid nblocks. Must be a positive number or -1.",
+ lambda: self.nodes[0].getnetworkhashps(-100),
+ )
+ assert_raises_rpc_error(
+ -8,
+ "Invalid nblocks. Must be a positive number or -1.",
+ lambda: self.nodes[0].getnetworkhashps(0),
+ )
+
+ # Genesis block height estimate should return 0
+ hashes_per_second = self.nodes[0].getnetworkhashps(100, 0)
+ assert_equal(hashes_per_second, 0)
+
# This should be 2 hashes every 10 minutes or 1/300
+ hashes_per_second = self.nodes[0].getnetworkhashps()
assert abs(hashes_per_second * 300 - 1) < 0.0001
def _test_stopatheight(self):