|
|
@ -1025,7 +1025,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|
|
|
hash.ToString(), nFees, txMinFee),
|
|
|
|
hash.ToString(), nFees, txMinFee),
|
|
|
|
REJECT_INSUFFICIENTFEE, "insufficient fee");
|
|
|
|
REJECT_INSUFFICIENTFEE, "insufficient fee");
|
|
|
|
|
|
|
|
|
|
|
|
// Continuously rate-limit free (really, very-low-fee)transactions
|
|
|
|
// Continuously rate-limit free (really, very-low-fee) transactions
|
|
|
|
// This mitigates 'penny-flooding' -- sending thousands of free transactions just to
|
|
|
|
// This mitigates 'penny-flooding' -- sending thousands of free transactions just to
|
|
|
|
// be annoying or make others' transactions take longer to confirm.
|
|
|
|
// be annoying or make others' transactions take longer to confirm.
|
|
|
|
if (fLimitFree && nFees < ::minRelayTxFee.GetFee(nSize))
|
|
|
|
if (fLimitFree && nFees < ::minRelayTxFee.GetFee(nSize))
|
|
|
@ -1050,7 +1050,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (fRejectInsaneFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000)
|
|
|
|
if (fRejectInsaneFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000)
|
|
|
|
return error("AcceptToMemoryPool: : insane fees %s, %d > %d",
|
|
|
|
return error("AcceptToMemoryPool: insane fees %s, %d > %d",
|
|
|
|
hash.ToString(),
|
|
|
|
hash.ToString(),
|
|
|
|
nFees, ::minRelayTxFee.GetFee(nSize) * 10000);
|
|
|
|
nFees, ::minRelayTxFee.GetFee(nSize) * 10000);
|
|
|
|
|
|
|
|
|
|
|
@ -1058,7 +1058,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|
|
|
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
|
|
|
|
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
|
|
|
|
if (!CheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true))
|
|
|
|
if (!CheckInputs(tx, state, view, true, STANDARD_SCRIPT_VERIFY_FLAGS, true))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return error("AcceptToMemoryPool: : ConnectInputs failed %s", hash.ToString());
|
|
|
|
return error("AcceptToMemoryPool: ConnectInputs failed %s", hash.ToString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Store transaction in memory
|
|
|
|
// Store transaction in memory
|
|
|
|
pool.addUnchecked(hash, entry);
|
|
|
|
pool.addUnchecked(hash, entry);
|
|
|
@ -2988,7 +2988,7 @@ bool InitBlockIndex() {
|
|
|
|
return error("LoadBlockIndex() : genesis block not accepted");
|
|
|
|
return error("LoadBlockIndex() : genesis block not accepted");
|
|
|
|
if (!ActivateBestChain(state, &block))
|
|
|
|
if (!ActivateBestChain(state, &block))
|
|
|
|
return error("LoadBlockIndex() : genesis block cannot be activated");
|
|
|
|
return error("LoadBlockIndex() : genesis block cannot be activated");
|
|
|
|
// Force a chainstate write so that when we VerifyDB in a moment, it doesnt check stale data
|
|
|
|
// Force a chainstate write so that when we VerifyDB in a moment, it doesn't check stale data
|
|
|
|
return FlushStateToDisk(state, FLUSH_STATE_ALWAYS);
|
|
|
|
return FlushStateToDisk(state, FLUSH_STATE_ALWAYS);
|
|
|
|
} catch(std::runtime_error &e) {
|
|
|
|
} catch(std::runtime_error &e) {
|
|
|
|
return error("LoadBlockIndex() : failed to initialize block database: %s", e.what());
|
|
|
|
return error("LoadBlockIndex() : failed to initialize block database: %s", e.what());
|
|
|
|