Skip to content

Commit e4c848b

Browse files
Merge dashpay#6008: backport: Merge bitcoin#21983, 21756, 21927, revert dashpay#855
7b52349 Revert "merge dashpay#855: Fix bad mn sig ipv6" (Vijay) cd21313 Merge bitcoin#21927: fuzz: Run const CScript member functions only once (MarcoFalke) 5ab49e6 Merge bitcoin#21756: Avoid calling `getnameinfo` when formatting IPv6 addresses in `CNetAddr::ToStringIP` (W. J. van der Laan) 86c874e Merge bitcoin#21983: build: Silence lupdate "unknown namespace/class" warnings (W. J. van der Laan) Pull request description: bitcoin backport Top commit has no ACKs. Tree-SHA512: dbe30f5ef22b67742c2c832d2aff76ea2ec1307f63e4aaae8a3a041d3000dbf9e2b3b0a632068326f6d7b5373ed7e7e966a2c47e67ec20527b49d43b0a2c3fe3
2 parents a6df93e + 7b52349 commit e4c848b

File tree

12 files changed

+100
-76
lines changed

12 files changed

+100
-76
lines changed

src/Makefile.qt.include

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ $(srcdir)/qt/dashstrings.cpp: FORCE
429429

430430
translate: $(srcdir)/qt/dashstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_BASE_CPP) qt/bitcoin.cpp $(BITCOIN_QT_WINDOWS_CPP) $(BITCOIN_QT_WALLET_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
431431
@test -n $(LUPDATE) || echo "lupdate is required for updating translations"
432-
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -I$(srcdir) -locations relative -no-obsolete -ts $(srcdir)/qt/locale/dash_en.ts
432+
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) -no-obsolete -I $(srcdir) -locations relative $^ -ts $(srcdir)/qt/locale/dash_en.ts
433433
@test -n $(LCONVERT) || echo "lconvert is required for updating translations"
434434
$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LCONVERT) -o $(srcdir)/qt/locale/dash_en.xlf -i $(srcdir)/qt/locale/dash_en.ts
435435

src/evo/deterministicmns.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ void CDeterministicMNList::AddMN(const CDeterministicMNCPtr& dmn, bool fBumpTota
468468
if (dmn->pdmnState->addr != CService() && !AddUniqueProperty(*dmn, dmn->pdmnState->addr)) {
469469
mnUniquePropertyMap = mnUniquePropertyMapSaved;
470470
throw(std::runtime_error(strprintf("%s: Can't add a masternode %s with a duplicate address=%s", __func__,
471-
dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToStringIPPort(false))));
471+
dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToStringIPPort())));
472472
}
473473
if (!AddUniqueProperty(*dmn, dmn->pdmnState->keyIDOwner)) {
474474
mnUniquePropertyMap = mnUniquePropertyMapSaved;
@@ -509,7 +509,7 @@ void CDeterministicMNList::UpdateMN(const CDeterministicMN& oldDmn, const std::s
509509
if (!UpdateUniqueProperty(*dmn, oldState->addr, pdmnState->addr)) {
510510
mnUniquePropertyMap = mnUniquePropertyMapSaved;
511511
throw(std::runtime_error(strprintf("%s: Can't update a masternode %s with a duplicate address=%s", __func__,
512-
oldDmn.proTxHash.ToString(), pdmnState->addr.ToStringIPPort(false))));
512+
oldDmn.proTxHash.ToString(), pdmnState->addr.ToStringIPPort())));
513513
}
514514
if (!UpdateUniqueProperty(*dmn, oldState->keyIDOwner, pdmnState->keyIDOwner)) {
515515
mnUniquePropertyMap = mnUniquePropertyMapSaved;
@@ -569,7 +569,7 @@ void CDeterministicMNList::RemoveMN(const uint256& proTxHash)
569569
if (dmn->pdmnState->addr != CService() && !DeleteUniqueProperty(*dmn, dmn->pdmnState->addr)) {
570570
mnUniquePropertyMap = mnUniquePropertyMapSaved;
571571
throw(std::runtime_error(strprintf("%s: Can't delete a masternode %s with a address=%s", __func__,
572-
proTxHash.ToString(), dmn->pdmnState->addr.ToStringIPPort(false))));
572+
proTxHash.ToString(), dmn->pdmnState->addr.ToStringIPPort())));
573573
}
574574
if (!DeleteUniqueProperty(*dmn, dmn->pdmnState->keyIDOwner)) {
575575
mnUniquePropertyMap = mnUniquePropertyMapSaved;

src/evo/dmnstate.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ std::string CDeterministicMNState::ToString() const
2828
return strprintf("CDeterministicMNState(nVersion=%d, nRegisteredHeight=%d, nLastPaidHeight=%d, nPoSePenalty=%d, nPoSeRevivedHeight=%d, nPoSeBanHeight=%d, nRevocationReason=%d, "
2929
"ownerAddress=%s, pubKeyOperator=%s, votingAddress=%s, addr=%s, payoutAddress=%s, operatorPayoutAddress=%s)",
3030
nVersion, nRegisteredHeight, nLastPaidHeight, nPoSePenalty, nPoSeRevivedHeight, nPoSeBanHeight, nRevocationReason,
31-
EncodeDestination(PKHash(keyIDOwner)), pubKeyOperator.ToString(), EncodeDestination(PKHash(keyIDVoting)), addr.ToStringIPPort(false), payoutAddress, operatorPayoutAddress);
31+
EncodeDestination(PKHash(keyIDOwner)), pubKeyOperator.ToString(), EncodeDestination(PKHash(keyIDVoting)), addr.ToStringIPPort(), payoutAddress, operatorPayoutAddress);
3232
}
3333

