mirror of
https://github.com/kvazar-network/kevacoin.git
synced 2025-01-19 03:20:37 +00:00
Merge #11100: Fix confusing blockmax{size,weight} options, dont default to throwing away money
6f703e9bf Add release notes describing blockmaxweight deprecation (Matt Corallo) 3dc263c9b Use a sensible default for blockmaxweight (Matt Corallo) ba206d2c6 Deprecate confusing blockmaxsize, fix getmininginfo output (Matt Corallo) Pull request description: No sensible user will ever keep the default settings here, so not having sensible defaults only serves to screw users who are paying less attention, which makes for terrible defaults. Additionally, support for block-size-limiting directly has been removed: * This removes block-size-limiting code in favor of GBT clients doing the limiting themselves (if at all). * -blockmaxsize is deprecated and only used to calculate an implied blockmaxweight, addressing confusion from multiple users. * getmininginfo's currentblocksize return value was returning garbage values, and has been removed, also removing a GetSerializeSize call in some block generation inner loops and potentially addressing some performance edge cases. Tree-SHA512: 33010540faf5d6225ad575488b804e180a8d53a41be484ca2932a0485595e28da62f0ade4b279a6bf1c947c7ce389f51fde8651b2ba25deb25e766e0813b993c
This commit is contained in:
commit
1afc22a766
@ -56,6 +56,22 @@ frequently tested on them.
|
|||||||
Notable changes
|
Notable changes
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
Miner block size limiting deprecated
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
Though blockmaxweight has been preferred for limiting the size of blocks returned by
|
||||||
|
getblocktemplate since 0.13.0, blockmaxsize remained as an option for those who wished
|
||||||
|
to limit their block size directly. Using this option resulted in a few UI issues as
|
||||||
|
well as non-optimal fee selection and ever-so-slightly worse performance, and has thus
|
||||||
|
now been deprecated. Further, the blockmaxsize option is now used only to calculate an
|
||||||
|
implied blockmaxweight, instead of limiting block size directly. Any miners who wish
|
||||||
|
to limit their blocks by size, instead of by weight, will have to do so manually by
|
||||||
|
removing transactions from their block template directly.
|
||||||
|
|
||||||
|
Low-level RPC changes
|
||||||
|
----------------------
|
||||||
|
- The "currentblocksize" value in getmininginfo has been removed.
|
||||||
|
|
||||||
Credits
|
Credits
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
11
src/init.cpp
11
src/init.cpp
@ -484,7 +484,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
|||||||
|
|
||||||
strUsage += HelpMessageGroup(_("Block creation options:"));
|
strUsage += HelpMessageGroup(_("Block creation options:"));
|
||||||
strUsage += HelpMessageOpt("-blockmaxweight=<n>", strprintf(_("Set maximum BIP141 block weight (default: %d)"), DEFAULT_BLOCK_MAX_WEIGHT));
|
strUsage += HelpMessageOpt("-blockmaxweight=<n>", strprintf(_("Set maximum BIP141 block weight (default: %d)"), DEFAULT_BLOCK_MAX_WEIGHT));
|
||||||
strUsage += HelpMessageOpt("-blockmaxsize=<n>", strprintf(_("Set maximum block size in bytes (default: %d)"), DEFAULT_BLOCK_MAX_SIZE));
|
strUsage += HelpMessageOpt("-blockmaxsize=<n>", _("Set maximum BIP141 block weight to this * 4. Deprecated, use blockmaxweight"));
|
||||||
strUsage += HelpMessageOpt("-blockmintxfee=<amt>", strprintf(_("Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s)"), CURRENCY_UNIT, FormatMoney(DEFAULT_BLOCK_MIN_TX_FEE)));
|
strUsage += HelpMessageOpt("-blockmintxfee=<amt>", strprintf(_("Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s)"), CURRENCY_UNIT, FormatMoney(DEFAULT_BLOCK_MIN_TX_FEE)));
|
||||||
if (showDebug)
|
if (showDebug)
|
||||||
strUsage += HelpMessageOpt("-blockversion=<n>", "Override block version to test forking scenarios");
|
strUsage += HelpMessageOpt("-blockversion=<n>", "Override block version to test forking scenarios");
|
||||||
@ -785,6 +785,15 @@ void InitParameterInteraction()
|
|||||||
if (gArgs.SoftSetBoolArg("-whitelistrelay", true))
|
if (gArgs.SoftSetBoolArg("-whitelistrelay", true))
|
||||||
LogPrintf("%s: parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1\n", __func__);
|
LogPrintf("%s: parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1\n", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gArgs.IsArgSet("-blockmaxsize")) {
|
||||||
|
unsigned int max_size = gArgs.GetArg("-blockmaxsize", 0);
|
||||||
|
if (gArgs.SoftSetArg("blockmaxweight", strprintf("%d", max_size * WITNESS_SCALE_FACTOR))) {
|
||||||
|
LogPrintf("%s: parameter interaction: -blockmaxsize=%d -> setting -blockmaxweight=%d (-blockmaxsize is deprecated!)\n", __func__, max_size, max_size * WITNESS_SCALE_FACTOR);
|
||||||
|
} else {
|
||||||
|
LogPrintf("%s: Ignoring blockmaxsize setting which is overridden by blockmaxweight", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string ResolveErrMsg(const char * const optname, const std::string& strBind)
|
static std::string ResolveErrMsg(const char * const optname, const std::string& strBind)
|
||||||
|
@ -43,7 +43,6 @@
|
|||||||
// its ancestors.
|
// its ancestors.
|
||||||
|
|
||||||
uint64_t nLastBlockTx = 0;
|
uint64_t nLastBlockTx = 0;
|
||||||
uint64_t nLastBlockSize = 0;
|
|
||||||
uint64_t nLastBlockWeight = 0;
|
uint64_t nLastBlockWeight = 0;
|
||||||
|
|
||||||
int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
|
int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
|
||||||
@ -64,7 +63,6 @@ int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParam
|
|||||||
BlockAssembler::Options::Options() {
|
BlockAssembler::Options::Options() {
|
||||||
blockMinFeeRate = CFeeRate(DEFAULT_BLOCK_MIN_TX_FEE);
|
blockMinFeeRate = CFeeRate(DEFAULT_BLOCK_MIN_TX_FEE);
|
||||||
nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
|
nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
|
||||||
nBlockMaxSize = DEFAULT_BLOCK_MAX_SIZE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockAssembler::BlockAssembler(const CChainParams& params, const Options& options) : chainparams(params)
|
BlockAssembler::BlockAssembler(const CChainParams& params, const Options& options) : chainparams(params)
|
||||||
@ -72,10 +70,6 @@ BlockAssembler::BlockAssembler(const CChainParams& params, const Options& option
|
|||||||
blockMinFeeRate = options.blockMinFeeRate;
|
blockMinFeeRate = options.blockMinFeeRate;
|
||||||
// Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity:
|
// Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity:
|
||||||
nBlockMaxWeight = std::max<size_t>(4000, std::min<size_t>(MAX_BLOCK_WEIGHT - 4000, options.nBlockMaxWeight));
|
nBlockMaxWeight = std::max<size_t>(4000, std::min<size_t>(MAX_BLOCK_WEIGHT - 4000, options.nBlockMaxWeight));
|
||||||
// Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity:
|
|
||||||
nBlockMaxSize = std::max<size_t>(1000, std::min<size_t>(MAX_BLOCK_SERIALIZED_SIZE - 1000, options.nBlockMaxSize));
|
|
||||||
// Whether we need to account for byte usage (in addition to weight usage)
|
|
||||||
fNeedSizeAccounting = (nBlockMaxSize < MAX_BLOCK_SERIALIZED_SIZE - 1000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static BlockAssembler::Options DefaultOptions(const CChainParams& params)
|
static BlockAssembler::Options DefaultOptions(const CChainParams& params)
|
||||||
@ -85,20 +79,7 @@ static BlockAssembler::Options DefaultOptions(const CChainParams& params)
|
|||||||
// If only one is given, only restrict the specified resource.
|
// If only one is given, only restrict the specified resource.
|
||||||
// If both are given, restrict both.
|
// If both are given, restrict both.
|
||||||
BlockAssembler::Options options;
|
BlockAssembler::Options options;
|
||||||
options.nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
|
|
||||||
options.nBlockMaxSize = DEFAULT_BLOCK_MAX_SIZE;
|
|
||||||
bool fWeightSet = false;
|
|
||||||
if (gArgs.IsArgSet("-blockmaxweight")) {
|
|
||||||
options.nBlockMaxWeight = gArgs.GetArg("-blockmaxweight", DEFAULT_BLOCK_MAX_WEIGHT);
|
options.nBlockMaxWeight = gArgs.GetArg("-blockmaxweight", DEFAULT_BLOCK_MAX_WEIGHT);
|
||||||
options.nBlockMaxSize = MAX_BLOCK_SERIALIZED_SIZE;
|
|
||||||
fWeightSet = true;
|
|
||||||
}
|
|
||||||
if (gArgs.IsArgSet("-blockmaxsize")) {
|
|
||||||
options.nBlockMaxSize = gArgs.GetArg("-blockmaxsize", DEFAULT_BLOCK_MAX_SIZE);
|
|
||||||
if (!fWeightSet) {
|
|
||||||
options.nBlockMaxWeight = options.nBlockMaxSize * WITNESS_SCALE_FACTOR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (gArgs.IsArgSet("-blockmintxfee")) {
|
if (gArgs.IsArgSet("-blockmintxfee")) {
|
||||||
CAmount n = 0;
|
CAmount n = 0;
|
||||||
ParseMoney(gArgs.GetArg("-blockmintxfee", ""), n);
|
ParseMoney(gArgs.GetArg("-blockmintxfee", ""), n);
|
||||||
@ -116,7 +97,6 @@ void BlockAssembler::resetBlock()
|
|||||||
inBlock.clear();
|
inBlock.clear();
|
||||||
|
|
||||||
// Reserve space for coinbase tx
|
// Reserve space for coinbase tx
|
||||||
nBlockSize = 1000;
|
|
||||||
nBlockWeight = 4000;
|
nBlockWeight = 4000;
|
||||||
nBlockSigOpsCost = 400;
|
nBlockSigOpsCost = 400;
|
||||||
fIncludeWitness = false;
|
fIncludeWitness = false;
|
||||||
@ -176,7 +156,6 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
|
|||||||
int64_t nTime1 = GetTimeMicros();
|
int64_t nTime1 = GetTimeMicros();
|
||||||
|
|
||||||
nLastBlockTx = nBlockTx;
|
nLastBlockTx = nBlockTx;
|
||||||
nLastBlockSize = nBlockSize;
|
|
||||||
nLastBlockWeight = nBlockWeight;
|
nLastBlockWeight = nBlockWeight;
|
||||||
|
|
||||||
// Create coinbase transaction.
|
// Create coinbase transaction.
|
||||||
@ -191,8 +170,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
|
|||||||
pblocktemplate->vchCoinbaseCommitment = GenerateCoinbaseCommitment(*pblock, pindexPrev, chainparams.GetConsensus());
|
pblocktemplate->vchCoinbaseCommitment = GenerateCoinbaseCommitment(*pblock, pindexPrev, chainparams.GetConsensus());
|
||||||
pblocktemplate->vTxFees[0] = -nFees;
|
pblocktemplate->vTxFees[0] = -nFees;
|
||||||
|
|
||||||
uint64_t nSerializeSize = GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION);
|
LogPrintf("CreateNewBlock(): block weight: %u txs: %u fees: %ld sigops %d\n", GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);
|
||||||
LogPrintf("CreateNewBlock(): total size: %u block weight: %u txs: %u fees: %ld sigops %d\n", nSerializeSize, GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);
|
|
||||||
|
|
||||||
// Fill in header
|
// Fill in header
|
||||||
pblock->hashPrevBlock = pindexPrev->GetBlockHash();
|
pblock->hashPrevBlock = pindexPrev->GetBlockHash();
|
||||||
@ -239,22 +217,13 @@ bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost
|
|||||||
// - transaction finality (locktime)
|
// - transaction finality (locktime)
|
||||||
// - premature witness (in case segwit transactions are added to mempool before
|
// - premature witness (in case segwit transactions are added to mempool before
|
||||||
// segwit activation)
|
// segwit activation)
|
||||||
// - serialized size (in case -blockmaxsize is in use)
|
|
||||||
bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& package)
|
bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& package)
|
||||||
{
|
{
|
||||||
uint64_t nPotentialBlockSize = nBlockSize; // only used with fNeedSizeAccounting
|
|
||||||
for (const CTxMemPool::txiter it : package) {
|
for (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().HasWitness())
|
if (!fIncludeWitness && it->GetTx().HasWitness())
|
||||||
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;
|
||||||
}
|
}
|
||||||
@ -264,9 +233,6 @@ void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
|
|||||||
pblock->vtx.emplace_back(iter->GetSharedTx());
|
pblock->vtx.emplace_back(iter->GetSharedTx());
|
||||||
pblocktemplate->vTxFees.push_back(iter->GetFee());
|
pblocktemplate->vTxFees.push_back(iter->GetFee());
|
||||||
pblocktemplate->vTxSigOpsCost.push_back(iter->GetSigOpCost());
|
pblocktemplate->vTxSigOpsCost.push_back(iter->GetSigOpCost());
|
||||||
if (fNeedSizeAccounting) {
|
|
||||||
nBlockSize += ::GetSerializeSize(iter->GetTx(), SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
}
|
|
||||||
nBlockWeight += iter->GetTxWeight();
|
nBlockWeight += iter->GetTxWeight();
|
||||||
++nBlockTx;
|
++nBlockTx;
|
||||||
nBlockSigOpsCost += iter->GetSigOpCost();
|
nBlockSigOpsCost += iter->GetSigOpCost();
|
||||||
|
@ -139,13 +139,11 @@ private:
|
|||||||
|
|
||||||
// Configuration parameters for the block size
|
// Configuration parameters for the block size
|
||||||
bool fIncludeWitness;
|
bool fIncludeWitness;
|
||||||
unsigned int nBlockMaxWeight, nBlockMaxSize;
|
unsigned int nBlockMaxWeight;
|
||||||
bool fNeedSizeAccounting;
|
|
||||||
CFeeRate blockMinFeeRate;
|
CFeeRate blockMinFeeRate;
|
||||||
|
|
||||||
// Information on the current status of the block
|
// Information on the current status of the block
|
||||||
uint64_t nBlockWeight;
|
uint64_t nBlockWeight;
|
||||||
uint64_t nBlockSize;
|
|
||||||
uint64_t nBlockTx;
|
uint64_t nBlockTx;
|
||||||
uint64_t nBlockSigOpsCost;
|
uint64_t nBlockSigOpsCost;
|
||||||
CAmount nFees;
|
CAmount nFees;
|
||||||
|
@ -16,10 +16,8 @@
|
|||||||
class CCoinsViewCache;
|
class CCoinsViewCache;
|
||||||
class CTxOut;
|
class CTxOut;
|
||||||
|
|
||||||
/** Default for -blockmaxsize, which controls the maximum size of block the mining code will create **/
|
|
||||||
static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000;
|
|
||||||
/** Default for -blockmaxweight, which controls the range of block weights the mining code will create **/
|
/** Default for -blockmaxweight, which controls the range of block weights the mining code will create **/
|
||||||
static const unsigned int DEFAULT_BLOCK_MAX_WEIGHT = 3000000;
|
static const unsigned int DEFAULT_BLOCK_MAX_WEIGHT = MAX_BLOCK_WEIGHT - 4000;
|
||||||
/** Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by mining code **/
|
/** Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by mining code **/
|
||||||
static const unsigned int DEFAULT_BLOCK_MIN_TX_FEE = 1000;
|
static const unsigned int DEFAULT_BLOCK_MIN_TX_FEE = 1000;
|
||||||
/** The maximum weight for transactions we're willing to relay/mine */
|
/** The maximum weight for transactions we're willing to relay/mine */
|
||||||
|
@ -196,7 +196,6 @@ UniValue getmininginfo(const JSONRPCRequest& request)
|
|||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" \"blocks\": nnn, (numeric) The current block\n"
|
" \"blocks\": nnn, (numeric) The current block\n"
|
||||||
" \"currentblocksize\": nnn, (numeric) The last block size\n"
|
|
||||||
" \"currentblockweight\": nnn, (numeric) The last block weight\n"
|
" \"currentblockweight\": nnn, (numeric) The last block weight\n"
|
||||||
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
||||||
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
||||||
@ -215,7 +214,6 @@ UniValue getmininginfo(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
obj.push_back(Pair("blocks", (int)chainActive.Height()));
|
obj.push_back(Pair("blocks", (int)chainActive.Height()));
|
||||||
obj.push_back(Pair("currentblocksize", (uint64_t)nLastBlockSize));
|
|
||||||
obj.push_back(Pair("currentblockweight", (uint64_t)nLastBlockWeight));
|
obj.push_back(Pair("currentblockweight", (uint64_t)nLastBlockWeight));
|
||||||
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
|
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
|
||||||
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
||||||
|
@ -161,7 +161,6 @@ extern CTxMemPool mempool;
|
|||||||
typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
|
typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
|
||||||
extern BlockMap mapBlockIndex;
|
extern BlockMap mapBlockIndex;
|
||||||
extern uint64_t nLastBlockTx;
|
extern uint64_t nLastBlockTx;
|
||||||
extern uint64_t nLastBlockSize;
|
|
||||||
extern uint64_t nLastBlockWeight;
|
extern uint64_t nLastBlockWeight;
|
||||||
extern const std::string strMessageMagic;
|
extern const std::string strMessageMagic;
|
||||||
extern CWaitableCriticalSection csBestBlock;
|
extern CWaitableCriticalSection csBestBlock;
|
||||||
|
@ -38,7 +38,6 @@ class MiningTest(BitcoinTestFramework):
|
|||||||
mining_info = node.getmininginfo()
|
mining_info = node.getmininginfo()
|
||||||
assert_equal(mining_info['blocks'], 200)
|
assert_equal(mining_info['blocks'], 200)
|
||||||
assert_equal(mining_info['chain'], 'regtest')
|
assert_equal(mining_info['chain'], 'regtest')
|
||||||
assert_equal(mining_info['currentblocksize'], 0)
|
|
||||||
assert_equal(mining_info['currentblocktx'], 0)
|
assert_equal(mining_info['currentblocktx'], 0)
|
||||||
assert_equal(mining_info['currentblockweight'], 0)
|
assert_equal(mining_info['currentblockweight'], 0)
|
||||||
assert_equal(mining_info['difficulty'], Decimal('4.656542373906925E-10'))
|
assert_equal(mining_info['difficulty'], Decimal('4.656542373906925E-10'))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user