|
|
@ -599,12 +599,11 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int64_t GetMinFee(const CTransaction& tx, bool fAllowFree, enum GetMinFee_mode mode) |
|
|
|
int64_t GetMinFee(const CTransaction& tx, unsigned int nBytes, bool fAllowFree, enum GetMinFee_mode mode) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Base fee is either nMinTxFee or nMinRelayTxFee
|
|
|
|
// Base fee is either nMinTxFee or nMinRelayTxFee
|
|
|
|
int64_t nBaseFee = (mode == GMF_RELAY) ? tx.nMinRelayTxFee : tx.nMinTxFee; |
|
|
|
int64_t nBaseFee = (mode == GMF_RELAY) ? tx.nMinRelayTxFee : tx.nMinTxFee; |
|
|
|
|
|
|
|
|
|
|
|
unsigned int nBytes = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
|
|
|
int64_t nMinFee = (1 + (int64_t)nBytes / 1000) * nBaseFee; |
|
|
|
int64_t nMinFee = (1 + (int64_t)nBytes / 1000) * nBaseFee; |
|
|
|
|
|
|
|
|
|
|
|
if (fAllowFree) |
|
|
|
if (fAllowFree) |
|
|
@ -740,7 +739,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa |
|
|
|
unsigned int nSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
unsigned int nSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
|
|
|
|
|
|
|
// Don't accept it if it can't get into a block
|
|
|
|
// Don't accept it if it can't get into a block
|
|
|
|
int64_t txMinFee = GetMinFee(tx, true, GMF_RELAY); |
|
|
|
int64_t txMinFee = GetMinFee(tx, nSize, true, GMF_RELAY); |
|
|
|
if (fLimitFree && nFees < txMinFee) |
|
|
|
if (fLimitFree && nFees < txMinFee) |
|
|
|
return state.DoS(0, error("AcceptToMemoryPool : not enough fees %s, %"PRId64" < %"PRId64, |
|
|
|
return state.DoS(0, error("AcceptToMemoryPool : not enough fees %s, %"PRId64" < %"PRId64, |
|
|
|
hash.ToString().c_str(), nFees, txMinFee), |
|
|
|
hash.ToString().c_str(), nFees, txMinFee), |
|
|
|