Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport remaining "candidates" from develop to v0.15.x #3301

Merged
merged 6 commits into from
Jan 24, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions doc/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,12 @@ modules were reorganized in separate folders to make navigation through code a b

See detailed [set of changes](https://github.com/dashpay/dash/compare/v0.14.0.5...dashpay:v0.15.0.0).

- [`546e69f1a`](https://github.com/dashpay/dash/commit/546e69f1a) Fix CActiveMasternodeManager::GetLocalAddress to prefer IPv4 if multiple local addresses are known (#3304)
- [`e4ef7e8d0`](https://github.com/dashpay/dash/commit/e4ef7e8d0) Drop unused `invSet` in `CDKGSession` (#3303)
- [`da7686c93`](https://github.com/dashpay/dash/commit/da7686c93) Update translations 2020-01-23 (#3302)
- [`6b5d3edae`](https://github.com/dashpay/dash/commit/6b5d3edae) Fix dip4-coinbasemerkleroots.py race condition (#3297)
- [`a8213cadb`](https://github.com/dashpay/dash/commit/a8213cadb) Various fixes for DSTX-es (#3295)
- [`2c26bdf2d`](https://github.com/dashpay/dash/commit/2c26bdf2d) Update release-notes.md
- [`1d9adbe63`](https://github.com/dashpay/dash/commit/1d9adbe63) Replace generic CScopedDBTransaction with specialized CEvoDBScopedCommitter (#3292)
- [`8fd486c6b`](https://github.com/dashpay/dash/commit/8fd486c6b) Translations 2020-01 (#3192)
- [`3c54f6527`](https://github.com/dashpay/dash/commit/3c54f6527) Bump copyright year to 2020 (#3290)
Expand Down
1 change: 1 addition & 0 deletions src/dsnotificationinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,5 @@ void CDSNotificationInterface::NotifyMasternodeListChanged(bool undo, const CDet
void CDSNotificationInterface::NotifyChainLock(const CBlockIndex* pindex, const llmq::CChainLockSig& clsig)
{
llmq::quorumInstantSendManager->NotifyChainLock(pindex);
CPrivateSend::NotifyChainLock(pindex);
}
4 changes: 0 additions & 4 deletions src/llmq/quorums_dkgsession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,6 @@ void CDKGSession::ReceiveMessage(const uint256& hash, const CDKGContribution& qc
member->contributions.emplace(hash);

CInv inv(MSG_QUORUM_CONTRIB, hash);
invSet.emplace(inv);
RelayInvToParticipants(inv);

quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) {
Expand Down Expand Up @@ -547,7 +546,6 @@ void CDKGSession::ReceiveMessage(const uint256& hash, const CDKGComplaint& qc, b
member->complaints.emplace(hash);

CInv inv(MSG_QUORUM_COMPLAINT, hash);
invSet.emplace(inv);
RelayInvToParticipants(inv);

quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) {
Expand Down Expand Up @@ -762,7 +760,6 @@ void CDKGSession::ReceiveMessage(const uint256& hash, const CDKGJustification& q

// we always relay, even if further verification fails
CInv inv(MSG_QUORUM_JUSTIFICATION, hash);
invSet.emplace(inv);
RelayInvToParticipants(inv);

quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) {
Expand Down Expand Up @@ -1130,7 +1127,6 @@ void CDKGSession::ReceiveMessage(const uint256& hash, const CDKGPrematureCommitm
validCommitments.emplace(hash);

CInv inv(MSG_QUORUM_PREMATURE_COMMITMENT, hash);
invSet.emplace(inv);
RelayInvToParticipants(inv);

quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) {
Expand Down
1 change: 0 additions & 1 deletion src/llmq/quorums_dkgsession.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,6 @@ class CDKGSession
std::map<uint256, CDKGComplaint> complaints;
std::map<uint256, CDKGJustification> justifications;
std::map<uint256, CDKGPrematureCommitment> prematureCommitments;
std::set<CInv> invSet;

std::vector<size_t> pendingContributionVerifications;

Expand Down
11 changes: 9 additions & 2 deletions src/masternode/activemasternode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,15 @@ void CActiveMasternodeManager::UpdatedBlockTip(const CBlockIndex* pindexNew, con

bool CActiveMasternodeManager::GetLocalAddress(CService& addrRet)
{
// First try to find whatever local address is specified by externalip option
bool fFoundLocal = GetLocal(addrRet) && IsValidNetAddr(addrRet);
// First try to find whatever our own local address is known internally.
// Addresses could be specified via externalip or bind option, discovered via UPnP
// or added by TorController. Use some random dummy IPv4 peer to prefer the one
// reachable via IPv4.
CNetAddr addrDummyPeer;
bool fFoundLocal{false};
if (LookupHost("8.8.8.8", addrDummyPeer, false)) {
fFoundLocal = GetLocal(addrRet, &addrDummyPeer) && IsValidNetAddr(addrRet);
}
if (!fFoundLocal && Params().NetworkIDString() == CBaseChainParams::REGTEST) {
if (Lookup("127.0.0.1", addrRet, GetListenPort(), false)) {
fFoundLocal = true;
Expand Down
2 changes: 1 addition & 1 deletion src/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -999,7 +999,7 @@ class CNode
void PushInventory(const CInv& inv)
{
LOCK(cs_inventory);
if (inv.type == MSG_TX) {
if (inv.type == MSG_TX || inv.type == MSG_DSTX) {
if (!filterInventoryKnown.contains(inv.hash)) {
LogPrint(BCLog::NET, "PushInventory -- inv: %s peer=%d\n", inv.ToString(), id);
setInventoryTxToSend.insert(inv.hash);
Expand Down
73 changes: 54 additions & 19 deletions src/net_processing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1011,6 +1011,7 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
switch (inv.type)
{
case MSG_TX:
case MSG_DSTX:
case MSG_LEGACY_TXLOCK_REQUEST: // we treat legacy IX messages as TX messages
{
assert(recentRejects);
Expand All @@ -1034,7 +1035,17 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
// and re-request the locked transaction (which did not make it into the mempool
// previously due to txn-mempool-conflict rule). This means that we must ignore
// recentRejects filter for such locked txes here.
return (recentRejects->contains(inv.hash) && !llmq::quorumInstantSendManager->IsLocked(inv.hash)) ||
// We also ignore recentRejects filter for DSTX-es because a malicious peer might
// relay a valid DSTX as a regular TX first which would skip all the specific checks
// but would cause such tx to be rejected by ATMP due to 0 fee. Ignoring it here
// should let DSTX to be propagated by honest peer later. Note, that a malicious
// masternode would not be able to exploit this to spam the network with specially
// crafted invalid DSTX-es and potentially cause high load cheaply, because
// corresponding checks in ProcessMessage won't let it to send DSTX-es too often.
bool fIgnoreRecentRejects = llmq::quorumInstantSendManager->IsLocked(inv.hash) || inv.type == MSG_DSTX;

return (!fIgnoreRecentRejects && recentRejects->contains(inv.hash)) ||
(inv.type == MSG_DSTX && static_cast<bool>(CPrivateSend::GetDSTX(inv.hash))) ||
mempool.exists(inv.hash) ||
pcoinsTip->HaveCoinInCache(COutPoint(inv.hash, 0)) || // Best effort: only try output 0 and 1
pcoinsTip->HaveCoinInCache(COutPoint(inv.hash, 1)) ||
Expand All @@ -1060,10 +1071,6 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
return sporkManager.GetSporkByHash(inv.hash, spork);
}

case MSG_DSTX: {
return static_cast<bool>(CPrivateSend::GetDSTX(inv.hash));
}

case MSG_GOVERNANCE_OBJECT:
case MSG_GOVERNANCE_OBJECT_VOTE:
return ! governance.ConfirmInventoryRequest(inv);
Expand Down Expand Up @@ -1274,17 +1281,29 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

// Send stream from relay memory
bool push = false;
if (inv.type == MSG_TX) {
if (inv.type == MSG_TX || inv.type == MSG_DSTX) {
CPrivateSendBroadcastTx dstx;
if (inv.type == MSG_DSTX) {
dstx = CPrivateSend::GetDSTX(inv.hash);
}
auto mi = mapRelay.find(inv.hash);
if (mi != mapRelay.end()) {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::TX, *mi->second));
if (dstx) {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::DSTX, dstx));
} else {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::TX, *mi->second));
}
push = true;
} else if (pfrom->timeLastMempoolReq) {
auto txinfo = mempool.info(inv.hash);
// To protect privacy, do not answer getdata using the mempool when
// that TX couldn't have been INVed in reply to a MEMPOOL request.
if (txinfo.tx && txinfo.nTime <= pfrom->timeLastMempoolReq) {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::TX, *txinfo.tx));
if (dstx) {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::DSTX, dstx));
} else {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::TX, *txinfo.tx));
}
push = true;
}
}
Expand All @@ -1298,14 +1317,6 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
}
}

if (!push && inv.type == MSG_DSTX) {
CPrivateSendBroadcastTx dstx = CPrivateSend::GetDSTX(inv.hash);
if(dstx) {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::DSTX, dstx));
push = true;
}
}

if (!push && inv.type == MSG_GOVERNANCE_OBJECT) {
LogPrint(BCLog::NET, "ProcessGetData -- MSG_GOVERNANCE_OBJECT: inv = %s\n", inv.ToString());
CDataStream ss(SER_NETWORK, pfrom->GetSendVersion());
Expand Down Expand Up @@ -2452,7 +2463,19 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
return true; // not an error
}

auto dmn = deterministicMNManager->GetListAtChainTip().GetMNByCollateral(dstx.masternodeOutpoint);
const CBlockIndex* pindex{nullptr};
CDeterministicMNCPtr dmn{nullptr};
{
LOCK(cs_main);
pindex = chainActive.Tip();
}
// It could be that a MN is no longer in the list but its DSTX is not yet mined.
// Try to find a MN up to 24 blocks deep to make sure such dstx-es are relayed and processed correctly.
for (int i = 0; i < 24 && pindex; ++i) {
dmn = deterministicMNManager->GetListForBlock(pindex).GetMNByCollateral(dstx.masternodeOutpoint);
if (dmn) break;
pindex = pindex->pprev;
}
if(!dmn) {
LogPrint(BCLog::PRIVATESEND, "DSTX -- Can't find masternode %s to verify %s\n", dstx.masternodeOutpoint.ToStringShort(), hashTx.ToString());
return false;
Expand Down Expand Up @@ -2523,6 +2546,10 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
CInv _inv(MSG_TX, txin.prevout.hash);
pfrom->AddInventoryKnown(_inv);
if (!AlreadyHave(_inv)) pfrom->AskFor(_inv);
// We don't know if the previous tx was a regular or a mixing one, try both
CInv _inv2(MSG_DSTX, txin.prevout.hash);
pfrom->AddInventoryKnown(_inv2);
if (!AlreadyHave(_inv2)) pfrom->AskFor(_inv2);
}
AddOrphanTx(ptx, pfrom->GetId());

Expand Down Expand Up @@ -3785,7 +3812,11 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

for (const auto& txinfo : vtxinfo) {
const uint256& hash = txinfo.tx->GetHash();
CInv inv(MSG_TX, hash);
int nInvType = MSG_TX;
if (CPrivateSend::GetDSTX(hash)) {
nInvType = MSG_DSTX;
}
CInv inv(nInvType, hash);
pto->setInventoryTxToSend.erase(hash);
if (pto->pfilter) {
if (!pto->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue;
Expand Down Expand Up @@ -3851,7 +3882,11 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM
}
if (pto->pfilter && !pto->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue;
// Send
vInv.push_back(CInv(MSG_TX, hash));
int nInvType = MSG_TX;
if (CPrivateSend::GetDSTX(hash)) {
nInvType = MSG_DSTX;
}
vInv.push_back(CInv(nInvType, hash));
nRelayedTransactions++;
{
// Expire old relay messages
Expand Down
7 changes: 7 additions & 0 deletions src/privatesend/privatesend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,13 @@ void CPrivateSend::UpdatedBlockTip(const CBlockIndex* pindex)
}
}

void CPrivateSend::NotifyChainLock(const CBlockIndex* pindex)
{
if (pindex && masternodeSync.IsBlockchainSynced()) {
CheckDSTXes(pindex);
}
}

void CPrivateSend::UpdateDSTXConfirmedHeight(const CTransactionRef& tx, int nHeight)
{
AssertLockHeld(cs_mapdstx);
Expand Down
1 change: 1 addition & 0 deletions src/privatesend/privatesend.h
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,7 @@ class CPrivateSend
static CPrivateSendBroadcastTx GetDSTX(const uint256& hash);

static void UpdatedBlockTip(const CBlockIndex* pindex);
static void NotifyChainLock(const CBlockIndex* pindex);

static void UpdateDSTXConfirmedHeight(const CTransactionRef& tx, int nHeight);
static void TransactionAddedToMempool(const CTransactionRef& tx);
Expand Down
16 changes: 16 additions & 0 deletions src/qt/locale/dash_es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1326,6 +1326,10 @@
<source>This amount acts as a threshold to turn off PrivateSend once it's reached.</source>
<translation>Esta cantidad actúa como un límite para desactivar PrivateSend una vez que se alcanza ese límite.</translation>
</message>
<message>
<source>Target PrivateSend balance</source>
<translation>Saldo objetivo de PrivateSend</translation>
</message>
<message>
<source>Automatically open the Dash Core client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation>Abrir automáticamente el puerto del cliente Dash Core en el enrutador. Esto solo funciona cuando su enrutador admite UPnP y está habilitado.</translation>
Expand Down Expand Up @@ -1715,6 +1719,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Denominated</source>
<translation>Denominadas</translation>
</message>
<message>
<source>Partially mixed</source>
<translation>Parcialmente mezclado</translation>
</message>
<message>
<source>Mixed</source>
<translation>Mezcladas</translation>
Expand Down Expand Up @@ -2801,6 +2809,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>&lt;b&gt;(%1 of %2 entries displayed)&lt;/b&gt;</source>
<translation>&lt;b&gt;(%1 de %2 registros mostrados)&lt;/b&gt;</translation>
</message>
<message>
<source>PrivateSend funds only</source>
<translation>Fondos de PrivateSend solamente</translation>
</message>
<message>
<source>any available funds</source>
<translation>cualquier fondo disponible</translation>
Expand All @@ -2817,6 +2829,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Fee rate: %1</source>
<translation>Tasa de comisión: %1</translation>
</message>
<message numerus="yes">
<source>This transaction will consume %n input(s)</source>
<translation><numerusform>Esta transacción consumirá %n entrada</numerusform><numerusform>Esta transacción consumirá %n entradas</numerusform></translation>
</message>
<message>
<source>Warning: Using PrivateSend with %1 or more inputs can harm your privacy and is not recommended</source>
<translation>Advertencia: el uso de PrivateSend con %1 o más entradas puede dañar tu privacidad y no se recomienda</translation>
Expand Down
22 changes: 21 additions & 1 deletion src/qt/locale/dash_ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1326,6 +1326,10 @@
<source>This amount acts as a threshold to turn off PrivateSend once it's reached.</source>
<translation>이 금액에 도달하는 경우 프라이빗샌드를 끄기 위한 한계점으로 작동합니다.</translation>
</message>
<message>
<source>Target PrivateSend balance</source>
<translation>타깃 프라이빗샌드 잔고</translation>
</message>
<message>
<source>Automatically open the Dash Core client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation>라우터에서 대시 코어 클라이언트를 자동으로 엽니다. 이 기능은 당신의 라우터가 UPnP를 지원하고 해당 기능이 작동하는 경우에만 가능합니다.</translation>
Expand Down Expand Up @@ -1715,6 +1719,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Denominated</source>
<translation>단위 분할 완료</translation>
</message>
<message>
<source>Partially mixed</source>
<translation>부분적으로 믹싱됨</translation>
</message>
<message>
<source>Mixed</source>
<translation>믹싱 완료</translation>
Expand Down Expand Up @@ -2801,6 +2809,14 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>&lt;b&gt;(%1 of %2 entries displayed)&lt;/b&gt;</source>
<translation>&lt;b&gt;(%2 중 %1 입력값 표시됨)&lt;/b&gt;</translation>
</message>
<message>
<source>PrivateSend funds only</source>
<translation>프라이빗샌드 자금만</translation>
</message>
<message>
<source>any available funds</source>
<translation>이용이 가능한 모든 자금</translation>
</message>
<message>
<source>(PrivateSend transactions have higher fees usually due to no change output being allowed)</source>
<translation>(프라이빗샌드 거래는 잔돈 아웃풋이 허용되지 않아 보다 높은 수수료가 책정됩니다)</translation>
Expand All @@ -2813,6 +2829,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Fee rate: %1</source>
<translation>수수료 요율: %1</translation>
</message>
<message numerus="yes">
<source>This transaction will consume %n input(s)</source>
<translation><numerusform>이 거래는 %n 입력값을 소모합니다</numerusform></translation>
</message>
<message>
<source>Warning: Using PrivateSend with %1 or more inputs can harm your privacy and is not recommended</source>
<translation>경고: %1 혹은 그 이상의 인풋으로 프라이빗샌드를 이용하게 되면 당신의 프라이버시가 침해될 수 있어 권장하지 않습니다.</translation>
Expand Down Expand Up @@ -5040,7 +5060,7 @@ https://www.transifex.com/projects/p/dash/</translation>
</message>
<message>
<source>Inputs vs outputs size mismatch.</source>
<translation>인풋 vs 아웃풋 사이즈가 일치하지 않습니다.</translation>
<translation>입력값 vs 출력값 사이즈가 일치하지 않습니다.</translation>
</message>
<message>
<source>Invalid -onion address or hostname: '%s'</source>
Expand Down
Loading