Skip to content

Commit e50d436

Browse files
committed
rpc: restore -deprecatedrpc=service gating for legacy network fields
reverts: - bbcd9d5
1 parent e6e9a3e commit e50d436

10 files changed

Lines changed: 133 additions & 38 deletions

File tree

doc/release-notes-7181.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Updated RPCs
2+
------------
3+
4+
* The deprecated keys `service`, `platformP2PPort` and `platformHTTPPort` will now require the runtime
5+
flag `-deprecatedrpc=service`.
6+
* The following RPCs are affected `decoderawtransaction`, `decodepsbt`, `getblock`,
7+
`getrawtransaction`, `gettransaction`, `masternode status` (only the `dmnState` key), `protx diff`,
8+
`protx listdiff`.
9+
* This runtime gate also extends to the functionally identical key, `address` in `masternode list`
10+
(and its alias, `masternodelist`)

src/coinjoin/client.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1865,7 +1865,9 @@ void CCoinJoinClientSession::GetJsonInfo(UniValue& obj) const
18651865
assert(mixingMasternode->pdmnState);
18661866
obj.pushKV("protxhash", mixingMasternode->proTxHash.ToString());
18671867
obj.pushKV("outpoint", mixingMasternode->collateralOutpoint.ToStringShort());
1868-
obj.pushKV("service", mixingMasternode->pdmnState->netInfo->GetPrimary().ToStringAddrPort());
1868+
if (m_wallet->chain().rpcEnableDeprecated("service")) {
1869+
obj.pushKV("service", mixingMasternode->pdmnState->netInfo->GetPrimary().ToStringAddrPort());
1870+
}
18691871
obj.pushKV("addrs_core_p2p", mixingMasternode->pdmnState->netInfo->ToJson(NetInfoPurpose::CORE_P2P));
18701872
}
18711873
obj.pushKV("denomination", ValueFromAmount(CoinJoin::DenominationToAmount(nSessionDenom)));

