Skip to content

Commit 17d17af

Browse files
committed
rpc: allow addresses to report data from legacy platform port fields
MnNetInfo doesn't actually store this information so we are pulling the data from platform{HTTP,P2P}Port to make it appear like it does. This is to ensure reporting parity with ExtNetInfo, which stores platform fields and should allow us to deprecate the platform{HTTP,P2P}Port when we need to.
1 parent 8efbad8 commit 17d17af

File tree

9 files changed

+64
-17
lines changed

9 files changed

+64
-17
lines changed

src/coinjoin/client.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <net.h>
1515
#include <net_processing.h>
1616
#include <netmessagemaker.h>
17+
#include <rpc/evo_util.h>
1718
#include <shutdown.h>
1819
#include <util/check.h>
1920
#include <util/irange.h>
@@ -1875,7 +1876,7 @@ void CCoinJoinClientSession::GetJsonInfo(UniValue& obj) const
18751876
if (m_wallet->chain().rpcEnableDeprecated("service")) {
18761877
obj.pushKV("service", mixingMasternode->pdmnState->netInfo->GetPrimary().ToStringAddrPort());
18771878
}
1878-
obj.pushKV("addresses", mixingMasternode->pdmnState->netInfo->ToJson());
1879+
obj.pushKV("addresses", GetNetInfoWithLegacyFields(*mixingMasternode->pdmnState, mixingMasternode->nType));
18791880
}
18801881
obj.pushKV("denomination", ValueFromAmount(CoinJoin::DenominationToAmount(nSessionDenom)));
18811882
obj.pushKV("state", GetStateString());

src/evo/core_write.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <evo/simplifiedmns.h>
1414
#include <evo/smldiff.h>
1515
#include <llmq/commitment.h>
16+
#include <rpc/evo_util.h>
1617

1718
#include <univalue.h>
1819

