mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 12:23:34 -05:00
miner: bugfix: fix duplicate weight reservation in block assembler
- This commit renamed coinbase_max_additional_weight to block_reserved_weight. - Also clarify that the reservation is for block header, transaction count and coinbase transaction.
This commit is contained in:
parent
5acf12bafe
commit
2c7d90a6d6
8 changed files with 23 additions and 17 deletions
|
@ -19,6 +19,7 @@
|
||||||
#include <common/args.h>
|
#include <common/args.h>
|
||||||
#include <common/system.h>
|
#include <common/system.h>
|
||||||
#include <consensus/amount.h>
|
#include <consensus/amount.h>
|
||||||
|
#include <consensus/consensus.h>
|
||||||
#include <deploymentstatus.h>
|
#include <deploymentstatus.h>
|
||||||
#include <hash.h>
|
#include <hash.h>
|
||||||
#include <httprpc.h>
|
#include <httprpc.h>
|
||||||
|
|
|
@ -35,7 +35,7 @@ interface BlockTemplate $Proxy.wrap("interfaces::BlockTemplate") {
|
||||||
|
|
||||||
struct BlockCreateOptions $Proxy.wrap("node::BlockCreateOptions") {
|
struct BlockCreateOptions $Proxy.wrap("node::BlockCreateOptions") {
|
||||||
useMempool @0 :Bool $Proxy.name("use_mempool");
|
useMempool @0 :Bool $Proxy.name("use_mempool");
|
||||||
coinbaseMaxAdditionalWeight @1 :UInt64 $Proxy.name("coinbase_max_additional_weight");
|
blockReservedWeight @1 :UInt64 $Proxy.name("block_reserved_weight");
|
||||||
coinbaseOutputMaxAdditionalSigops @2 :UInt64 $Proxy.name("coinbase_output_max_additional_sigops");
|
coinbaseOutputMaxAdditionalSigops @2 :UInt64 $Proxy.name("coinbase_output_max_additional_sigops");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,11 +67,11 @@ void RegenerateCommitments(CBlock& block, ChainstateManager& chainman)
|
||||||
|
|
||||||
static BlockAssembler::Options ClampOptions(BlockAssembler::Options options)
|
static BlockAssembler::Options ClampOptions(BlockAssembler::Options options)
|
||||||
{
|
{
|
||||||
Assert(options.coinbase_max_additional_weight <= DEFAULT_BLOCK_MAX_WEIGHT);
|
Assert(options.block_reserved_weight <= MAX_BLOCK_WEIGHT);
|
||||||
Assert(options.coinbase_output_max_additional_sigops <= MAX_BLOCK_SIGOPS_COST);
|
Assert(options.coinbase_output_max_additional_sigops <= MAX_BLOCK_SIGOPS_COST);
|
||||||
// Limit weight to between coinbase_max_additional_weight and DEFAULT_BLOCK_MAX_WEIGHT for sanity:
|
// Limit weight to between block_reserved_weight and MAX_BLOCK_WEIGHT for sanity:
|
||||||
// Coinbase (reserved) outputs can safely exceed -blockmaxweight, but the rest of the block template will be empty.
|
// block_reserved_weight can safely exceed -blockmaxweight, but the rest of the block template will be empty.
|
||||||
options.nBlockMaxWeight = std::clamp<size_t>(options.nBlockMaxWeight, options.coinbase_max_additional_weight, DEFAULT_BLOCK_MAX_WEIGHT);
|
options.nBlockMaxWeight = std::clamp<size_t>(options.nBlockMaxWeight, options.block_reserved_weight, MAX_BLOCK_WEIGHT);
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,8 +97,8 @@ void BlockAssembler::resetBlock()
|
||||||
{
|
{
|
||||||
inBlock.clear();
|
inBlock.clear();
|
||||||
|
|
||||||
// Reserve space for coinbase tx
|
// Reserve space for fixed-size block header, txs count, and coinbase tx.
|
||||||
nBlockWeight = m_options.coinbase_max_additional_weight;
|
nBlockWeight = m_options.block_reserved_weight;
|
||||||
nBlockSigOpsCost = m_options.coinbase_output_max_additional_sigops;
|
nBlockSigOpsCost = m_options.coinbase_output_max_additional_sigops;
|
||||||
|
|
||||||
// These counters do not include coinbase tx
|
// These counters do not include coinbase tx
|
||||||
|
@ -386,7 +386,7 @@ void BlockAssembler::addPackageTxs(int& nPackagesSelected, int& nDescendantsUpda
|
||||||
++nConsecutiveFailed;
|
++nConsecutiveFailed;
|
||||||
|
|
||||||
if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight >
|
if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight >
|
||||||
m_options.nBlockMaxWeight - m_options.coinbase_max_additional_weight) {
|
m_options.nBlockMaxWeight - m_options.block_reserved_weight) {
|
||||||
// Give up if we're close to full and haven't succeeded in a while
|
// Give up if we're close to full and haven't succeeded in a while
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#define BITCOIN_NODE_TYPES_H
|
#define BITCOIN_NODE_TYPES_H
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <policy/policy.h>
|
||||||
#include <script/script.h>
|
#include <script/script.h>
|
||||||
|
|
||||||
namespace node {
|
namespace node {
|
||||||
|
@ -34,11 +35,10 @@ struct BlockCreateOptions {
|
||||||
*/
|
*/
|
||||||
bool use_mempool{true};
|
bool use_mempool{true};
|
||||||
/**
|
/**
|
||||||
* The maximum additional weight which the pool will add to the coinbase
|
* The default reserved weight for the fixed-size block header,
|
||||||
* scriptSig, witness and outputs. This must include any additional
|
* transaction count and coinbase transaction.
|
||||||
* weight needed for larger CompactSize encoded lengths.
|
|
||||||
*/
|
*/
|
||||||
size_t coinbase_max_additional_weight{4000};
|
size_t block_reserved_weight{DEFAULT_BLOCK_RESERVED_WEIGHT};
|
||||||
/**
|
/**
|
||||||
* The maximum additional sigops which the pool will add in coinbase
|
* The maximum additional sigops which the pool will add in coinbase
|
||||||
* transaction outputs.
|
* transaction outputs.
|
||||||
|
|
|
@ -20,7 +20,8 @@ class CFeeRate;
|
||||||
class CScript;
|
class CScript;
|
||||||
|
|
||||||
/** 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 constexpr unsigned int DEFAULT_BLOCK_MAX_WEIGHT{MAX_BLOCK_WEIGHT - 4000};
|
static constexpr unsigned int DEFAULT_BLOCK_MAX_WEIGHT{MAX_BLOCK_WEIGHT};
|
||||||
|
static constexpr unsigned int DEFAULT_BLOCK_RESERVED_WEIGHT{8000};
|
||||||
/** 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 constexpr unsigned int DEFAULT_BLOCK_MIN_TX_FEE{1000};
|
static constexpr 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 */
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include <node/miner.h>
|
#include <node/miner.h>
|
||||||
#include <node/mini_miner.h>
|
#include <node/mini_miner.h>
|
||||||
|
#include <node/types.h>
|
||||||
#include <primitives/transaction.h>
|
#include <primitives/transaction.h>
|
||||||
#include <random.h>
|
#include <random.h>
|
||||||
#include <txmempool.h>
|
#include <txmempool.h>
|
||||||
|
@ -157,9 +158,10 @@ FUZZ_TARGET(mini_miner_selection, .init = initialize_miner)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop if pool reaches DEFAULT_BLOCK_MAX_WEIGHT because BlockAssembler will stop when the
|
const auto block_adjusted_max_weight = MAX_BLOCK_WEIGHT - DEFAULT_BLOCK_RESERVED_WEIGHT;
|
||||||
|
// Stop if pool reaches block_adjusted_max_weight because BlockAssembler will stop when the
|
||||||
// block template reaches that, but the MiniMiner will keep going.
|
// block template reaches that, but the MiniMiner will keep going.
|
||||||
if (pool.GetTotalTxSize() + GetVirtualTransactionSize(*tx) >= DEFAULT_BLOCK_MAX_WEIGHT) break;
|
if (pool.GetTotalTxSize() + GetVirtualTransactionSize(*tx) >= block_adjusted_max_weight) break;
|
||||||
TestMemPoolEntryHelper entry;
|
TestMemPoolEntryHelper entry;
|
||||||
const CAmount fee{ConsumeMoney(fuzzed_data_provider, /*max=*/MAX_MONEY/100000)};
|
const CAmount fee{ConsumeMoney(fuzzed_data_provider, /*max=*/MAX_MONEY/100000)};
|
||||||
assert(MoneyRange(fee));
|
assert(MoneyRange(fee));
|
||||||
|
@ -181,7 +183,7 @@ FUZZ_TARGET(mini_miner_selection, .init = initialize_miner)
|
||||||
|
|
||||||
node::BlockAssembler::Options miner_options;
|
node::BlockAssembler::Options miner_options;
|
||||||
miner_options.blockMinFeeRate = target_feerate;
|
miner_options.blockMinFeeRate = target_feerate;
|
||||||
miner_options.nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
|
miner_options.nBlockMaxWeight = MAX_BLOCK_WEIGHT;
|
||||||
miner_options.test_block_validity = false;
|
miner_options.test_block_validity = false;
|
||||||
miner_options.coinbase_output_script = CScript() << OP_0;
|
miner_options.coinbase_output_script = CScript() << OP_0;
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ from test_framework.messages import (
|
||||||
CBlock,
|
CBlock,
|
||||||
CBlockHeader,
|
CBlockHeader,
|
||||||
COIN,
|
COIN,
|
||||||
|
DEFAULT_BLOCK_RESERVED_WEIGHT,
|
||||||
ser_uint256,
|
ser_uint256,
|
||||||
)
|
)
|
||||||
from test_framework.p2p import P2PDataStore
|
from test_framework.p2p import P2PDataStore
|
||||||
|
@ -77,7 +78,7 @@ class MiningTest(BitcoinTestFramework):
|
||||||
mining_info = self.nodes[0].getmininginfo()
|
mining_info = self.nodes[0].getmininginfo()
|
||||||
assert_equal(mining_info['blocks'], 200)
|
assert_equal(mining_info['blocks'], 200)
|
||||||
assert_equal(mining_info['currentblocktx'], 0)
|
assert_equal(mining_info['currentblocktx'], 0)
|
||||||
assert_equal(mining_info['currentblockweight'], 4000)
|
assert_equal(mining_info['currentblockweight'], DEFAULT_BLOCK_RESERVED_WEIGHT)
|
||||||
|
|
||||||
self.log.info('test blockversion')
|
self.log.info('test blockversion')
|
||||||
self.restart_node(0, extra_args=[f'-mocktime={t}', '-blockversion=1337'])
|
self.restart_node(0, extra_args=[f'-mocktime={t}', '-blockversion=1337'])
|
||||||
|
|
|
@ -33,6 +33,7 @@ from test_framework.util import assert_equal
|
||||||
|
|
||||||
MAX_LOCATOR_SZ = 101
|
MAX_LOCATOR_SZ = 101
|
||||||
MAX_BLOCK_WEIGHT = 4000000
|
MAX_BLOCK_WEIGHT = 4000000
|
||||||
|
DEFAULT_BLOCK_RESERVED_WEIGHT = 8000
|
||||||
MAX_BLOOM_FILTER_SIZE = 36000
|
MAX_BLOOM_FILTER_SIZE = 36000
|
||||||
MAX_BLOOM_HASH_FUNCS = 50
|
MAX_BLOOM_HASH_FUNCS = 50
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue