@@ -740,17 +740,14 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state) | |||
return true; | |||
} | |||
CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowFree) | |||
CAmount GetMinRelayFee(const CTransaction& tx, const CTxMemPool& pool, unsigned int nBytes, bool fAllowFree) | |||
{ | |||
{ | |||
LOCK(mempool.cs); | |||
uint256 hash = tx.GetHash(); | |||
double dPriorityDelta = 0; | |||
CAmount nFeeDelta = 0; | |||
mempool.ApplyDeltas(hash, dPriorityDelta, nFeeDelta); | |||
if (dPriorityDelta > 0 || nFeeDelta > 0) | |||
return 0; | |||
} | |||
uint256 hash = tx.GetHash(); | |||
double dPriorityDelta = 0; | |||
CAmount nFeeDelta = 0; | |||
pool.ApplyDeltas(hash, dPriorityDelta, nFeeDelta); | |||
if (dPriorityDelta > 0 || nFeeDelta > 0) | |||
return 0; | |||
CAmount nMinFee = ::minRelayTxFee.GetFee(nBytes); | |||
@@ -879,11 +876,11 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa | |||
CAmount nFees = nValueIn-nValueOut; | |||
double dPriority = view.GetPriority(tx, chainActive.Height()); | |||
CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx)); | |||
CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), pool.HasNoInputsOf(tx)); | |||
unsigned int nSize = entry.GetTxSize(); | |||
// Don't accept it if it can't get into a block | |||
CAmount txMinFee = GetMinRelayFee(tx, nSize, true); | |||
CAmount txMinFee = GetMinRelayFee(tx, pool, nSize, true); | |||
if (fLimitFree && nFees < txMinFee) | |||
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "insufficient fee", false, | |||
strprintf("%d < %d", nFees, txMinFee)); |
@@ -735,10 +735,10 @@ void CTxMemPool::PrioritiseTransaction(const uint256 hash, const string strHash, | |||
LogPrintf("PrioritiseTransaction: %s priority += %f, fee += %d\n", strHash, dPriorityDelta, FormatMoney(nFeeDelta)); | |||
} | |||
void CTxMemPool::ApplyDeltas(const uint256 hash, double &dPriorityDelta, CAmount &nFeeDelta) | |||
void CTxMemPool::ApplyDeltas(const uint256 hash, double &dPriorityDelta, CAmount &nFeeDelta) const | |||
{ | |||
LOCK(cs); | |||
std::map<uint256, std::pair<double, CAmount> >::iterator pos = mapDeltas.find(hash); | |||
std::map<uint256, std::pair<double, CAmount> >::const_iterator pos = mapDeltas.find(hash); | |||
if (pos == mapDeltas.end()) | |||
return; | |||
const std::pair<double, CAmount> &deltas = pos->second; |
@@ -83,7 +83,7 @@ public: | |||
const CTransaction& GetTx() const { return this->tx; } | |||
double GetPriority(unsigned int currentHeight) const; | |||
CAmount GetFee() const { return nFee; } | |||
const CAmount& GetFee() const { return nFee; } | |||
size_t GetTxSize() const { return nTxSize; } | |||
int64_t GetTime() const { return nTime; } | |||
unsigned int GetHeight() const { return nHeight; } | |||
@@ -371,7 +371,7 @@ public: | |||
/** Affect CreateNewBlock prioritisation of transactions */ | |||
void PrioritiseTransaction(const uint256 hash, const std::string strHash, double dPriorityDelta, const CAmount& nFeeDelta); | |||
void ApplyDeltas(const uint256 hash, double &dPriorityDelta, CAmount &nFeeDelta); | |||
void ApplyDeltas(const uint256 hash, double &dPriorityDelta, CAmount &nFeeDelta) const; | |||
void ClearPrioritisation(const uint256 hash); | |||
public: |