Fix SelectCoinsMinConf to allow instant respends (#3061)

* Modify tests to check for instant respends

This should fail atm...

* Fix SelectCoinsMinConf to allow instant respends

Now tests should pass again.
This commit is contained in:
UdjinM6 2019-08-23 21:02:33 +03:00 committed by GitHub
parent cbbeec6897
commit 386de78bcb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 2 deletions

View File

@ -2895,6 +2895,8 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const int nConfMin
std::sort(vCoins.begin(), vCoins.end(), less_then_denom); std::sort(vCoins.begin(), vCoins.end(), less_then_denom);
} }
int nMaxChainLength = std::min(gArgs.GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT), gArgs.GetArg("-limitdescendantcount", DEFAULT_DESCENDANT_LIMIT));
// try to find nondenom first to prevent unneeded spending of mixed coins // try to find nondenom first to prevent unneeded spending of mixed coins
for (unsigned int tryDenom = tryDenomStart; tryDenom < 2; tryDenom++) for (unsigned int tryDenom = tryDenomStart; tryDenom < 2; tryDenom++)
{ {
@ -2908,11 +2910,13 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const int nConfMin
const CWalletTx *pcoin = output.tx; const CWalletTx *pcoin = output.tx;
bool fLockedByIS = pcoin->IsLockedByInstantSend();
// if (logCategories != BCLog::NONE) LogPrint(BCLog::SELECTCOINS, "value %s confirms %d\n", FormatMoney(pcoin->vout[output.i].nValue), output.nDepth); // if (logCategories != BCLog::NONE) LogPrint(BCLog::SELECTCOINS, "value %s confirms %d\n", FormatMoney(pcoin->vout[output.i].nValue), output.nDepth);
if (output.nDepth < (pcoin->IsFromMe(ISMINE_ALL) ? nConfMine : nConfTheirs)) if (output.nDepth < (pcoin->IsFromMe(ISMINE_ALL) ? nConfMine : nConfTheirs) && !fLockedByIS)
continue; continue;
if (!mempool.TransactionWithinChainLimit(pcoin->GetHash(), nMaxAncestors)) if (!mempool.TransactionWithinChainLimit(pcoin->GetHash(), fLockedByIS ? nMaxChainLength : nMaxAncestors))
continue; continue;
int i = output.i; int i = output.i;

View File

@ -71,6 +71,9 @@ class InstantSendTest(DashTestFramework):
assert (res['hash'] != wrong_block) assert (res['hash'] != wrong_block)
# wait for long time only for first node # wait for long time only for first node
timeout = 1 timeout = 1
# send coins back to the controller node without waiting for confirmations
receiver.sendtoaddress(self.nodes[0].getnewaddress(), 0.9, "", "", True)
assert_equal(receiver.getwalletinfo()["balance"], 0)
# mine more blocks # mine more blocks
# TODO: mine these blocks on an isolated node # TODO: mine these blocks on an isolated node
self.bump_mocktime(1) self.bump_mocktime(1)
@ -109,6 +112,9 @@ class InstantSendTest(DashTestFramework):
for node in self.nodes: for node in self.nodes:
self.wait_for_instantlock(is_id, node) self.wait_for_instantlock(is_id, node)
assert_raises_jsonrpc(-5, "No such mempool or blockchain transaction", isolated.getrawtransaction, dblspnd_txid) assert_raises_jsonrpc(-5, "No such mempool or blockchain transaction", isolated.getrawtransaction, dblspnd_txid)
# send coins back to the controller node without waiting for confirmations
receiver.sendtoaddress(self.nodes[0].getnewaddress(), 0.9, "", "", True)
assert_equal(receiver.getwalletinfo()["balance"], 0)
if __name__ == '__main__': if __name__ == '__main__':
InstantSendTest().main() InstantSendTest().main()