@@ -74,7 +75,7 @@
7475
if (IsServiceDeprecatedRPCEnabled()) {
7576
ret.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
7677
}
77-
ret.pushKV("addresses", netInfo->ToJson());
78+
ret.pushKV("addresses", GetNetInfoWithLegacyFields(*this, nType));
7879
ret.pushKV("ownerAddress", EncodeDestination(PKHash(keyIDOwner)));
7980
ret.pushKV("votingAddress", EncodeDestination(PKHash(keyIDVoting)));
8081
if (CTxDestination dest; ExtractDestination(scriptPayout, dest)) {
@@ -124,7 +125,7 @@
124125
if (IsServiceDeprecatedRPCEnabled()) {
125126
ret.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
126127
}
127-
ret.pushKV("addresses", netInfo->ToJson());
128+
ret.pushKV("addresses", GetNetInfoWithLegacyFields(*this, nType));
128129
if (CTxDestination dest; ExtractDestination(scriptOperatorPayout, dest)) {
129130
ret.pushKV("operatorPayoutAddress", EncodeDestination(dest));
130131
}
@@ -164,7 +165,7 @@
164165
if (IsServiceDeprecatedRPCEnabled()) {
165166
obj.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
166167
}
167-
obj.pushKV("addresses", netInfo->ToJson());
168+
obj.pushKV("addresses", GetNetInfoWithLegacyFields(*this, nType));
168169
obj.pushKV("pubKeyOperator", pubKeyOperator.ToString());
169170
obj.pushKV("votingAddress", EncodeDestination(PKHash(keyIDVoting)));
170171
obj.pushKV("isValid", isValid);

src/evo/dmnstate.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
#include <script/standard.h>
88

9+
#include <rpc/evo_util.h>
10+
911
#include <univalue.h>
1012

1113
std::string CDeterministicMNState::ToString() const
@@ -36,7 +38,7 @@ UniValue CDeterministicMNState::ToJson(MnType nType) const
3638
if (IsServiceDeprecatedRPCEnabled()) {
3739
obj.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
3840
}
39-
obj.pushKV("addresses", netInfo->ToJson());
41+
obj.pushKV("addresses", GetNetInfoWithLegacyFields(*this, nType));
4042
obj.pushKV("registeredHeight", nRegisteredHeight);
4143
obj.pushKV("lastPaidHeight", nLastPaidHeight);
4244
obj.pushKV("consecutivePayments", nConsecutivePayments);

src/evo/netinfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ bool IsNodeOnMainnet();
103103
/** Identical to IsDeprecatedRPCEnabled("service"). For use outside of RPC code */
104104
bool IsServiceDeprecatedRPCEnabled();
105105

106+
/** Creates a one-element array using CService::ToStringPortAddr() output */
107+
UniValue ArrFromService(const CService& addr);
108+
106109
/** Equivalent to Params() if node is running on mainnet */
107110
const CChainParams& MainParams();
108111

src/rpc/evo_util.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@
44

55
#include <rpc/evo_util.h>
66

7-
#include <evo/netinfo.h>
87
#include <evo/providertx.h>
98
#include <rpc/protocol.h>
109
#include <rpc/request.h>
11-
#include <rpc/util.h>
12-
#include <util/check.h>
1310

1411
#include <univalue.h>
1512

src/rpc/evo_util.h

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,18 @@
55
#ifndef BITCOIN_RPC_EVO_UTIL_H
66
#define BITCOIN_RPC_EVO_UTIL_H
77

8-
class UniValue;
8+
#include <netaddress.h>
9+
#include <util/check.h>
10+
11+
#include <evo/dmn_types.h>
12+
#include <evo/netinfo.h>
13+
14+
#include <cstdint>
15+
#include <type_traits>
16+
17+
#include <univalue.h>
18+
19+
class CSimplifiedMNListEntry;
920

1021
/** Process setting (legacy) Core network information field based on ProTx version */
1122
template <typename ProTx>
@@ -15,4 +26,27 @@ void ProcessNetInfoCore(ProTx& ptx, const UniValue& input, const bool optional);
1526
template <typename ProTx>
1627
void ProcessNetInfoPlatform(ProTx& ptx, const UniValue& input_p2p, const UniValue& input_http, const bool optional);
1728

29+
/** Reads network info reporting and appends data from legacy fields if applicable */
30+
template <typename Obj>
31+
UniValue GetNetInfoWithLegacyFields(const Obj& obj, const MnType& type)
32+
{
33+
UniValue ret{CHECK_NONFATAL(obj.netInfo)->ToJson()};
34+
35+
// Nothing to do here if not EvoNode, netInfo is empty or netInfo is capable of natively
36+
// storing Platform fields
37+
if (type != MnType::Evo || obj.netInfo->IsEmpty() || obj.netInfo->CanStorePlatform()) return ret;
38+
39+
CNetAddr addr{obj.netInfo->GetPrimary()};
40+
ret.pushKV(PurposeToString(NetInfoPurpose::PLATFORM_HTTPS).data(),
41+
ArrFromService(CService(addr, obj.platformHTTPPort)));
42+
43+
if constexpr (!std::is_same_v<std::decay_t<Obj>, CSimplifiedMNListEntry>) {
44+
// CSimplifiedMNListEntry doesn't store platformP2PPort
45+
ret.pushKV(PurposeToString(NetInfoPurpose::PLATFORM_P2P).data(),
46+
ArrFromService(CService(addr, obj.platformP2PPort)));
47+
}
48+
49+
return ret;
50+
}
51+
1852
#endif // BITCOIN_RPC_EVO_UTIL_H

src/rpc/masternode.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <net.h>
1616
#include <netbase.h>
1717
#include <rpc/server.h>
18+
#include <rpc/evo_util.h>
1819
#include <rpc/server_util.h>
1920
#include <rpc/util.h>
2021
#include <univalue.h>
@@ -616,7 +617,7 @@ static RPCHelpMan masternodelist_helper(bool is_composite)
616617
if (IsDeprecatedRPCEnabled("service")) {
617618
objMN.pushKV("address", dmn.pdmnState->netInfo->GetPrimary().ToStringAddrPort());
618619
}
619-
objMN.pushKV("addresses", dmn.pdmnState->netInfo->ToJson());
620+
objMN.pushKV("addresses", GetNetInfoWithLegacyFields(*dmn.pdmnState, dmn.nType));
620621
objMN.pushKV("payee", payeeStr);
621622
objMN.pushKV("status", dmnToStatus(dmn));
622623
objMN.pushKV("type", std::string(GetMnType(dmn.nType).description));

src/rpc/quorums.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <index/txindex.h>
88
#include <net_processing.h>
99
#include <node/context.h>
10+
#include <rpc/evo_util.h>
1011
#include <rpc/server.h>
1112
#include <rpc/server_util.h>
1213
#include <rpc/util.h>
@@ -207,7 +208,7 @@ static UniValue BuildQuorumInfo(const llmq::CQuorumBlockProcessor& quorum_block_
207208
if (IsDeprecatedRPCEnabled("service")) {
208209
mo.pushKV("service", dmn->pdmnState->netInfo->GetPrimary().ToStringAddrPort());
209210
}
210-
mo.pushKV("addresses", dmn->pdmnState->netInfo->ToJson());
211+
mo.pushKV("addresses", GetNetInfoWithLegacyFields(*dmn->pdmnState, dmn->nType));
211212
mo.pushKV("pubKeyOperator", dmn->pdmnState->pubKeyOperator.ToString());
212213
mo.pushKV("valid", static_cast<bool>(quorum->qc->validMembers[i]));
213214
if (quorum->qc->validMembers[i]) {

test/functional/rpc_netinfo.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from _decimal import Decimal
2121
from random import randint
22+
from typing import Optional
2223

2324
# See CMainParams in src/chainparams.cpp
2425
DEFAULT_PORT_MAINNET_CORE_P2P = 9999
@@ -153,8 +154,12 @@ def set_test_params(self):
153154
def skip_test_if_missing_module(self):
154155
self.skip_if_no_wallet()
155156

156-
def check_netinfo_fields(self, val, core_p2p_port: int):
157+
def check_netinfo_fields(self, val, core_p2p_port: int, plat_https_port: Optional[int], plat_p2p_port: Optional[int]):
157158
assert_equal(val['core_p2p'][0], f"127.0.0.1:{core_p2p_port}")
159+
if plat_https_port:
160+
assert_equal(val['platform_https'][0], f"127.0.0.1:{plat_https_port}")
161+
if plat_p2p_port:
162+
assert_equal(val['platform_p2p'][0], f"127.0.0.1:{plat_p2p_port}")
158163

159164
def run_test(self):
160165
self.node_evo: Node = Node(self.nodes[0], True)
@@ -259,11 +264,13 @@ def test_deprecation(self):
259264
assert "addresses" in protx_listdiff_rpc['updatedMNs'][0][proregtx_hash].keys()
260265

261266
self.log.info("Test 'addresses' report correctly")
262-
self.check_netinfo_fields(proregtx_rpc['proRegTx']['addresses'], self.node_evo.mn.nodePort)
263-
self.check_netinfo_fields(masternode_status['dmnState']['addresses'], self.node_evo.mn.nodePort)
264-
self.check_netinfo_fields(proupservtx_rpc['proUpServTx']['addresses'], self.node_evo.mn.nodePort)
265-
self.check_netinfo_fields(protx_diff_rpc['mnList'][0]['addresses'], self.node_evo.mn.nodePort)
266-
self.check_netinfo_fields(protx_listdiff_rpc['updatedMNs'][0][proregtx_hash]['addresses'], self.node_evo.mn.nodePort)
267+
self.check_netinfo_fields(proregtx_rpc['proRegTx']['addresses'], self.node_evo.mn.nodePort, DEFAULT_PORT_PLATFORM_HTTP, DEFAULT_PORT_PLATFORM_P2P)
268+
self.check_netinfo_fields(masternode_status['dmnState']['addresses'], self.node_evo.mn.nodePort, DEFAULT_PORT_PLATFORM_HTTP, DEFAULT_PORT_PLATFORM_P2P)
269+
self.check_netinfo_fields(proupservtx_rpc['proUpServTx']['addresses'], self.node_evo.mn.nodePort, DEFAULT_PORT_PLATFORM_HTTP, DEFAULT_PORT_PLATFORM_P2P)
270+
# CSimplifiedMNListEntry doesn't store platform P2P network information before extended addresses
271+
self.check_netinfo_fields(protx_diff_rpc['mnList'][0]['addresses'], self.node_evo.mn.nodePort, DEFAULT_PORT_PLATFORM_HTTP, None)
272+
# TODO: Fix reporting for CDeterministicMNStateDiff
273+
self.check_netinfo_fields(protx_listdiff_rpc['updatedMNs'][0][proregtx_hash]['addresses'], self.node_evo.mn.nodePort, None, None)
267274

268275
self.log.info("Test RPCs by default no longer return a 'service' field")
269276
assert "service" not in proregtx_rpc['proRegTx'].keys()

0 commit comments

Comments
 (0)