|
|
|
@ -691,7 +691,13 @@ bool CTxMemPool::accept(CTransaction &tx, bool fCheckInputs,
@@ -691,7 +691,13 @@ bool CTxMemPool::accept(CTransaction &tx, bool fCheckInputs,
|
|
|
|
|
|
|
|
|
|
if (fCheckInputs) |
|
|
|
|
{ |
|
|
|
|
CCoinsViewCache &view = *pcoinsTip; |
|
|
|
|
CCoinsView dummy; |
|
|
|
|
CCoinsViewCache view(dummy); |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
LOCK(cs); |
|
|
|
|
CCoinsViewMemPool viewMemPool(*pcoinsTip, *this); |
|
|
|
|
view.SetBackend(viewMemPool); |
|
|
|
|
|
|
|
|
|
// do we already have it?
|
|
|
|
|
if (view.HaveCoins(hash)) |
|
|
|
@ -711,6 +717,13 @@ bool CTxMemPool::accept(CTransaction &tx, bool fCheckInputs,
@@ -711,6 +717,13 @@ bool CTxMemPool::accept(CTransaction &tx, bool fCheckInputs,
|
|
|
|
|
// are the actual inputs available?
|
|
|
|
|
if (!tx.HaveInputs(view)) |
|
|
|
|
return error("CTxMemPool::accept() : inputs already spent"); |
|
|
|
|
|
|
|
|
|
// Bring the best block into scope
|
|
|
|
|
view.GetBestBlock(); |
|
|
|
|
|
|
|
|
|
// we have all inputs cached now, so switch back to dummy, so we don't need to keep lock on mempool
|
|
|
|
|
view.SetBackend(dummy); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Check for non-standard pay-to-script-hash in inputs
|
|
|
|
|
if (!tx.AreInputsStandard(view) && !fTestNet) |
|
|
|
@ -741,7 +754,6 @@ bool CTxMemPool::accept(CTransaction &tx, bool fCheckInputs,
@@ -741,7 +754,6 @@ bool CTxMemPool::accept(CTransaction &tx, bool fCheckInputs,
|
|
|
|
|
int64 nNow = GetTime(); |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
LOCK(cs); |
|
|
|
|
// Use an exponentially decaying ~10-minute window:
|
|
|
|
|
dFreeCount *= pow(1.0 - 1.0/600.0, (double)(nNow - nLastTime)); |
|
|
|
|
nLastTime = nNow; |
|
|
|
|