mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
Merge #13570: RPC: Add new "getzmqnotifications" method
161e8d40a4e4c0e701b6c8142b8dcacf2190545e RPC: Add new getzmqnotifications method. (Daniel Kraft) caac39b0ace38aa088d88c1a5a9a9dbb4d2e893f Make ZMQ notification interface instance global. (Daniel Kraft) Pull request description: This adds a new RPC method `getzmqnotifications`, which returns information about all active ZMQ notification endpoints. This is useful for software that layers on top of bitcoind, so it can verify that ZeroMQ is enabled and also figure out where it should listen. See #13526. Tree-SHA512: edce722925741c84ddbf7b3a879fc9db1907e5269d0d97138fe724035d93ee541c2118c24fa92f4197403f380d0e25c2fda5ca6c62d526792ea749cf527a99a0
This commit is contained in:
parent
85b0aa5f9d
commit
87cf14727a
@ -263,7 +263,8 @@ BITCOIN_CORE_H = \
|
||||
zmq/zmqabstractnotifier.h \
|
||||
zmq/zmqconfig.h\
|
||||
zmq/zmqnotificationinterface.h \
|
||||
zmq/zmqpublishnotifier.h
|
||||
zmq/zmqpublishnotifier.h \
|
||||
zmq/zmqrpc.h
|
||||
|
||||
|
||||
obj/build.h: FORCE
|
||||
@ -365,7 +366,8 @@ libdash_zmq_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||
libdash_zmq_a_SOURCES = \
|
||||
zmq/zmqabstractnotifier.cpp \
|
||||
zmq/zmqnotificationinterface.cpp \
|
||||
zmq/zmqpublishnotifier.cpp
|
||||
zmq/zmqpublishnotifier.cpp \
|
||||
zmq/zmqrpc.cpp
|
||||
endif
|
||||
|
||||
|
||||
|
22
src/init.cpp
22
src/init.cpp
@ -82,6 +82,7 @@
|
||||
|
||||
#if ENABLE_ZMQ
|
||||
#include <zmq/zmqnotificationinterface.h>
|
||||
#include <zmq/zmqrpc.h>
|
||||
#endif
|
||||
|
||||
bool fFeeEstimatesInitialized = false;
|
||||
@ -118,10 +119,6 @@ static DummyWalletInit g_dummy_wallet_init;
|
||||
WalletInitInterface* const g_wallet_init_interface = &g_dummy_wallet_init;
|
||||
#endif
|
||||
|
||||
#if ENABLE_ZMQ
|
||||
static CZMQNotificationInterface* pzmqNotificationInterface = nullptr;
|
||||
#endif
|
||||
|
||||
static CDSNotificationInterface* pdsNotificationInterface = nullptr;
|
||||
|
||||
#ifdef WIN32
|
||||
@ -330,10 +327,10 @@ void PrepareShutdown()
|
||||
g_wallet_init_interface->Stop();
|
||||
|
||||
#if ENABLE_ZMQ
|
||||
if (pzmqNotificationInterface) {
|
||||
UnregisterValidationInterface(pzmqNotificationInterface);
|
||||
delete pzmqNotificationInterface;
|
||||
pzmqNotificationInterface = nullptr;
|
||||
if (g_zmq_notification_interface) {
|
||||
UnregisterValidationInterface(g_zmq_notification_interface);
|
||||
delete g_zmq_notification_interface;
|
||||
g_zmq_notification_interface = nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1657,6 +1654,9 @@ bool AppInitMain()
|
||||
*/
|
||||
RegisterAllCoreRPCCommands(tableRPC);
|
||||
g_wallet_init_interface->RegisterRPC(tableRPC);
|
||||
#if ENABLE_ZMQ
|
||||
RegisterZMQRPCCommands(tableRPC);
|
||||
#endif
|
||||
|
||||
/* Start the RPC server already. It will be started in "warmup" mode
|
||||
* and not really process calls already (but it will signify connections
|
||||
@ -1783,10 +1783,10 @@ bool AppInitMain()
|
||||
}
|
||||
|
||||
#if ENABLE_ZMQ
|
||||
pzmqNotificationInterface = CZMQNotificationInterface::Create();
|
||||
g_zmq_notification_interface = CZMQNotificationInterface::Create();
|
||||
|
||||
if (pzmqNotificationInterface) {
|
||||
RegisterValidationInterface(pzmqNotificationInterface);
|
||||
if (g_zmq_notification_interface) {
|
||||
RegisterValidationInterface(g_zmq_notification_interface);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2015 The Bitcoin Core developers
|
||||
// Copyright (c) 2015-2018 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@ -29,6 +29,15 @@ CZMQNotificationInterface::~CZMQNotificationInterface()
|
||||
}
|
||||
}
|
||||
|
||||
std::list<const CZMQAbstractNotifier*> CZMQNotificationInterface::GetActiveNotifiers() const
|
||||
{
|
||||
std::list<const CZMQAbstractNotifier*> result;
|
||||
for (const auto* n : notifiers) {
|
||||
result.push_back(n);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
CZMQNotificationInterface* CZMQNotificationInterface::Create()
|
||||
{
|
||||
CZMQNotificationInterface* notificationInterface = nullptr;
|
||||
@ -273,3 +282,5 @@ void CZMQNotificationInterface::NotifyInstantSendDoubleSpendAttempt(const CTrans
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CZMQNotificationInterface* g_zmq_notification_interface = nullptr;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2015 The Bitcoin Core developers
|
||||
// Copyright (c) 2015-2018 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@ -18,6 +18,8 @@ class CZMQNotificationInterface final : public CValidationInterface
|
||||
public:
|
||||
virtual ~CZMQNotificationInterface();
|
||||
|
||||
std::list<const CZMQAbstractNotifier*> GetActiveNotifiers() const;
|
||||
|
||||
static CZMQNotificationInterface* Create();
|
||||
|
||||
protected:
|
||||
@ -43,4 +45,6 @@ private:
|
||||
std::list<CZMQAbstractNotifier*> notifiers;
|
||||
};
|
||||
|
||||
extern CZMQNotificationInterface* g_zmq_notification_interface;
|
||||
|
||||
#endif // BITCOIN_ZMQ_ZMQNOTIFICATIONINTERFACE_H
|
||||
|
61
src/zmq/zmqrpc.cpp
Normal file
61
src/zmq/zmqrpc.cpp
Normal file
@ -0,0 +1,61 @@
|
||||
// Copyright (c) 2018 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <zmq/zmqrpc.h>
|
||||
|
||||
#include <rpc/server.h>
|
||||
#include <zmq/zmqabstractnotifier.h>
|
||||
#include <zmq/zmqnotificationinterface.h>
|
||||
|
||||
#include <univalue.h>
|
||||
|
||||
namespace {
|
||||
|
||||
UniValue getzmqnotifications(const JSONRPCRequest& request)
|
||||
{
|
||||
if (request.fHelp || request.params.size() != 0) {
|
||||
throw std::runtime_error(
|
||||
"getzmqnotifications\n"
|
||||
"\nReturns information about the active ZeroMQ notifications.\n"
|
||||
"\nResult:\n"
|
||||
"[\n"
|
||||
" { (json object)\n"
|
||||
" \"type\": \"pubhashtx\", (string) Type of notification\n"
|
||||
" \"address\": \"...\" (string) Address of the publisher\n"
|
||||
" },\n"
|
||||
" ...\n"
|
||||
"]\n"
|
||||
"\nExamples:\n"
|
||||
+ HelpExampleCli("getzmqnotifications", "")
|
||||
+ HelpExampleRpc("getzmqnotifications", "")
|
||||
);
|
||||
}
|
||||
|
||||
UniValue result(UniValue::VARR);
|
||||
if (g_zmq_notification_interface != nullptr) {
|
||||
for (const auto* n : g_zmq_notification_interface->GetActiveNotifiers()) {
|
||||
UniValue obj(UniValue::VOBJ);
|
||||
obj.pushKV("type", n->GetType());
|
||||
obj.pushKV("address", n->GetAddress());
|
||||
result.push_back(obj);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
const CRPCCommand commands[] =
|
||||
{ // category name actor (function) argNames
|
||||
// ----------------- ------------------------ ----------------------- ----------
|
||||
{ "zmq", "getzmqnotifications", &getzmqnotifications, {} },
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
void RegisterZMQRPCCommands(CRPCTable& t)
|
||||
{
|
||||
for (const auto& c : commands) {
|
||||
t.appendCommand(c.name, &c);
|
||||
}
|
||||
}
|
12
src/zmq/zmqrpc.h
Normal file
12
src/zmq/zmqrpc.h
Normal file
@ -0,0 +1,12 @@
|
||||
// Copyright (c) 2018 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef BITCOIN_ZMQ_ZMQRPC_H
|
||||
#define BITCOIN_ZMQ_ZMQRPC_H
|
||||
|
||||
class CRPCTable;
|
||||
|
||||
void RegisterZMQRPCCommands(CRPCTable& t);
|
||||
|
||||
#endif // BITCOIN_ZMQ_ZMRRPC_H
|
33
test/functional/rpc_zmq.py
Executable file
33
test/functional/rpc_zmq.py
Executable file
@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright (c) 2018 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test for the ZMQ RPC methods."""
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_equal
|
||||
|
||||
|
||||
class RPCZMQTest(BitcoinTestFramework):
|
||||
|
||||
address = "tcp://127.0.0.1:28332"
|
||||
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 1
|
||||
self.setup_clean_chain = True
|
||||
|
||||
def run_test(self):
|
||||
self._test_getzmqnotifications()
|
||||
|
||||
def _test_getzmqnotifications(self):
|
||||
self.restart_node(0, extra_args=[])
|
||||
assert_equal(self.nodes[0].getzmqnotifications(), [])
|
||||
|
||||
self.restart_node(0, extra_args=["-zmqpubhashtx=%s" % self.address])
|
||||
assert_equal(self.nodes[0].getzmqnotifications(), [
|
||||
{"type": "pubhashtx", "address": self.address},
|
||||
])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
RPCZMQTest().main()
|
@ -128,6 +128,7 @@ BASE_SCRIPTS= [
|
||||
'feature_versionbits_warning.py',
|
||||
'rpc_preciousblock.py',
|
||||
'wallet_importprunedfunds.py',
|
||||
'rpc_zmq.py',
|
||||
'rpc_signmessage.py',
|
||||
'feature_nulldummy.py',
|
||||
'wallet_import_rescan.py',
|
||||
|
Loading…
Reference in New Issue
Block a user