From a4256c9261964f83ad83db7ecad40d01a9092d1f Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Fri, 6 Dec 2024 16:50:24 +0700 Subject: [PATCH] feat: implement new RPC getrawbestchainlock --- src/rpc/blockchain.cpp | 32 +++++++++++++++++++++++++++ test/functional/interface_zmq_dash.py | 1 + 2 files changed, 33 insertions(+) diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 5c3890a0c9..a241d8fc6b 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -275,6 +275,37 @@ static RPCHelpMan getbestchainlock() }; } +static RPCHelpMan getrawbestchainlock() +{ + return RPCHelpMan{"getrawbestchainlock", + "\nReturns the raw best ChainLock. Throws an error if there is no known ChainLock yet.", + {}, + RPCResult{ + RPCResult::Type::STR, "data", "The serialized, hex-encoded data for best ChainLock" + }, + RPCExamples{ + HelpExampleCli("getrawbestchainlock", "") + + HelpExampleRpc("getrawbestchainlock", "") + }, + [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue +{ + UniValue result(UniValue::VOBJ); + + const NodeContext& node = EnsureAnyNodeContext(request.context); + + LLMQContext& llmq_ctx = EnsureLLMQContext(node); + llmq::CChainLockSig clsig = llmq_ctx.clhandler->GetBestChainLock(); + if (clsig.IsNull()) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Unable to find any ChainLock"); + } + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << clsig; + return HexStr(ssTx); + +}, + }; +} + void RPCNotifyBlockChange(const CBlockIndex* pindex) { if(pindex) { @@ -3106,6 +3137,7 @@ static const CRPCCommand commands[] = { "blockchain", &getblockstats, }, { "blockchain", &getbestblockhash, }, { "blockchain", &getbestchainlock, }, + { "blockchain", &getrawbestchainlock, }, { "blockchain", &getblockcount, }, { "blockchain", &getblock, }, { "blockchain", &getblockfrompeer, }, diff --git a/test/functional/interface_zmq_dash.py b/test/functional/interface_zmq_dash.py index 8d8fdfa673..6c94349dad 100755 --- a/test/functional/interface_zmq_dash.py +++ b/test/functional/interface_zmq_dash.py @@ -263,6 +263,7 @@ class DashZMQTest (DashTestFramework): 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].getrawbestchainlock()) # Unsubscribe from ChainLock messages self.unsubscribe(chain_lock_publishers)