src/evo/core_write.cpp

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ const std::map<std::string, RPCResult> RPCRESULT_MAP{{
5353
RESULT_MAP_ENTRY("outpoint", RPCResult::Type::STR_HEX,"The outpoint of the masternode"),
5454
RESULT_MAP_ENTRY("ownerAddress", RPCResult::Type::STR, "Dash address used for payee updates and proposal voting"),
5555
RESULT_MAP_ENTRY("payoutAddress", RPCResult::Type::STR, "Dash address used for masternode reward payments"),
56-
RESULT_MAP_ENTRY("platformHTTPPort", RPCResult::Type::NUM, "(DEPRECATED) TCP port of Platform HTTP API"),
56+
RESULT_MAP_ENTRY("platformHTTPPort", RPCResult::Type::NUM, "TCP port of Platform HTTP API (DEPRECATED, returned only if config option -deprecatedrpc=service is passed)"),
5757
RESULT_MAP_ENTRY("platformNodeID", RPCResult::Type::STR_HEX, "Node ID derived from P2P public key for Platform P2P"),
58-
RESULT_MAP_ENTRY("platformP2PPort", RPCResult::Type::NUM, "(DEPRECATED) TCP port of Platform P2P"),
58+
RESULT_MAP_ENTRY("platformP2PPort", RPCResult::Type::NUM, "TCP port of Platform P2P (DEPRECATED, returned only if config option -deprecatedrpc=service is passed)"),
5959
RESULT_MAP_ENTRY("PoSeBanHeight", RPCResult::Type::NUM, "Height masternode was banned for Proof of Service violations"),
6060
RESULT_MAP_ENTRY("PoSePenalty", RPCResult::Type::NUM, "Proof of Service penalty score"),
6161
RESULT_MAP_ENTRY("PoSeRevivedHeight", RPCResult::Type::NUM, "Height masternode recovered from Proof of Service violations"),
@@ -66,7 +66,7 @@ const std::map<std::string, RPCResult> RPCRESULT_MAP{{
6666
RESULT_MAP_ENTRY("quorumSig", RPCResult::Type::STR_HEX, "BLS recovered threshold signature of quorum"),
6767
RESULT_MAP_ENTRY("registeredHeight", RPCResult::Type::NUM, "Height masternode was registered"),
6868
RESULT_MAP_ENTRY("revocationReason", RPCResult::Type::NUM, "Reason for ProUpRegTx revocation"),
69-
RESULT_MAP_ENTRY("service", RPCResult::Type::STR, "(DEPRECATED) IP address and port of the masternode"),
69+
RESULT_MAP_ENTRY("service", RPCResult::Type::STR, "IP address and port of the masternode (DEPRECATED, returned only if config option -deprecatedrpc=service is passed)"),
7070
RESULT_MAP_ENTRY("type", RPCResult::Type::NUM, "Masternode type"),
7171
RESULT_MAP_ENTRY("type_str", RPCResult::Type::STR, "Masternode type (human-readable string)"),
7272
RESULT_MAP_ENTRY("version", RPCResult::Type::NUM, "Special transaction version"),
@@ -197,7 +197,7 @@ RPCResult CDeterministicMNState::GetJsonHelp(const std::string& key, bool option
197197
return {RPCResult::Type::OBJ, key, optional, key.empty() ? "" : "The masternode state",
198198
{
199199
{RPCResult::Type::NUM, "version", "Version of the masternode state"},
200-
GetRpcResult("service"),
200+
GetRpcResult("service", /*optional=*/true),
201201
GetRpcResult("addresses"),
202202
GetRpcResult("registeredHeight"),
203203
GetRpcResult("lastPaidHeight"),
@@ -221,7 +221,9 @@ UniValue CDeterministicMNState::ToJson(MnType nType) const
221221
{
222222
UniValue obj(UniValue::VOBJ);
223223
obj.pushKV("version", nVersion);
224-
obj.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
224+
if (IsServiceDeprecatedRPCEnabled()) {
225+
obj.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
226+
}
225227
obj.pushKV("addresses", GetNetInfoWithLegacyFields(*this, nType));
226228
obj.pushKV("registeredHeight", nRegisteredHeight);
227229
obj.pushKV("lastPaidHeight", nLastPaidHeight);
@@ -234,8 +236,10 @@ UniValue CDeterministicMNState::ToJson(MnType nType) const
234236
obj.pushKV("votingAddress", EncodeDestination(PKHash(keyIDVoting)));
235237
if (nType == MnType::Evo) {
236238
obj.pushKV("platformNodeID", platformNodeID.ToString());
237-
obj.pushKV("platformP2PPort", GetPlatformPort</*is_p2p=*/true>(*this));
238-
obj.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*this));
239+
if (IsServiceDeprecatedRPCEnabled()) {
240+
obj.pushKV("platformP2PPort", GetPlatformPort</*is_p2p=*/true>(*this));
241+
obj.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*this));
242+
}
239243
}
240244

241245
CTxDestination dest;
@@ -283,7 +287,7 @@ RPCResult CProRegTx::GetJsonHelp(const std::string& key, bool optional)
283287
GetRpcResult("type"),
284288
GetRpcResult("collateralHash"),
285289
GetRpcResult("collateralIndex"),
286-
GetRpcResult("service"),
290+
GetRpcResult("service", /*optional=*/true),
287291
GetRpcResult("addresses"),
288292
GetRpcResult("ownerAddress"),
289293
GetRpcResult("votingAddress"),
@@ -304,7 +308,9 @@ UniValue CProRegTx::ToJson() const
304308
ret.pushKV("type", ToUnderlying(nType));
305309
ret.pushKV("collateralHash", collateralOutpoint.hash.ToString());
306310
ret.pushKV("collateralIndex", collateralOutpoint.n);
307-
ret.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
311+
if (IsServiceDeprecatedRPCEnabled()) {
312+
ret.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
313+
}
308314
ret.pushKV("addresses", GetNetInfoWithLegacyFields(*this, nType));
309315
ret.pushKV("ownerAddress", EncodeDestination(PKHash(keyIDOwner)));
310316
ret.pushKV("votingAddress", EncodeDestination(PKHash(keyIDVoting)));
@@ -315,8 +321,10 @@ UniValue CProRegTx::ToJson() const
315321
ret.pushKV("operatorReward", (double)nOperatorReward / 100);
316322
if (nType == MnType::Evo) {
317323
ret.pushKV("platformNodeID", platformNodeID.ToString());
318-
ret.pushKV("platformP2PPort", GetPlatformPort</*is_p2p=*/true>(*this));
319-
ret.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*this));
324+
if (IsServiceDeprecatedRPCEnabled()) {
325+
ret.pushKV("platformP2PPort", GetPlatformPort</*is_p2p=*/true>(*this));
326+
ret.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*this));
327+
}
320328
}
321329
ret.pushKV("inputsHash", inputsHash.ToString());
322330
return ret;
@@ -377,7 +385,7 @@ RPCResult CProUpServTx::GetJsonHelp(const std::string& key, bool optional)
377385
GetRpcResult("version"),
378386
GetRpcResult("type"),
379387
GetRpcResult("proTxHash"),
380-
GetRpcResult("service"),
388+
GetRpcResult("service", /*optional=*/true),
381389
GetRpcResult("addresses"),
382390
GetRpcResult("operatorPayoutAddress", /*optional=*/true),
383391
GetRpcResult("platformNodeID", /*optional=*/true),
@@ -393,15 +401,19 @@ UniValue CProUpServTx::ToJson() const
393401
ret.pushKV("version", nVersion);
394402
ret.pushKV("type", ToUnderlying(nType));
395403
ret.pushKV("proTxHash", proTxHash.ToString());
396-
ret.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
404+
if (IsServiceDeprecatedRPCEnabled()) {
405+
ret.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
406+
}
397407
ret.pushKV("addresses", GetNetInfoWithLegacyFields(*this, nType));
398408
if (CTxDestination dest; ExtractDestination(scriptOperatorPayout, dest)) {
399409
ret.pushKV("operatorPayoutAddress", EncodeDestination(dest));
400410
}
401411
if (nType == MnType::Evo) {
402412
ret.pushKV("platformNodeID", platformNodeID.ToString());
403-
ret.pushKV("platformP2PPort", GetPlatformPort</*is_p2p=*/true>(*this));
404-
ret.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*this));
413+
if (IsServiceDeprecatedRPCEnabled()) {
414+
ret.pushKV("platformP2PPort", GetPlatformPort</*is_p2p=*/true>(*this));
415+
ret.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*this));
416+
}
405417
}
406418
ret.pushKV("inputsHash", inputsHash.ToString());
407419
return ret;
@@ -508,7 +520,7 @@ RPCResult CSimplifiedMNListEntry::GetJsonHelp(const std::string& key, bool optio
508520
GetRpcResult("type", /*optional=*/false, /*override_name=*/"nType"),
509521
{RPCResult::Type::STR_HEX, "proRegTxHash", "Hash of the ProRegTx identifying the masternode"},
510522
{RPCResult::Type::STR_HEX, "confirmedHash", "Hash of the block where the masternode was confirmed"},
511-
GetRpcResult("service"),
523+
GetRpcResult("service", /*optional=*/true),
512524
GetRpcResult("addresses"),
513525
GetRpcResult("pubKeyOperator"),
514526
GetRpcResult("votingAddress"),
@@ -527,13 +539,17 @@ UniValue CSimplifiedMNListEntry::ToJson(bool extended) const
527539
obj.pushKV("nType", ToUnderlying(nType));
528540
obj.pushKV("proRegTxHash", proRegTxHash.ToString());
529541
obj.pushKV("confirmedHash", confirmedHash.ToString());
530-
obj.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
542+
if (IsServiceDeprecatedRPCEnabled()) {
543+
obj.pushKV("service", netInfo->GetPrimary().ToStringAddrPort());
544+
}
531545
obj.pushKV("addresses", GetNetInfoWithLegacyFields(*this, nType));
532546
obj.pushKV("pubKeyOperator", pubKeyOperator.ToString());
533547
obj.pushKV("votingAddress", EncodeDestination(PKHash(keyIDVoting)));
534548
obj.pushKV("isValid", isValid);
535549
if (nType == MnType::Evo) {
536-
obj.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*this));
550+
if (IsServiceDeprecatedRPCEnabled()) {
551+
obj.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*this));
552+
}
537553
obj.pushKV("platformNodeID", platformNodeID.ToString());
538554
}
539555

