Closes #3178 by adding verbosity level improvements to getblock RPC.
This is a follow-up commit for d0a1d833520d120bb5a2ac4cf4192047af6afe24 found in PR #3095 in order to fix nits and add a test.
This commit is contained in:
parent
bf911b3038
commit
9bd8f092c6
|
@ -7,6 +7,7 @@
|
|||
# Test merkleblock fetch/validation
|
||||
#
|
||||
|
||||
import string
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.authproxy import JSONRPCException
|
||||
from test_framework.util import assert_equal, assert_raises, \
|
||||
|
@ -86,5 +87,13 @@ class MerkleBlockTest(BitcoinTestFramework):
|
|||
# ...or if we have a -txindex
|
||||
assert_equal(self.nodes[2].verifytxoutproof(self.nodes[3].gettxoutproof([txid_spent])), [txid_spent])
|
||||
|
||||
# Quick test of getblock using blockhash and different levels of verbosity
|
||||
result = self.nodes[0].getblock(blockhash, 2)
|
||||
coinbase_txid = result["tx"][0]["txid"]
|
||||
result = self.nodes[0].getblock(blockhash, 1)
|
||||
assert_equal(coinbase_txid, result["tx"][0]) # verbosity 1 only lists txids
|
||||
result = self.nodes[0].getblock(blockhash, 0)
|
||||
assert(c in string.hexdigits for c in result) # verbosity 0 returns raw hex
|
||||
|
||||
if __name__ == '__main__':
|
||||
MerkleBlockTest().main()
|
||||
|
|
|
@ -395,14 +395,14 @@ UniValue getblock(const UniValue& params, bool fHelp)
|
|||
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||
throw runtime_error(
|
||||
"getblock \"hash|height\" ( verbosity )\n"
|
||||
"\nIf verbosity is 0, returns a string that is serialized, hex-encoded data for block 'hash'.\n"
|
||||
"If verbosity is 1, returns an Object with information about block <hash>.\n"
|
||||
"If verbosity is 2, returns an Object with information about block <hash> and information about each transaction. \n"
|
||||
"\nIf verbosity is 0, returns a string that is serialized, hex-encoded data for the block.\n"
|
||||
"If verbosity is 1, returns an Object with information about the block.\n"
|
||||
"If verbosity is 2, returns an Object with information about the block and information about each transaction. \n"
|
||||
"\nArguments:\n"
|
||||
"1. \"hash|height\" (string, required) The block hash or height\n"
|
||||
"2. verbosity (numeric, optional, default=1) 0 for hex encoded data, 1 for a json object, and 2 for json object with transaction data\n"
|
||||
"\nResult (for verbosity = 0):\n"
|
||||
"\"data\" (string) A string that is serialized, hex-encoded data for block 'hash'.\n"
|
||||
"\"data\" (string) A string that is serialized, hex-encoded data for the block.\n"
|
||||
"\nResult (for verbosity = 1):\n"
|
||||
"{\n"
|
||||
" \"hash\" : \"hash\", (string) the block hash (same as provided hash)\n"
|
||||
|
@ -431,8 +431,8 @@ UniValue getblock(const UniValue& params, bool fHelp)
|
|||
" ,... Same output as verbosity = 1.\n"
|
||||
"}\n"
|
||||
"\nExamples:\n"
|
||||
+ HelpExampleCli("getblock", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
|
||||
+ HelpExampleRpc("getblock", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
|
||||
+ HelpExampleCli("getblock", "\"00000000febc373a1da2bd9f887b105ad79ddc26ac26c2b28652d64e5207c5b5\"")
|
||||
+ HelpExampleRpc("getblock", "\"00000000febc373a1da2bd9f887b105ad79ddc26ac26c2b28652d64e5207c5b5\"")
|
||||
+ HelpExampleCli("getblock", "12800")
|
||||
+ HelpExampleRpc("getblock", "12800")
|
||||
);
|
||||
|
@ -467,11 +467,16 @@ UniValue getblock(const UniValue& params, bool fHelp)
|
|||
|
||||
int verbosity = 1;
|
||||
if (params.size() > 1) {
|
||||
if(params[1].isNum())
|
||||
if(params[1].isNum()) {
|
||||
verbosity = params[1].get_int();
|
||||
else
|
||||
} else {
|
||||
verbosity = params[1].get_bool() ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (verbosity < 0 || verbosity > 2) {
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Verbosity must be in range from 0 to 2");
|
||||
}
|
||||
|
||||
if (mapBlockIndex.count(hash) == 0)
|
||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
|
||||
|
@ -485,7 +490,7 @@ UniValue getblock(const UniValue& params, bool fHelp)
|
|||
if(!ReadBlockFromDisk(block, pblockindex))
|
||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
|
||||
|
||||
if (verbosity <= 0)
|
||||
if (verbosity == 0)
|
||||
{
|
||||
CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION);
|
||||
ssBlock << block;
|
||||
|
|
|
@ -291,6 +291,11 @@ BOOST_AUTO_TEST_CASE(rpc_wallet)
|
|||
BOOST_CHECK_THROW(CallRPC("getblock 2147483648"), runtime_error); // not allowed, > int32 used for nHeight
|
||||
BOOST_CHECK_THROW(CallRPC("getblock 100badchars"), runtime_error);
|
||||
BOOST_CHECK_NO_THROW(CallRPC("getblock 0"));
|
||||
BOOST_CHECK_NO_THROW(CallRPC("getblock 0 0"));
|
||||
BOOST_CHECK_NO_THROW(CallRPC("getblock 0 1"));
|
||||
BOOST_CHECK_NO_THROW(CallRPC("getblock 0 2"));
|
||||
BOOST_CHECK_THROW(CallRPC("getblock 0 -1"), runtime_error); // bad verbosity
|
||||
BOOST_CHECK_THROW(CallRPC("getblock 0 3"), runtime_error); // bad verbosity
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(rpc_wallet_getbalance)
|
||||
|
|
Loading…
Reference in New Issue