CreateNewBlock: add support for size-accounting to addPackageTxs

Includes a change to not continue to use size-accounting in addScoreTxs
or addPackageTxs just because addPriorityTxs() is used.
This commit is contained in:
Suhas Daftuar 2016-06-27 10:58:58 -04:00
parent 1922e5a654
commit f15c2cde45
2 changed files with 16 additions and 11 deletions

View file

@ -94,6 +94,7 @@ BlockAssembler::BlockAssembler(const CChainParams& _chainparams)
nBlockMaxCost = nBlockMaxSize * WITNESS_SCALE_FACTOR; nBlockMaxCost = nBlockMaxSize * WITNESS_SCALE_FACTOR;
} }
} }
// Limit cost to between 4K and MAX_BLOCK_COST-4K for sanity: // Limit cost to between 4K and MAX_BLOCK_COST-4K for sanity:
nBlockMaxCost = std::max((unsigned int)4000, std::min((unsigned int)(MAX_BLOCK_COST-4000), nBlockMaxCost)); nBlockMaxCost = std::max((unsigned int)4000, std::min((unsigned int)(MAX_BLOCK_COST-4000), nBlockMaxCost));
// Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity: // Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity:
@ -167,13 +168,7 @@ CBlockTemplate* BlockAssembler::CreateNewBlock(const CScript& scriptPubKeyIn)
fIncludeWitness = IsWitnessEnabled(pindexPrev, chainparams.GetConsensus()); fIncludeWitness = IsWitnessEnabled(pindexPrev, chainparams.GetConsensus());
addPriorityTxs(); addPriorityTxs();
if (fNeedSizeAccounting) {
// addPackageTxs (the CPFP-based algorithm) cannot deal with size based
// accounting, so fall back to the old algorithm.
addScoreTxs();
} else {
addPackageTxs(); addPackageTxs();
}
nLastBlockTx = nBlockTx; nLastBlockTx = nBlockTx;
nLastBlockSize = nBlockSize; nLastBlockSize = nBlockSize;
@ -243,11 +238,19 @@ bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost
// Block size and sigops have already been tested. Check that all transactions // Block size and sigops have already been tested. Check that all transactions
// are final. // are final.
bool BlockAssembler::TestPackageFinality(const CTxMemPool::setEntries& package) bool BlockAssembler::TestPackageFinalityAndSerializedSize(const CTxMemPool::setEntries& package)
{ {
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 (fNeedSizeAccounting) {
uint64_t nTxSize = ::GetSerializeSize(it->GetTx(), SER_NETWORK, PROTOCOL_VERSION);
if (nPotentialBlockSize + nTxSize >= nBlockMaxSize) {
return false;
}
nPotentialBlockSize += nTxSize;
}
} }
return true; return true;
} }
@ -539,7 +542,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 (!TestPackageFinality(ancestors)) { if (!TestPackageFinalityAndSerializedSize(ancestors)) {
if (fUsingModified) { if (fUsingModified) {
mapModifiedTx.get<ancestor_score>().erase(modit); mapModifiedTx.get<ancestor_score>().erase(modit);
failedTx.insert(iter); failedTx.insert(iter);
@ -573,6 +576,7 @@ void BlockAssembler::addPriorityTxs()
return; return;
} }
bool fSizeAccounting = fNeedSizeAccounting;
fNeedSizeAccounting = true; fNeedSizeAccounting = true;
// This vector will be sorted into a priority queue: // This vector will be sorted into a priority queue:
@ -624,7 +628,7 @@ void BlockAssembler::addPriorityTxs()
// If now that this txs is added we've surpassed our desired priority size // If now that this txs is added we've surpassed our desired priority size
// or have dropped below the AllowFreeThreshold, then we're done adding priority txs // or have dropped below the AllowFreeThreshold, then we're done adding priority txs
if (nBlockSize >= nBlockPrioritySize || !AllowFree(actualPriority)) { if (nBlockSize >= nBlockPrioritySize || !AllowFree(actualPriority)) {
return; break;
} }
// This tx was successfully added, so // This tx was successfully added, so
@ -640,6 +644,7 @@ void BlockAssembler::addPriorityTxs()
} }
} }
} }
fNeedSizeAccounting = fSizeAccounting;
} }
void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned int& nExtraNonce) void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned int& nExtraNonce)

View file

@ -193,7 +193,7 @@ private:
/** Test if a new package would "fit" in the block */ /** Test if a new package would "fit" in the block */
bool TestPackage(uint64_t packageSize, int64_t packageSigOpsCost); bool TestPackage(uint64_t packageSize, int64_t packageSigOpsCost);
/** Test if a set of transactions are all final */ /** Test if a set of transactions are all final */
bool TestPackageFinality(const CTxMemPool::setEntries& package); bool TestPackageFinalityAndSerializedSize(const CTxMemPool::setEntries& package);
/** Return true if given transaction from mapTx has already been evaluated, /** Return true if given transaction from mapTx has already been evaluated,
* or if the transaction's cached data in mapTx is incorrect. */ * or if the transaction's cached data in mapTx is incorrect. */
bool SkipMapTxEntry(CTxMemPool::txiter it, indexed_modified_transaction_set &mapModifiedTx, CTxMemPool::setEntries &failedTx); bool SkipMapTxEntry(CTxMemPool::txiter it, indexed_modified_transaction_set &mapModifiedTx, CTxMemPool::setEntries &failedTx);