src/evo/dmnstate.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ UniValue CDeterministicMNStateDiff::ToJson(MnType nType) const
3939
obj.pushKV("version", state.nVersion);
4040
}
4141
if (fields & Field_netInfo) {
42-
obj.pushKV("service", state.netInfo->GetPrimary().ToStringAddrPort());
42+
if (IsServiceDeprecatedRPCEnabled()) {
43+
obj.pushKV("service", state.netInfo->GetPrimary().ToStringAddrPort());
44+
}
4345
}
4446
if (fields & Field_nRegisteredHeight) {
4547
obj.pushKV("registeredHeight", state.nRegisteredHeight);

src/evo/netinfo.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ bool IsAllowedPlatformHTTPPort(uint16_t port)
7070

7171
bool IsNodeOnMainnet() { return Params().NetworkIDString() == CBaseChainParams::MAIN; }
7272

73+
bool IsServiceDeprecatedRPCEnabled()
74+
{
75+
const auto args = gArgs.GetArgs("-deprecatedrpc");
76+
return std::find(args.begin(), args.end(), "service") != args.end();
77+
}
78+
7379
const CChainParams& MainParams()
7480
{
7581
std::call_once(g_main_params_flag, [&]() { g_main_params = CreateChainParams(::gArgs, CBaseChainParams::MAIN); });

src/evo/netinfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ constexpr std::string_view PurposeToString(const NetInfoPurpose purpose)
100100
/** Will return true if node is running on mainnet */
101101
bool IsNodeOnMainnet();
102102

103+
/** Identical to IsDeprecatedRPCEnabled("service"). For use outside of RPC code */
104+
bool IsServiceDeprecatedRPCEnabled();
105+
103106
/** Creates a one-element array using CService::ToStringPortAddr() output */
104107
UniValue ArrFromService(const CService& addr);
105108

src/rpc/coinjoin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ static RPCHelpMan getcoinjoininfo()
433433
{
434434
{RPCResult::Type::STR_HEX, "protxhash", "The ProTxHash of the masternode"},
435435
GetRpcResult("outpoint"),
436-
{RPCResult::Type::STR, "service", "(DEPRECATED) The IP address and port of the masternode"},
436+
{RPCResult::Type::STR, "service", "The IP address and port of the masternode (DEPRECATED, returned only if config option -deprecatedrpc=service is passed)"},
437437
{RPCResult::Type::ARR, "addrs_core_p2p", "Network addresses of the masternode used for protocol P2P",
438438
{
439439
{RPCResult::Type::STR, "address", ""},

src/rpc/masternode.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ static RPCHelpMan masternode_status()
182182
RPCResult::Type::OBJ, "", "",
183183
{
184184
GetRpcResult("outpoint"),
185-
GetRpcResult("service"),
185+
GetRpcResult("service", /*optional=*/true),
186186
GetRpcResult("proTxHash", /*optional=*/true),
187187
GetRpcResult("type_str", /*optional=*/true, /*override_name=*/"type"),
188188
GetRpcResult("collateralHash", /*optional=*/true),
@@ -537,7 +537,7 @@ static RPCHelpMan masternodelist_helper(bool is_composite)
537537
RPCResult{"for mode = info", RPCResult::Type::STR, "<info>", "Flattened list of a masternode's status, payee address and service addresses"},
538538
RPCResult{"for mode = evo, json or recent", RPCResult::Type::OBJ, "", "", {
539539
GetRpcResult("proTxHash"),
540-
GetRpcResult("service", /*optional=*/false, /*override_name=*/"address"),
540+
GetRpcResult("service", /*optional=*/true, /*override_name=*/"address"),
541541
GetRpcResult("addresses"),
542542
GetRpcResult("payoutAddress", /*optional=*/false, /*override_name=*/"payee"),
543543
{RPCResult::Type::STR, "status", "Masternode status (human-readable string)"},
@@ -690,15 +690,19 @@ static RPCHelpMan masternodelist_helper(bool is_composite)
690690
return;
691691
UniValue objMN(UniValue::VOBJ);
692692
objMN.pushKV("proTxHash", dmn.proTxHash.ToString());
693-
objMN.pushKV("address", dmn.pdmnState->netInfo->GetPrimary().ToStringAddrPort());
693+
if (IsDeprecatedRPCEnabled("service")) {
694+
objMN.pushKV("address", dmn.pdmnState->netInfo->GetPrimary().ToStringAddrPort());
695+
}
694696
objMN.pushKV("addresses", GetNetInfoWithLegacyFields(*dmn.pdmnState, dmn.nType));
695697
objMN.pushKV("payee", payeeStr);
696698
objMN.pushKV("status", dmnToStatus(dmn));
697699
objMN.pushKV("type", std::string(GetMnType(dmn.nType).description));
698700
if (dmn.nType == MnType::Evo) {
699701
objMN.pushKV("platformNodeID", dmn.pdmnState->platformNodeID.ToString());
700-
objMN.pushKV("platformP2PPort", GetPlatformPort</*is_p2p=*/true>(*dmn.pdmnState));
701-
objMN.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*dmn.pdmnState));
702+
if (IsDeprecatedRPCEnabled("service")) {
703+
objMN.pushKV("platformP2PPort", GetPlatformPort</*is_p2p=*/true>(*dmn.pdmnState));
704+
objMN.pushKV("platformHTTPPort", GetPlatformPort</*is_p2p=*/false>(*dmn.pdmnState));
705+
}
702706
}
703707
objMN.pushKV("pospenaltyscore", dmn.pdmnState->nPoSePenalty);
704708
objMN.pushKV("consecutivePayments", dmn.pdmnState->nConsecutivePayments);

src/rpc/quorums.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,9 @@ static UniValue BuildQuorumInfo(const llmq::CQuorumBlockProcessor& quorum_block_
209209
const auto& dmn = quorum.members[i];
210210
UniValue mo(UniValue::VOBJ);
211211
mo.pushKV("proTxHash", dmn->proTxHash.ToString());
212-
mo.pushKV("service", dmn->pdmnState->netInfo->GetPrimary().ToStringAddrPort());
212+
if (IsDeprecatedRPCEnabled("service")) {
213+
mo.pushKV("service", dmn->pdmnState->netInfo->GetPrimary().ToStringAddrPort());
214+
}
213215
mo.pushKV("addresses", GetNetInfoWithLegacyFields(*dmn->pdmnState, dmn->nType));
214216
mo.pushKV("pubKeyOperator", dmn->pdmnState->pubKeyOperator.ToString());
215217
mo.pushKV("valid", static_cast<bool>(quorum.qc->validMembers[i]));
@@ -259,7 +261,7 @@ static RPCHelpMan quorum_info()
259261
{RPCResult::Type::OBJ, "", "",
260262
{
261263
GetRpcResult("proTxHash"),
262-
GetRpcResult("service"),
264+
GetRpcResult("service", /*optional=*/true),
263265
GetRpcResult("addresses"),
264266
GetRpcResult("pubKeyOperator"),
265267
{RPCResult::Type::BOOL, "valid", "True if member is valid for this DKG"},

0 commit comments

Comments
 (0)