diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 871ef727b1..8daeca5962 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -241,6 +241,7 @@ static RPCHelpMan getbestchainlock() {RPCResult::Type::NUM, "height", "The block height or index"}, {RPCResult::Type::STR_HEX, "signature", "The ChainLock's BLS signature"}, {RPCResult::Type::BOOL, "known_block", "True if the block is known by our node"}, + {RPCResult::Type::STR_HEX, "hex", "The serialized, hex-encoded data for best ChainLock"}, }}, RPCExamples{ HelpExampleCli("getbestchainlock", "") @@ -248,8 +249,6 @@ static RPCHelpMan getbestchainlock() }, [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue { - UniValue result(UniValue::VOBJ); - const NodeContext& node = EnsureAnyNodeContext(request.context); const LLMQContext& llmq_ctx = EnsureLLMQContext(node); @@ -257,13 +256,23 @@ static RPCHelpMan getbestchainlock() if (clsig.IsNull()) { throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to find any ChainLock"); } + + UniValue result(UniValue::VOBJ); + result.pushKV("blockhash", clsig.getBlockHash().GetHex()); result.pushKV("height", clsig.getHeight()); result.pushKV("signature", clsig.getSig().ToString()); - const ChainstateManager& chainman = EnsureChainman(node); - LOCK(cs_main); - result.pushKV("known_block", chainman.m_blockman.LookupBlockIndex(clsig.getBlockHash()) != nullptr); + { + const ChainstateManager& chainman = EnsureChainman(node); + LOCK(cs_main); + result.pushKV("known_block", chainman.m_blockman.LookupBlockIndex(clsig.getBlockHash()) != nullptr); + } + + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << clsig; + result.pushKV("hex", HexStr(ssTx)); + return result; }, }; diff --git a/test/functional/interface_zmq_dash.py b/test/functional/interface_zmq_dash.py index b1f64e445d..285f3ebeb4 100755 --- a/test/functional/interface_zmq_dash.py +++ b/test/functional/interface_zmq_dash.py @@ -136,6 +136,8 @@ def run_test(self): self.zmq_context = zmq.Context() # Initialize the network self.nodes[0].sporkupdate("SPORK_17_QUORUM_DKG_ENABLED", 0) + self.log.info("Test RPC hex getbestchainlock before any CL appeared") + assert_raises_rpc_error(-32603, "Unable to find any ChainLock", self.nodes[0].getbestchainlock) self.wait_for_sporks_same() self.activate_v19(expected_activation_height=900) self.log.info("Activated v19 at height:" + str(self.nodes[0].getblockcount())) @@ -263,6 +265,7 @@ def test_chainlock_publishers(self): assert_equal(uint256_to_string(zmq_chain_lock.blockHash), rpc_chain_lock_hash) assert_equal(zmq_chain_locked_block.hash, rpc_chain_lock_hash) assert_equal(zmq_chain_lock.sig.hex(), rpc_best_chain_lock_sig) + assert_equal(zmq_chain_lock.serialize().hex(), self.nodes[0].getbestchainlock()['hex']) # Unsubscribe from ChainLock messages self.unsubscribe(chain_lock_publishers)