3434
UniValue CDeterministicMNState::ToJson(MnType nType) const
3535
{
3636
UniValue obj;
3737
obj.setObject();
3838
obj.pushKV("version", nVersion);
39-
obj.pushKV("service", addr.ToStringIPPort(false));
39+
obj.pushKV("service", addr.ToStringIPPort());
4040
obj.pushKV("registeredHeight", nRegisteredHeight);
4141
obj.pushKV("lastPaidHeight", nLastPaidHeight);
4242
obj.pushKV("consecutivePayments", nConsecutivePayments);
@@ -71,7 +71,7 @@ UniValue CDeterministicMNStateDiff::ToJson(MnType nType) const
7171
obj.pushKV("version", state.nVersion);
7272
}
7373
if (fields & Field_addr) {
74-
obj.pushKV("service", state.addr.ToStringIPPort(false));
74+
obj.pushKV("service", state.addr.ToStringIPPort());
7575
}
7676
if (fields & Field_nRegisteredHeight) {
7777
obj.pushKV("registeredHeight", state.nRegisteredHeight);

src/evo/providertx.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class CProRegTx
9696
obj.pushKV("type", ToUnderlying(nType));
9797
obj.pushKV("collateralHash", collateralOutpoint.hash.ToString());
9898
obj.pushKV("collateralIndex", (int)collateralOutpoint.n);
99-
obj.pushKV("service", addr.ToString(false));
99+
obj.pushKV("service", addr.ToString());
100100
obj.pushKV("ownerAddress", EncodeDestination(PKHash(keyIDOwner)));
101101
obj.pushKV("votingAddress", EncodeDestination(PKHash(keyIDVoting)));
102102

@@ -181,7 +181,7 @@ class CProUpServTx
181181
obj.pushKV("version", nVersion);
182182
obj.pushKV("type", ToUnderlying(nType));
183183
obj.pushKV("proTxHash", proTxHash.ToString());
184-
obj.pushKV("service", addr.ToString(false));
184+
obj.pushKV("service", addr.ToString());
185185
if (CTxDestination dest; ExtractDestination(scriptOperatorPayout, dest)) {
186186
obj.pushKV("operatorPayoutAddress", EncodeDestination(dest));
187187
}

src/evo/simplifiedmns.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ std::string CSimplifiedMNListEntry::ToString() const
6363
}
6464

6565
return strprintf("CSimplifiedMNListEntry(nVersion=%d, nType=%d, proRegTxHash=%s, confirmedHash=%s, service=%s, pubKeyOperator=%s, votingAddress=%s, isValid=%d, payoutAddress=%s, operatorPayoutAddress=%s, platformHTTPPort=%d, platformNodeID=%s)",
66-
nVersion, ToUnderlying(nType), proRegTxHash.ToString(), confirmedHash.ToString(), service.ToString(false), pubKeyOperator.ToString(), EncodeDestination(PKHash(keyIDVoting)), isValid, payoutAddress, operatorPayoutAddress, platformHTTPPort, platformNodeID.ToString());
66+
nVersion, ToUnderlying(nType), proRegTxHash.ToString(), confirmedHash.ToString(), service.ToString(), pubKeyOperator.ToString(), EncodeDestination(PKHash(keyIDVoting)), isValid, payoutAddress, operatorPayoutAddress, platformHTTPPort, platformNodeID.ToString());
6767
}
6868

