Merge cd3d9fa5ea into merged_master (Bitcoin PR bitcoin/bitcoin#31318)

This commit is contained in:
ivanlele 2026-04-09 09:23:15 +00:00
commit 33f3d54f21
No known key found for this signature in database
22 changed files with 144 additions and 91 deletions

View file

@ -180,11 +180,11 @@ static bool GenerateBlock(ChainstateManager& chainman, Mining& miner, CBlock&& b
return true;
}
static UniValue generateBlocks(ChainstateManager& chainman, Mining& miner, const CScript& coinbase_script, int nGenerate, uint64_t nMaxTries)
static UniValue generateBlocks(ChainstateManager& chainman, Mining& miner, const CScript& coinbase_output_script, int nGenerate, uint64_t nMaxTries)
{
UniValue blockHashes(UniValue::VARR);
while (nGenerate > 0 && !chainman.m_interrupt) {
std::unique_ptr<BlockTemplate> block_template(miner.createNewBlock(coinbase_script));
std::unique_ptr<BlockTemplate> block_template(miner.createNewBlock({ .coinbase_output_script = coinbase_output_script }));
CHECK_NONFATAL(block_template);
std::shared_ptr<const CBlock> block_out;
@ -258,9 +258,9 @@ static RPCHelpMan generatetodescriptor()
const auto num_blocks{self.Arg<int>("num_blocks")};
const auto max_tries{self.Arg<uint64_t>("maxtries")};
CScript coinbase_script;
CScript coinbase_output_script;
std::string error;
if (!getScriptFromDescriptor(self.Arg<std::string>("descriptor"), coinbase_script, error)) {
if (!getScriptFromDescriptor(self.Arg<std::string>("descriptor"), coinbase_output_script, error)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, error);
}
@ -268,7 +268,7 @@ static RPCHelpMan generatetodescriptor()
Mining& miner = EnsureMining(node);
ChainstateManager& chainman = EnsureChainman(node);
return generateBlocks(chainman, miner, coinbase_script, num_blocks, max_tries);
return generateBlocks(chainman, miner, coinbase_output_script, num_blocks, max_tries);
},
};
}
@ -314,9 +314,9 @@ static RPCHelpMan generatetoaddress()
Mining& miner = EnsureMining(node);
ChainstateManager& chainman = EnsureChainman(node);
CScript coinbase_script = GetScriptForDestination(destination);
CScript coinbase_output_script = GetScriptForDestination(destination);
return generateBlocks(chainman, miner, coinbase_script, num_blocks, max_tries);
return generateBlocks(chainman, miner, coinbase_output_script, num_blocks, max_tries);
},
};
}
@ -350,16 +350,16 @@ static RPCHelpMan generateblock()
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
const auto address_or_descriptor = request.params[0].get_str();
CScript coinbase_script;
CScript coinbase_output_script;
std::string error;
if (!getScriptFromDescriptor(address_or_descriptor, coinbase_script, error)) {
if (!getScriptFromDescriptor(address_or_descriptor, coinbase_output_script, error)) {
const auto destination = DecodeDestination(address_or_descriptor);
if (!IsValidDestination(destination)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Error: Invalid address or descriptor");
}
coinbase_script = GetScriptForDestination(destination);
coinbase_output_script = GetScriptForDestination(destination);
}
NodeContext& node = EnsureAnyNodeContext(request.context);
@ -393,7 +393,7 @@ static RPCHelpMan generateblock()
ChainstateManager& chainman = EnsureChainman(node);
{
std::unique_ptr<BlockTemplate> block_template{miner.createNewBlock(coinbase_script, {.use_mempool = false})};
std::unique_ptr<BlockTemplate> block_template{miner.createNewBlock({.use_mempool = false, .coinbase_output_script = coinbase_output_script})};
CHECK_NONFATAL(block_template);
block = block_template->getBlock();
@ -838,8 +838,7 @@ static RPCHelpMan getblocktemplate()
time_start = GetTime();
// Create new block
CScript scriptDummy = CScript() << OP_TRUE;
block_template = miner.createNewBlock(scriptDummy);
block_template = miner.createNewBlock();
CHECK_NONFATAL(block_template);
@ -1225,8 +1224,12 @@ static RPCHelpMan getnewblockhex()
BlockAssembler::Options options;
ApplyArgsManOptions(gArgs, options);
options.coinbase_output_script = feeDestinationScript;
options.min_tx_age = std::chrono::seconds(required_wait);
options.proposed_entry = proposed;
options.commit_scripts = data_commitments;
std::unique_ptr<CBlockTemplate> pblocktemplate(BlockAssembler(chainman.ActiveChainstate(), node.mempool.get(), options).CreateNewBlock(feeDestinationScript, std::chrono::seconds(required_wait), &proposed, data_commitments.empty() ? nullptr : &data_commitments));
std::unique_ptr<CBlockTemplate> pblocktemplate(BlockAssembler(chainman.ActiveChainstate(), node.mempool.get(), options).CreateNewBlock());
if (!pblocktemplate.get()) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Wallet keypool empty");
}