|
|
@ -236,14 +236,19 @@ bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Block size and sigops have already been tested. Check that all transactions
|
|
|
|
// Perform transaction-level checks before adding to block:
|
|
|
|
// are final.
|
|
|
|
// - transaction finality (locktime)
|
|
|
|
bool BlockAssembler::TestPackageFinalityAndSerializedSize(const CTxMemPool::setEntries& package) |
|
|
|
// - premature witness (in case segwit transactions are added to mempool before
|
|
|
|
|
|
|
|
// segwit activation)
|
|
|
|
|
|
|
|
// - serialized size (in case -blockmaxsize is in use)
|
|
|
|
|
|
|
|
bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& package) |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint64_t nPotentialBlockSize = nBlockSize; // only used with fNeedSizeAccounting
|
|
|
|
uint64_t nPotentialBlockSize = nBlockSize; // only used with fNeedSizeAccounting
|
|
|
|
BOOST_FOREACH (const CTxMemPool::txiter it, package) { |
|
|
|
BOOST_FOREACH (const CTxMemPool::txiter it, package) { |
|
|
|
if (!IsFinalTx(it->GetTx(), nHeight, nLockTimeCutoff)) |
|
|
|
if (!IsFinalTx(it->GetTx(), nHeight, nLockTimeCutoff)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
if (!fIncludeWitness && !it->GetTx().wit.IsNull()) |
|
|
|
|
|
|
|
return false; |
|
|
|
if (fNeedSizeAccounting) { |
|
|
|
if (fNeedSizeAccounting) { |
|
|
|
uint64_t nTxSize = ::GetSerializeSize(it->GetTx(), SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
uint64_t nTxSize = ::GetSerializeSize(it->GetTx(), SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
if (nPotentialBlockSize + nTxSize >= nBlockMaxSize) { |
|
|
|
if (nPotentialBlockSize + nTxSize >= nBlockMaxSize) { |
|
|
@ -542,7 +547,7 @@ void BlockAssembler::addPackageTxs() |
|
|
|
ancestors.insert(iter); |
|
|
|
ancestors.insert(iter); |
|
|
|
|
|
|
|
|
|
|
|
// Test if all tx's are Final
|
|
|
|
// Test if all tx's are Final
|
|
|
|
if (!TestPackageFinalityAndSerializedSize(ancestors)) { |
|
|
|
if (!TestPackageTransactions(ancestors)) { |
|
|
|
if (fUsingModified) { |
|
|
|
if (fUsingModified) { |
|
|
|
mapModifiedTx.get<ancestor_score>().erase(modit); |
|
|
|
mapModifiedTx.get<ancestor_score>().erase(modit); |
|
|
|
failedTx.insert(iter); |
|
|
|
failedTx.insert(iter); |
|
|
|