6969
UniValue CSimplifiedMNListEntry::ToJson(bool extended) const
@@ -74,7 +74,7 @@ UniValue CSimplifiedMNListEntry::ToJson(bool extended) const
7474
obj.pushKV("nType", ToUnderlying(nType));
7575
obj.pushKV("proRegTxHash", proRegTxHash.ToString());
7676
obj.pushKV("confirmedHash", confirmedHash.ToString());
77-
obj.pushKV("service", service.ToString(false));
77+
obj.pushKV("service", service.ToString());
7878
obj.pushKV("pubKeyOperator", pubKeyOperator.ToString());
7979
obj.pushKV("votingAddress", EncodeDestination(PKHash(keyIDVoting)));
8080
obj.pushKV("isValid", isValid);

src/llmq/utils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ bool EnsureQuorumConnections(const Consensus::LLMQParams& llmqParams, CConnman&
795795
if (!dmn) {
796796
debugMsg += strprintf(" %s (not in valid MN set anymore)\n", c.ToString());
797797
} else {
798-
debugMsg += strprintf(" %s (%s)\n", c.ToString(), dmn->pdmnState->addr.ToString(false));
798+
debugMsg += strprintf(" %s (%s)\n", c.ToString(), dmn->pdmnState->addr.ToString());
799799
}
800800
}
801801
LogPrint(BCLog::NET_NETCONN, debugMsg.c_str()); /* Continued */
@@ -842,7 +842,7 @@ void AddQuorumProbeConnections(const Consensus::LLMQParams& llmqParams, CConnman
842842
if (!dmn) {
843843
debugMsg += strprintf(" %s (not in valid MN set anymore)\n", c.ToString());
844844
} else {
845-
debugMsg += strprintf(" %s (%s)\n", c.ToString(), dmn->pdmnState->addr.ToString(false));
845+
debugMsg += strprintf(" %s (%s)\n", c.ToString(), dmn->pdmnState->addr.ToString());
846846
}
847847
}
848848
LogPrint(BCLog::NET_NETCONN, debugMsg.c_str()); /* Continued */

src/net.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2774,7 +2774,7 @@ void CConnman::ThreadOpenMasternodeConnections(CDeterministicMNManager& dmnman,
27742774
if (pnode->nTimeFirstMessageReceived != 0 && GetTimeSeconds() - pnode->nTimeFirstMessageReceived > 5) {
27752775
// clearly not expecting mnauth to take that long even if it wasn't the first message
27762776
// we received (as it should normally), disconnect
2777-
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- dropping non-mnauth connection to %s, service=%s\n", _func_, proRegTxHash.ToString(), addr2.ToString(false));
2777+
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- dropping non-mnauth connection to %s, service=%s\n", _func_, proRegTxHash.ToString(), addr2.ToString());
27782778
pnode->fDisconnect = true;
27792779
return true;
27802780
}
@@ -2833,7 +2833,7 @@ void CConnman::ThreadOpenMasternodeConnections(CDeterministicMNManager& dmnman,
28332833
auto dmn = mnList.GetValidMN(vPendingMasternodes.front());
28342834
vPendingMasternodes.erase(vPendingMasternodes.begin());
28352835
if (dmn && !connectedNodes.count(dmn->pdmnState->addr) && !IsMasternodeOrDisconnectRequested(dmn->pdmnState->addr)) {
2836-
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- opening pending masternode connection to %s, service=%s\n", _func_, dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToString(false));
2836+
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- opening pending masternode connection to %s, service=%s\n", _func_, dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToString());
28372837
return dmn;
28382838
}
28392839
}
@@ -2842,7 +2842,7 @@ void CConnman::ThreadOpenMasternodeConnections(CDeterministicMNManager& dmnman,
28422842
// not-null
28432843
auto dmn = pending[GetRand(pending.size())];
28442844
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- opening quorum connection to %s, service=%s\n",
2845-
_func_, dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToString(false));
2845+
_func_, dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToString());
28462846
return dmn;
28472847
}
28482848

