Merge pull request #3301 from UdjinM6/bp15rc2_3

Backport remaining "candidates" from develop to v0.15.x
This commit is contained in:
UdjinM6 2020-01-24 20:05:14 +03:00 committed by GitHub
commit 863057d327
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 205 additions and 29 deletions

View File

@ -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). 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) - [`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) - [`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) - [`3c54f6527`](https://github.com/dashpay/dash/commit/3c54f6527) Bump copyright year to 2020 (#3290)

View File

@ -107,4 +107,5 @@ void CDSNotificationInterface::NotifyMasternodeListChanged(bool undo, const CDet
void CDSNotificationInterface::NotifyChainLock(const CBlockIndex* pindex, const llmq::CChainLockSig& clsig) void CDSNotificationInterface::NotifyChainLock(const CBlockIndex* pindex, const llmq::CChainLockSig& clsig)
{ {
llmq::quorumInstantSendManager->NotifyChainLock(pindex); llmq::quorumInstantSendManager->NotifyChainLock(pindex);
CPrivateSend::NotifyChainLock(pindex);
} }

View File

@ -280,7 +280,6 @@ void CDKGSession::ReceiveMessage(const uint256& hash, const CDKGContribution& qc
member->contributions.emplace(hash); member->contributions.emplace(hash);
CInv inv(MSG_QUORUM_CONTRIB, hash); CInv inv(MSG_QUORUM_CONTRIB, hash);
invSet.emplace(inv);
RelayInvToParticipants(inv); RelayInvToParticipants(inv);
quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) { quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) {
@ -547,7 +546,6 @@ void CDKGSession::ReceiveMessage(const uint256& hash, const CDKGComplaint& qc, b
member->complaints.emplace(hash); member->complaints.emplace(hash);
CInv inv(MSG_QUORUM_COMPLAINT, hash); CInv inv(MSG_QUORUM_COMPLAINT, hash);
invSet.emplace(inv);
RelayInvToParticipants(inv); RelayInvToParticipants(inv);
quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) { quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) {
@ -762,7 +760,6 @@ void CDKGSession::ReceiveMessage(const uint256& hash, const CDKGJustification& q
// we always relay, even if further verification fails // we always relay, even if further verification fails
CInv inv(MSG_QUORUM_JUSTIFICATION, hash); CInv inv(MSG_QUORUM_JUSTIFICATION, hash);
invSet.emplace(inv);
RelayInvToParticipants(inv); RelayInvToParticipants(inv);
quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) { quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) {
@ -1130,7 +1127,6 @@ void CDKGSession::ReceiveMessage(const uint256& hash, const CDKGPrematureCommitm
validCommitments.emplace(hash); validCommitments.emplace(hash);
CInv inv(MSG_QUORUM_PREMATURE_COMMITMENT, hash); CInv inv(MSG_QUORUM_PREMATURE_COMMITMENT, hash);
invSet.emplace(inv);
RelayInvToParticipants(inv); RelayInvToParticipants(inv);
quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) { quorumDKGDebugManager->UpdateLocalMemberStatus(params.type, member->idx, [&](CDKGDebugMemberStatus& status) {

View File

@ -274,7 +274,6 @@ private:
std::map<uint256, CDKGComplaint> complaints; std::map<uint256, CDKGComplaint> complaints;
std::map<uint256, CDKGJustification> justifications; std::map<uint256, CDKGJustification> justifications;
std::map<uint256, CDKGPrematureCommitment> prematureCommitments; std::map<uint256, CDKGPrematureCommitment> prematureCommitments;
std::set<CInv> invSet;
std::vector<size_t> pendingContributionVerifications; std::vector<size_t> pendingContributionVerifications;

View File

@ -177,8 +177,15 @@ void CActiveMasternodeManager::UpdatedBlockTip(const CBlockIndex* pindexNew, con
bool CActiveMasternodeManager::GetLocalAddress(CService& addrRet) bool CActiveMasternodeManager::GetLocalAddress(CService& addrRet)
{ {
// First try to find whatever local address is specified by externalip option // First try to find whatever our own local address is known internally.
bool fFoundLocal = GetLocal(addrRet) && IsValidNetAddr(addrRet); // 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 (!fFoundLocal && Params().NetworkIDString() == CBaseChainParams::REGTEST) {
if (Lookup("127.0.0.1", addrRet, GetListenPort(), false)) { if (Lookup("127.0.0.1", addrRet, GetListenPort(), false)) {
fFoundLocal = true; fFoundLocal = true;

View File

@ -999,7 +999,7 @@ public:
void PushInventory(const CInv& inv) void PushInventory(const CInv& inv)
{ {
LOCK(cs_inventory); LOCK(cs_inventory);
if (inv.type == MSG_TX) { if (inv.type == MSG_TX || inv.type == MSG_DSTX) {
if (!filterInventoryKnown.contains(inv.hash)) { if (!filterInventoryKnown.contains(inv.hash)) {
LogPrint(BCLog::NET, "PushInventory -- inv: %s peer=%d\n", inv.ToString(), id); LogPrint(BCLog::NET, "PushInventory -- inv: %s peer=%d\n", inv.ToString(), id);
setInventoryTxToSend.insert(inv.hash); setInventoryTxToSend.insert(inv.hash);

View File

@ -1011,6 +1011,7 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
switch (inv.type) switch (inv.type)
{ {
case MSG_TX: case MSG_TX:
case MSG_DSTX:
case MSG_LEGACY_TXLOCK_REQUEST: // we treat legacy IX messages as TX messages case MSG_LEGACY_TXLOCK_REQUEST: // we treat legacy IX messages as TX messages
{ {
assert(recentRejects); assert(recentRejects);
@ -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 // 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 // previously due to txn-mempool-conflict rule). This means that we must ignore
// recentRejects filter for such locked txes here. // 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) || mempool.exists(inv.hash) ||
pcoinsTip->HaveCoinInCache(COutPoint(inv.hash, 0)) || // Best effort: only try output 0 and 1 pcoinsTip->HaveCoinInCache(COutPoint(inv.hash, 0)) || // Best effort: only try output 0 and 1
pcoinsTip->HaveCoinInCache(COutPoint(inv.hash, 1)) || pcoinsTip->HaveCoinInCache(COutPoint(inv.hash, 1)) ||
@ -1060,10 +1071,6 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
return sporkManager.GetSporkByHash(inv.hash, spork); 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:
case MSG_GOVERNANCE_OBJECT_VOTE: case MSG_GOVERNANCE_OBJECT_VOTE:
return ! governance.ConfirmInventoryRequest(inv); return ! governance.ConfirmInventoryRequest(inv);
@ -1274,17 +1281,29 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// Send stream from relay memory // Send stream from relay memory
bool push = false; 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); auto mi = mapRelay.find(inv.hash);
if (mi != mapRelay.end()) { if (mi != mapRelay.end()) {
if (dstx) {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::DSTX, dstx));
} else {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::TX, *mi->second)); connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::TX, *mi->second));
}
push = true; push = true;
} else if (pfrom->timeLastMempoolReq) { } else if (pfrom->timeLastMempoolReq) {
auto txinfo = mempool.info(inv.hash); auto txinfo = mempool.info(inv.hash);
// To protect privacy, do not answer getdata using the mempool when // To protect privacy, do not answer getdata using the mempool when
// that TX couldn't have been INVed in reply to a MEMPOOL request. // that TX couldn't have been INVed in reply to a MEMPOOL request.
if (txinfo.tx && txinfo.nTime <= pfrom->timeLastMempoolReq) { if (txinfo.tx && txinfo.nTime <= pfrom->timeLastMempoolReq) {
if (dstx) {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::DSTX, dstx));
} else {
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::TX, *txinfo.tx)); connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::TX, *txinfo.tx));
}
push = true; push = true;
} }
} }
@ -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) { if (!push && inv.type == MSG_GOVERNANCE_OBJECT) {
LogPrint(BCLog::NET, "ProcessGetData -- MSG_GOVERNANCE_OBJECT: inv = %s\n", inv.ToString()); LogPrint(BCLog::NET, "ProcessGetData -- MSG_GOVERNANCE_OBJECT: inv = %s\n", inv.ToString());
CDataStream ss(SER_NETWORK, pfrom->GetSendVersion()); CDataStream ss(SER_NETWORK, pfrom->GetSendVersion());
@ -2452,7 +2463,19 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
return true; // not an error 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) { if(!dmn) {
LogPrint(BCLog::PRIVATESEND, "DSTX -- Can't find masternode %s to verify %s\n", dstx.masternodeOutpoint.ToStringShort(), hashTx.ToString()); LogPrint(BCLog::PRIVATESEND, "DSTX -- Can't find masternode %s to verify %s\n", dstx.masternodeOutpoint.ToStringShort(), hashTx.ToString());
return false; return false;
@ -2523,6 +2546,10 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
CInv _inv(MSG_TX, txin.prevout.hash); CInv _inv(MSG_TX, txin.prevout.hash);
pfrom->AddInventoryKnown(_inv); pfrom->AddInventoryKnown(_inv);
if (!AlreadyHave(_inv)) pfrom->AskFor(_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()); AddOrphanTx(ptx, pfrom->GetId());
@ -3785,7 +3812,11 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM
for (const auto& txinfo : vtxinfo) { for (const auto& txinfo : vtxinfo) {
const uint256& hash = txinfo.tx->GetHash(); 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); pto->setInventoryTxToSend.erase(hash);
if (pto->pfilter) { if (pto->pfilter) {
if (!pto->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue; if (!pto->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue;
@ -3851,7 +3882,11 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM
} }
if (pto->pfilter && !pto->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue; if (pto->pfilter && !pto->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue;
// Send // 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++; nRelayedTransactions++;
{ {
// Expire old relay messages // Expire old relay messages

View File

@ -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) void CPrivateSend::UpdateDSTXConfirmedHeight(const CTransactionRef& tx, int nHeight)
{ {
AssertLockHeld(cs_mapdstx); AssertLockHeld(cs_mapdstx);

View File

@ -465,6 +465,7 @@ public:
static CPrivateSendBroadcastTx GetDSTX(const uint256& hash); static CPrivateSendBroadcastTx GetDSTX(const uint256& hash);
static void UpdatedBlockTip(const CBlockIndex* pindex); static void UpdatedBlockTip(const CBlockIndex* pindex);
static void NotifyChainLock(const CBlockIndex* pindex);
static void UpdateDSTXConfirmedHeight(const CTransactionRef& tx, int nHeight); static void UpdateDSTXConfirmedHeight(const CTransactionRef& tx, int nHeight);
static void TransactionAddedToMempool(const CTransactionRef& tx); static void TransactionAddedToMempool(const CTransactionRef& tx);

View File

@ -1326,6 +1326,10 @@
<source>This amount acts as a threshold to turn off PrivateSend once it's reached.</source> <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> <translation>Esta cantidad actúa como un límite para desactivar PrivateSend una vez que se alcanza ese límite.</translation>
</message> </message>
<message>
<source>Target PrivateSend balance</source>
<translation>Saldo objetivo de PrivateSend</translation>
</message>
<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> <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> <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>
@ -1715,6 +1719,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Denominated</source> <source>Denominated</source>
<translation>Denominadas</translation> <translation>Denominadas</translation>
</message> </message>
<message>
<source>Partially mixed</source>
<translation>Parcialmente mezclado</translation>
</message>
<message> <message>
<source>Mixed</source> <source>Mixed</source>
<translation>Mezcladas</translation> <translation>Mezcladas</translation>
@ -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> <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> <translation>&lt;b&gt;(%1 de %2 registros mostrados)&lt;/b&gt;</translation>
</message> </message>
<message>
<source>PrivateSend funds only</source>
<translation>Fondos de PrivateSend solamente</translation>
</message>
<message> <message>
<source>any available funds</source> <source>any available funds</source>
<translation>cualquier fondo disponible</translation> <translation>cualquier fondo disponible</translation>
@ -2817,6 +2829,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Fee rate: %1</source> <source>Fee rate: %1</source>
<translation>Tasa de comisión: %1</translation> <translation>Tasa de comisión: %1</translation>
</message> </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> <message>
<source>Warning: Using PrivateSend with %1 or more inputs can harm your privacy and is not recommended</source> <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> <translation>Advertencia: el uso de PrivateSend con %1 o más entradas puede dañar tu privacidad y no se recomienda</translation>

View File

@ -1326,6 +1326,10 @@
<source>This amount acts as a threshold to turn off PrivateSend once it's reached.</source> <source>This amount acts as a threshold to turn off PrivateSend once it's reached.</source>
<translation> .</translation> <translation> .</translation>
</message> </message>
<message>
<source>Target PrivateSend balance</source>
<translation> </translation>
</message>
<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> <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> <translation> . UPnP를 .</translation>
@ -1715,6 +1719,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Denominated</source> <source>Denominated</source>
<translation> </translation> <translation> </translation>
</message> </message>
<message>
<source>Partially mixed</source>
<translation> </translation>
</message>
<message> <message>
<source>Mixed</source> <source>Mixed</source>
<translation> </translation> <translation> </translation>
@ -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> <source>&lt;b&gt;(%1 of %2 entries displayed)&lt;/b&gt;</source>
<translation>&lt;b&gt;(%2 %1 )&lt;/b&gt;</translation> <translation>&lt;b&gt;(%2 %1 )&lt;/b&gt;</translation>
</message> </message>
<message>
<source>PrivateSend funds only</source>
<translation> </translation>
</message>
<message>
<source>any available funds</source>
<translation> </translation>
</message>
<message> <message>
<source>(PrivateSend transactions have higher fees usually due to no change output being allowed)</source> <source>(PrivateSend transactions have higher fees usually due to no change output being allowed)</source>
<translation>( )</translation> <translation>( )</translation>
@ -2813,6 +2829,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Fee rate: %1</source> <source>Fee rate: %1</source>
<translation> : %1</translation> <translation> : %1</translation>
</message> </message>
<message numerus="yes">
<source>This transaction will consume %n input(s)</source>
<translation><numerusform> %n </numerusform></translation>
</message>
<message> <message>
<source>Warning: Using PrivateSend with %1 or more inputs can harm your privacy and is not recommended</source> <source>Warning: Using PrivateSend with %1 or more inputs can harm your privacy and is not recommended</source>
<translation>: %1 .</translation> <translation>: %1 .</translation>
@ -5040,7 +5060,7 @@ https://www.transifex.com/projects/p/dash/</translation>
</message> </message>
<message> <message>
<source>Inputs vs outputs size mismatch.</source> <source>Inputs vs outputs size mismatch.</source>
<translation> vs .</translation> <translation> vs .</translation>
</message> </message>
<message> <message>
<source>Invalid -onion address or hostname: '%s'</source> <source>Invalid -onion address or hostname: '%s'</source>

View File

@ -4350,6 +4350,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source> <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
<translation>Atentie: se mineaza blocuri cu versiune necunoscuta! Este posibil sa fie in vigoare reguli necunoscute.</translation> <translation>Atentie: se mineaza blocuri cu versiune necunoscuta! Este posibil sa fie in vigoare reguli necunoscute.</translation>
</message> </message>
<message>
<source>You need to rebuild the database using -reindex to change -timestampindex</source>
<translation>Trebuie reconstruiești baza de date utilizând -reindex pentru a schimba -timestampindex</translation>
</message>
<message> <message>
<source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source> <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
<translation>Trebuie reconstruita intreaga baza de date folosind -reindex pentru a va intoarce la modul non-redus. Aceasta va determina descarcarea din nou a intregului blockchain</translation> <translation>Trebuie reconstruita intreaga baza de date folosind -reindex pentru a va intoarce la modul non-redus. Aceasta va determina descarcarea din nou a intregului blockchain</translation>
@ -4662,6 +4666,14 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>You can not start a masternode with wallet enabled.</source> <source>You can not start a masternode with wallet enabled.</source>
<translation>Nu poți porni un masternode cu portofelul activat.</translation> <translation>Nu poți porni un masternode cu portofelul activat.</translation>
</message> </message>
<message>
<source>You need to rebuild the database using -reindex to change -addressindex</source>
<translation>Trebuie reconstruiești baza de date utilizând -reindex pentru a schimba -addressindex</translation>
</message>
<message>
<source>You need to rebuild the database using -reindex to change -spentindex</source>
<translation>Trebuie reconstruiești baza de date utilizând -reindex pentru a schimba -spentindex</translation>
</message>
<message> <message>
<source>You need to rebuild the database using -reindex to change -txindex</source> <source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>Trebuie reconstruiești baza de date utilizând -reindex pentru a schimba -txindex</translation> <translation>Trebuie reconstruiești baza de date utilizând -reindex pentru a schimba -txindex</translation>

View File

@ -597,6 +597,30 @@
<source>Information</source> <source>Information</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Received and sent multiple transactions</source>
<translation></translation>
</message>
<message>
<source>Sent multiple transactions</source>
<translation></translation>
</message>
<message>
<source>Received multiple transactions</source>
<translation></translation>
</message>
<message>
<source>Sent Amount: %1
</source>
<translation>: %1
</translation>
</message>
<message>
<source>Received Amount: %1
</source>
<translation>: %1
</translation>
</message>
<message> <message>
<source>Date: %1 <source>Date: %1
</source> </source>
@ -1065,6 +1089,10 @@
<source>My masternodes only</source> <source>My masternodes only</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Service</source>
<translation></translation>
</message>
<message> <message>
<source>PoSe Score</source> <source>PoSe Score</source>
<translation>PoSe </translation> <translation>PoSe </translation>
@ -1081,10 +1109,26 @@
<source>Next Payment</source> <source>Next Payment</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Payout Address</source>
<translation></translation>
</message>
<message> <message>
<source>Operator Reward</source> <source>Operator Reward</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Collateral Address</source>
<translation></translation>
</message>
<message>
<source>Owner Address</source>
<translation></translation>
</message>
<message>
<source>Voting Address</source>
<translation></translation>
</message>
<message> <message>
<source>Copy ProTx Hash</source> <source>Copy ProTx Hash</source>
<translation> ProTx </translation> <translation> ProTx </translation>
@ -1274,6 +1318,10 @@
<source>This amount acts as a threshold to turn off PrivateSend once it's reached.</source> <source>This amount acts as a threshold to turn off PrivateSend once it's reached.</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Target PrivateSend balance</source>
<translation></translation>
</message>
<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> <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> <translation>(UPnP)</translation>
@ -2749,6 +2797,18 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>any available funds</source> <source>any available funds</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Transaction size: %1</source>
<translation>: %1</translation>
</message>
<message>
<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> <message>
<source>Confirm send coins</source> <source>Confirm send coins</source>
<translation></translation> <translation></translation>
@ -4058,6 +4118,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>No compatible Masternode found.</source> <source>No compatible Masternode found.</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Not enough funds to mix.</source>
<translation>使</translation>
</message>
<message> <message>
<source>Not in the Masternode list.</source> <source>Not in the Masternode list.</source>
<translation></translation> <translation></translation>
@ -4350,6 +4414,10 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source> <source>Warning: Unknown block versions being mined! It's possible unknown rules are in effect</source>
<translation>警告 : 正在開採未知版本的區塊</translation> <translation>警告 : 正在開採未知版本的區塊</translation>
</message> </message>
<message>
<source>You need to rebuild the database using -reindex to change -timestampindex</source>
<translation>使-reindex來重建數據庫-timestampindex</translation>
</message>
<message> <message>
<source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source> <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
<translation>使-reindex </translation> <translation>使-reindex </translation>
@ -4662,6 +4730,14 @@ https://www.transifex.com/projects/p/dash/</translation>
<source>You can not start a masternode with wallet enabled.</source> <source>You can not start a masternode with wallet enabled.</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>You need to rebuild the database using -reindex to change -addressindex</source>
<translation>使-reindex -addressindex</translation>
</message>
<message>
<source>You need to rebuild the database using -reindex to change -spentindex</source>
<translation>使-reindex -spentindex </translation>
</message>
<message> <message>
<source>You need to rebuild the database using -reindex to change -txindex</source> <source>You need to rebuild the database using -reindex to change -txindex</source>
<translation> -txindex -reindex </translation> <translation> -txindex -reindex </translation>

View File

@ -24,13 +24,13 @@ class TestNode(NodeConnCB):
self.last_mnlistdiff = message self.last_mnlistdiff = message
def wait_for_mnlistdiff(self, timeout=30): def wait_for_mnlistdiff(self, timeout=30):
self.last_mnlistdiff = None
def received_mnlistdiff(): def received_mnlistdiff():
return self.last_mnlistdiff is not None return self.last_mnlistdiff is not None
return wait_until(received_mnlistdiff, timeout=timeout) return wait_until(received_mnlistdiff, timeout=timeout)
def getmnlistdiff(self, baseBlockHash, blockHash): def getmnlistdiff(self, baseBlockHash, blockHash):
msg = msg_getmnlistd(baseBlockHash, blockHash) msg = msg_getmnlistd(baseBlockHash, blockHash)
self.last_mnlistdiff = None
self.send_message(msg) self.send_message(msg)
self.wait_for_mnlistdiff() self.wait_for_mnlistdiff()
return self.last_mnlistdiff return self.last_mnlistdiff