mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
Merge pull request #3301 from UdjinM6/bp15rc2_3
Backport remaining "candidates" from develop to v0.15.x
This commit is contained in:
commit
863057d327
@ -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)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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><b>(%1 of %2 entries displayed)</b></source>
|
<source><b>(%1 of %2 entries displayed)</b></source>
|
||||||
<translation><b>(%1 de %2 registros mostrados)</b></translation>
|
<translation><b>(%1 de %2 registros mostrados)</b></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>
|
||||||
|
@ -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><b>(%1 of %2 entries displayed)</b></source>
|
<source><b>(%1 of %2 entries displayed)</b></source>
|
||||||
<translation><b>(%2 중 %1 입력값 표시됨)</b></translation>
|
<translation><b>(%2 중 %1 입력값 표시됨)</b></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>
|
||||||
|
@ -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 să 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 să 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 să 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 să reconstruiești baza de date utilizând -reindex pentru a schimba -txindex</translation>
|
<translation>Trebuie să reconstruiești baza de date utilizând -reindex pentru a schimba -txindex</translation>
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user