@@ -2852,7 +2852,7 @@ void CConnman::ThreadOpenMasternodeConnections(CDeterministicMNManager& dmnman,
28522852
masternodePendingProbes.erase(dmn->proTxHash);
28532853
isProbe = MasternodeProbeConn::IsConnection;
28542854

2855-
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- probing masternode %s, service=%s\n", _func_, dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToString(false));
2855+
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- probing masternode %s, service=%s\n", _func_, dmn->proTxHash.ToString(), dmn->pdmnState->addr.ToString());
28562856
return dmn;
28572857
}
28582858
return nullptr;
@@ -2877,7 +2877,7 @@ void CConnman::ThreadOpenMasternodeConnections(CDeterministicMNManager& dmnman,
28772877
return true;
28782878
});
28792879
if (!connected) {
2880-
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- connection failed for masternode %s, service=%s\n", __func__, connectToDmn->proTxHash.ToString(), connectToDmn->pdmnState->addr.ToString(false));
2880+
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- connection failed for masternode %s, service=%s\n", __func__, connectToDmn->proTxHash.ToString(), connectToDmn->pdmnState->addr.ToString());
28812881
// Will take a few consequent failed attempts to PoSe-punish a MN.
28822882
if (mn_metaman.GetMetaInfo(connectToDmn->proTxHash)->OutboundFailedTooManyTimes()) {
28832883
LogPrint(BCLog::NET_NETCONN, "CConnman::%s -- failed to connect to masternode %s too many times\n", __func__, connectToDmn->proTxHash.ToString());
@@ -2903,7 +2903,7 @@ void CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFai
29032903

29042904
auto getIpStr = [&]() {
29052905
if (fLogIPs) {
2906-
return addrConnect.ToString(false);
2906+
return addrConnect.ToString();
29072907
} else {
29082908
return std::string("new peer");
29092909
}

src/netaddress.cpp

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -542,20 +542,57 @@ static std::string IPv4ToString(Span<const uint8_t> a)
542542
return strprintf("%u.%u.%u.%u", a[0], a[1], a[2], a[3]);
543543
}
544544

545+
// Return an IPv6 address text representation with zero compression as described in RFC 5952
546+
// ("A Recommendation for IPv6 Address Text Representation").
545547
static std::string IPv6ToString(Span<const uint8_t> a)
546548
{
547549
assert(a.size() == ADDR_IPV6_SIZE);
548-
// clang-format off
549-
return strprintf("%x:%x:%x:%x:%x:%x:%x:%x",
550-
ReadBE16(&a[0]),
551-
ReadBE16(&a[2]),
552-
ReadBE16(&a[4]),
553-
ReadBE16(&a[6]),
554-
ReadBE16(&a[8]),
555-
ReadBE16(&a[10]),
556-
ReadBE16(&a[12]),
557-
ReadBE16(&a[14]));
558-
// clang-format on
550+
const std::array groups{
551+
ReadBE16(&a[0]),
552+
ReadBE16(&a[2]),
553+
ReadBE16(&a[4]),
554+
ReadBE16(&a[6]),
555+
ReadBE16(&a[8]),
556+
ReadBE16(&a[10]),
557+
ReadBE16(&a[12]),
558+
ReadBE16(&a[14]),
559+
};
560+
561+
// The zero compression implementation is inspired by Rust's std::net::Ipv6Addr, see
562+
// https://github.com/rust-lang/rust/blob/cc4103089f40a163f6d143f06359cba7043da29b/library/std/src/net/ip.rs#L1635-L1683
563+
struct ZeroSpan {
564+
size_t start_index{0};
565+
size_t len{0};
566+
};
567+
568+
// Find longest sequence of consecutive all-zero fields. Use first zero sequence if two or more
569+
// zero sequences of equal length are found.
570+
ZeroSpan longest, current;
571+
for (size_t i{0}; i < groups.size(); ++i) {
572+
if (groups[i] != 0) {
573+
current = {i + 1, 0};
574+
continue;
575+
}
576+
current.len += 1;
577+
if (current.len > longest.len) {
578+
longest = current;
579+
}
580+
}
581+
582+
std::string r;
583+
r.reserve(39);
584+
for (size_t i{0}; i < groups.size(); ++i) {
585+
// Replace the longest sequence of consecutive all-zero fields with two colons ("::").
586+
if (longest.len >= 2 && i >= longest.start_index && i < longest.start_index + longest.len) {
587+
if (i == longest.start_index) {
588+
r += "::";
589+
}
590+
continue;
591+
}
592+
r += strprintf("%s%x", ((!r.empty() && r.back() != ':') ? ":" : ""), groups[i]);
593+
}
594+
595+
return r;
559596
}
560597

561598
static std::string OnionToString(Span<const uint8_t> addr)
@@ -569,23 +606,12 @@ static std::string OnionToString(Span<const uint8_t> addr)
569606
return EncodeBase32(address) + ".onion";
570607
}
571608

572-
std::string CNetAddr::ToStringIP(bool fUseGetnameinfo) const
609+
std::string CNetAddr::ToStringIP() const
573610
{
574611
switch (m_net) {
575612
case NET_IPV4:
576613
return IPv4ToString(m_addr);
577614
case NET_IPV6: {
578-
if (fUseGetnameinfo) {
579-
CService serv(*this, 0);
580-
struct sockaddr_storage sockaddr;
581-
socklen_t socklen = sizeof(sockaddr);
582-
if (serv.GetSockAddr((struct sockaddr*)&sockaddr, &socklen)) {
583-
char name[1025] = "";
584-
if (!getnameinfo((const struct sockaddr*)&sockaddr, socklen, name,
585-
sizeof(name), nullptr, 0, NI_NUMERICHOST))
586-
return std::string(name);
587-
}
588-
}
589615
return IPv6ToString(m_addr);
590616
}
591617
case NET_ONION:
@@ -1001,18 +1027,18 @@ std::string CService::ToStringPort() const
10011027
return strprintf("%u", port);
10021028
}
10031029

1004-
std::string CService::ToStringIPPort(bool fUseGetnameinfo) const
1030+
std::string CService::ToStringIPPort() const
10051031
{
10061032
if (IsIPv4() || IsTor() || IsI2P() || IsInternal()) {
1007-
return ToStringIP(fUseGetnameinfo) + ":" + ToStringPort();
1033+
return ToStringIP() + ":" + ToStringPort();
10081034
} else {
1009-
return "[" + ToStringIP(fUseGetnameinfo) + "]:" + ToStringPort();
1035+
return "[" + ToStringIP() + "]:" + ToStringPort();
10101036
}
10111037
}
10121038

1013-
std::string CService::ToString(bool fUseGetnameinfo) const
1039+
std::string CService::ToString() const
10141040
{
1015-
return ToStringIPPort(fUseGetnameinfo);
1041+
return ToStringIPPort();
10161042
}
10171043

10181044
void CService::SetPort(uint16_t portIn)

src/netaddress.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ class CNetAddr
201201

202202
enum Network GetNetwork() const;
203203
std::string ToString() const;
204-
std::string ToStringIP(bool fUseGetnameinfo = true) const;
204+
std::string ToStringIP() const;
205205
uint64_t GetHash() const;
206206
bool GetInAddr(struct in_addr* pipv4Addr) const;
207207
Network GetNetClass() const;
@@ -569,9 +569,9 @@ class CService : public CNetAddr
569569
friend bool operator!=(const CService& a, const CService& b) { return !(a == b); }
570570
friend bool operator<(const CService& a, const CService& b);
571571
std::vector<unsigned char> GetKey() const;
572-
std::string ToString(bool fUseGetnameinfo = true) const;
572+
std::string ToString() const;
573573
std::string ToStringPort() const;
574-
std::string ToStringIPPort(bool fUseGetnameinfo = true) const;
574+
std::string ToStringIPPort() const;
575575

576576
CService(const struct in6_addr& ipv6Addr, uint16_t port);
577577
explicit CService(const struct sockaddr_in6& addr);

src/rpc/masternode.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,7 @@ static UniValue masternodelist(const JSONRPCRequest& request, ChainstateManager&
654654
}
655655

656656
if (strMode == "addr") {
657-
std::string strAddress = dmn.pdmnState->addr.ToString(false);
657+
std::string strAddress = dmn.pdmnState->addr.ToString();
658658
if (strFilter !="" && strAddress.find(strFilter) == std::string::npos &&
659659
strOutpoint.find(strFilter) == std::string::npos) return;
660660
obj.pushKV(strOutpoint, strAddress);

0 commit comments

Comments
 (0)