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:
parent
1922e5a654
commit
f15c2cde45
2 changed files with 16 additions and 11 deletions
|
@ -94,6 +94,7 @@ BlockAssembler::BlockAssembler(const CChainParams& _chainparams)
|
|||
nBlockMaxCost = nBlockMaxSize * WITNESS_SCALE_FACTOR;
|
||||
}
|
||||
}
|
||||
|
||||
// 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));
|
||||
// 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());
|
||||
|
||||
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;
|
||||
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
|
||||
// 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) {
|
||||
if (!IsFinalTx(it->GetTx(), nHeight, nLockTimeCutoff))
|
||||
return false;
|
||||
if (fNeedSizeAccounting) {
|
||||
uint64_t nTxSize = ::GetSerializeSize(it->GetTx(), SER_NETWORK, PROTOCOL_VERSION);
|
||||
if (nPotentialBlockSize + nTxSize >= nBlockMaxSize) {
|
||||
return false;
|
||||
}
|
||||
nPotentialBlockSize += nTxSize;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -539,7 +542,7 @@ void BlockAssembler::addPackageTxs()
|
|||
ancestors.insert(iter);
|
||||
|
||||
// Test if all tx's are Final
|
||||
if (!TestPackageFinality(ancestors)) {
|
||||
if (!TestPackageFinalityAndSerializedSize(ancestors)) {
|
||||
if (fUsingModified) {
|
||||
mapModifiedTx.get<ancestor_score>().erase(modit);
|
||||
failedTx.insert(iter);
|
||||
|
@ -573,6 +576,7 @@ void BlockAssembler::addPriorityTxs()
|
|||
return;
|
||||
}
|
||||
|
||||
bool fSizeAccounting = fNeedSizeAccounting;
|
||||
fNeedSizeAccounting = true;
|
||||
|
||||
// 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
|
||||
// or have dropped below the AllowFreeThreshold, then we're done adding priority txs
|
||||
if (nBlockSize >= nBlockPrioritySize || !AllowFree(actualPriority)) {
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
// 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)
|
||||
|
|
|
@ -193,7 +193,7 @@ private:
|
|||
/** Test if a new package would "fit" in the block */
|
||||
bool TestPackage(uint64_t packageSize, int64_t packageSigOpsCost);
|
||||
/** 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,
|
||||
* or if the transaction's cached data in mapTx is incorrect. */
|
||||
bool SkipMapTxEntry(CTxMemPool::txiter it, indexed_modified_transaction_set &mapModifiedTx, CTxMemPool::setEntries &failedTx);
|
||||
|
|
Loading…
Reference in a new issue