mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-05-13 03:30:42 +02:00
validationinterface: Add signal for new block templates generated
This commit is contained in:
parent
8ef56b3f03
commit
4505d469ec
@ -918,7 +918,7 @@ public:
|
|||||||
|
|
||||||
std::shared_ptr<CBlockTemplate> createNewBlock2(const CScript& script_pub_key, const BlockCreateOptions& assemble_options) override
|
std::shared_ptr<CBlockTemplate> createNewBlock2(const CScript& script_pub_key, const BlockCreateOptions& assemble_options) override
|
||||||
{
|
{
|
||||||
return BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(script_pub_key);
|
return BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options, m_node}.CreateNewBlock(script_pub_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeContext* context() override { return &m_node; }
|
NodeContext* context() override { return &m_node; }
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <consensus/validation.h>
|
#include <consensus/validation.h>
|
||||||
#include <deploymentstatus.h>
|
#include <deploymentstatus.h>
|
||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
|
#include <node/context.h>
|
||||||
#include <policy/feerate.h>
|
#include <policy/feerate.h>
|
||||||
#include <policy/policy.h>
|
#include <policy/policy.h>
|
||||||
#include <pow.h>
|
#include <pow.h>
|
||||||
@ -23,6 +24,7 @@
|
|||||||
#include <util/moneystr.h>
|
#include <util/moneystr.h>
|
||||||
#include <util/time.h>
|
#include <util/time.h>
|
||||||
#include <validation.h>
|
#include <validation.h>
|
||||||
|
#include <validationinterface.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@ -82,10 +84,11 @@ BlockCreateOptions BlockCreateOptions::Clamped() const
|
|||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockAssembler::BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options)
|
BlockAssembler::BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options, const NodeContext& node)
|
||||||
: chainparams{chainstate.m_chainman.GetParams()},
|
: chainparams{chainstate.m_chainman.GetParams()},
|
||||||
m_mempool{options.use_mempool ? mempool : nullptr},
|
m_mempool{options.use_mempool ? mempool : nullptr},
|
||||||
m_chainstate{chainstate},
|
m_chainstate{chainstate},
|
||||||
|
m_node{node},
|
||||||
m_options{options.Clamped()}
|
m_options{options.Clamped()}
|
||||||
{
|
{
|
||||||
// Whether we need to account for byte usage (in addition to weight usage)
|
// Whether we need to account for byte usage (in addition to weight usage)
|
||||||
@ -214,6 +217,8 @@ std::shared_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
|
|||||||
Ticks<MillisecondsDouble>(time_2 - time_1),
|
Ticks<MillisecondsDouble>(time_2 - time_1),
|
||||||
Ticks<MillisecondsDouble>(time_2 - time_start));
|
Ticks<MillisecondsDouble>(time_2 - time_start));
|
||||||
|
|
||||||
|
if (m_node.validation_signals) m_node.validation_signals->NewBlockTemplate(pblocktemplate);
|
||||||
|
|
||||||
return std::move(pblocktemplate);
|
return std::move(pblocktemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ class Chainstate;
|
|||||||
class ChainstateManager;
|
class ChainstateManager;
|
||||||
|
|
||||||
namespace Consensus { struct Params; };
|
namespace Consensus { struct Params; };
|
||||||
|
namespace node { struct NodeContext; };
|
||||||
|
|
||||||
namespace node {
|
namespace node {
|
||||||
|
|
||||||
@ -139,7 +140,7 @@ class BlockAssembler
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
// The constructed block template
|
// The constructed block template
|
||||||
std::unique_ptr<CBlockTemplate> pblocktemplate;
|
std::shared_ptr<CBlockTemplate> pblocktemplate;
|
||||||
|
|
||||||
bool fNeedSizeAccounting;
|
bool fNeedSizeAccounting;
|
||||||
|
|
||||||
@ -158,11 +159,12 @@ private:
|
|||||||
const CChainParams& chainparams;
|
const CChainParams& chainparams;
|
||||||
const CTxMemPool* const m_mempool;
|
const CTxMemPool* const m_mempool;
|
||||||
Chainstate& m_chainstate;
|
Chainstate& m_chainstate;
|
||||||
|
const NodeContext& m_node;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using Options = BlockCreateOptions;
|
using Options = BlockCreateOptions;
|
||||||
|
|
||||||
explicit BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options);
|
explicit BlockAssembler(Chainstate& chainstate, const CTxMemPool* mempool, const Options& options, const NodeContext& node);
|
||||||
|
|
||||||
/** Construct a new block template with coinbase to scriptPubKeyIn */
|
/** Construct a new block template with coinbase to scriptPubKeyIn */
|
||||||
std::shared_ptr<CBlockTemplate> CreateNewBlock(const CScript& scriptPubKeyIn);
|
std::shared_ptr<CBlockTemplate> CreateNewBlock(const CScript& scriptPubKeyIn);
|
||||||
|
@ -68,7 +68,7 @@ CBlock BuildChainTestingSetup::CreateBlock(const CBlockIndex* prev,
|
|||||||
const CScript& scriptPubKey)
|
const CScript& scriptPubKey)
|
||||||
{
|
{
|
||||||
BlockAssembler::Options options;
|
BlockAssembler::Options options;
|
||||||
std::shared_ptr<CBlockTemplate> pblocktemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options}.CreateNewBlock(scriptPubKey);
|
std::shared_ptr<CBlockTemplate> pblocktemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options, m_node}.CreateNewBlock(scriptPubKey);
|
||||||
CBlock& block = pblocktemplate->block;
|
CBlock& block = pblocktemplate->block;
|
||||||
block.hashPrevBlock = prev->GetBlockHash();
|
block.hashPrevBlock = prev->GetBlockHash();
|
||||||
block.nTime = prev->nTime + 1;
|
block.nTime = prev->nTime + 1;
|
||||||
|
@ -175,7 +175,7 @@ FUZZ_TARGET(mini_miner_selection, .init = initialize_miner)
|
|||||||
miner_options.nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
|
miner_options.nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
|
||||||
miner_options.test_block_validity = false;
|
miner_options.test_block_validity = false;
|
||||||
|
|
||||||
node::BlockAssembler miner{g_setup->m_node.chainman->ActiveChainstate(), &pool, miner_options};
|
node::BlockAssembler miner{g_setup->m_node.chainman->ActiveChainstate(), &pool, miner_options, g_setup->m_node};
|
||||||
node::MiniMiner mini_miner{pool, outpoints};
|
node::MiniMiner mini_miner{pool, outpoints};
|
||||||
assert(mini_miner.IsReadyToCalculate());
|
assert(mini_miner.IsReadyToCalculate());
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ void Finish(FuzzedDataProvider& fuzzed_data_provider, MockedTxPool& tx_pool, Cha
|
|||||||
BlockAssembler::Options options;
|
BlockAssembler::Options options;
|
||||||
options.nBlockMaxWeight = fuzzed_data_provider.ConsumeIntegralInRange(0U, MAX_BLOCK_WEIGHT);
|
options.nBlockMaxWeight = fuzzed_data_provider.ConsumeIntegralInRange(0U, MAX_BLOCK_WEIGHT);
|
||||||
options.blockMinFeeRate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
|
options.blockMinFeeRate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
|
||||||
auto assembler = BlockAssembler{chainstate, &tx_pool, options};
|
auto assembler = BlockAssembler{chainstate, &tx_pool, options, g_setup->m_node};
|
||||||
auto block_template = assembler.CreateNewBlock(CScript{} << OP_TRUE);
|
auto block_template = assembler.CreateNewBlock(CScript{} << OP_TRUE);
|
||||||
Assert(block_template->block.vtx.size() >= 1);
|
Assert(block_template->block.vtx.size() >= 1);
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,7 @@ BlockAssembler MinerTestingSetup::AssemblerForTest(CTxMemPool& tx_mempool)
|
|||||||
options.nBlockMaxWeight = MAX_BLOCK_WEIGHT;
|
options.nBlockMaxWeight = MAX_BLOCK_WEIGHT;
|
||||||
options.nBlockMaxSize = MAX_BLOCK_SERIALIZED_SIZE;
|
options.nBlockMaxSize = MAX_BLOCK_SERIALIZED_SIZE;
|
||||||
options.blockMinFeeRate = blockMinFeeRate;
|
options.blockMinFeeRate = blockMinFeeRate;
|
||||||
return BlockAssembler{m_node.chainman->ActiveChainstate(), &tx_mempool, options};
|
return BlockAssembler{m_node.chainman->ActiveChainstate(), &tx_mempool, options, m_node};
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr static struct {
|
constexpr static struct {
|
||||||
|
@ -21,7 +21,7 @@ static void mineBlock(const node::NodeContext& node, std::chrono::seconds block_
|
|||||||
auto curr_time = GetTime<std::chrono::seconds>();
|
auto curr_time = GetTime<std::chrono::seconds>();
|
||||||
SetMockTime(block_time); // update time so the block is created with it
|
SetMockTime(block_time); // update time so the block is created with it
|
||||||
node::BlockAssembler::Options options;
|
node::BlockAssembler::Options options;
|
||||||
CBlock block = node::BlockAssembler{node.chainman->ActiveChainstate(), nullptr, options}.CreateNewBlock(CScript() << OP_TRUE)->block;
|
CBlock block = node::BlockAssembler{node.chainman->ActiveChainstate(), nullptr, options, node}.CreateNewBlock(CScript() << OP_TRUE)->block;
|
||||||
while (!CheckProofOfWork(block.GetHash(), block.nBits, node.chainman->GetConsensus())) ++block.nNonce;
|
while (!CheckProofOfWork(block.GetHash(), block.nBits, node.chainman->GetConsensus())) ++block.nNonce;
|
||||||
block.fChecked = true; // little speedup
|
block.fChecked = true; // little speedup
|
||||||
SetMockTime(curr_time); // process block at current time
|
SetMockTime(curr_time); // process block at current time
|
||||||
|
@ -112,7 +112,7 @@ std::shared_ptr<CBlock> PrepareBlock(const NodeContext& node, const CScript& coi
|
|||||||
const BlockAssembler::Options& assembler_options)
|
const BlockAssembler::Options& assembler_options)
|
||||||
{
|
{
|
||||||
auto block = std::make_shared<CBlock>(
|
auto block = std::make_shared<CBlock>(
|
||||||
BlockAssembler{Assert(node.chainman)->ActiveChainstate(), Assert(node.mempool.get()), assembler_options}
|
BlockAssembler{Assert(node.chainman)->ActiveChainstate(), Assert(node.mempool.get()), assembler_options, node}
|
||||||
.CreateNewBlock(coinbase_scriptPubKey)
|
.CreateNewBlock(coinbase_scriptPubKey)
|
||||||
->block);
|
->block);
|
||||||
|
|
||||||
|
@ -389,7 +389,7 @@ CBlock TestChain100Setup::CreateBlock(
|
|||||||
Chainstate& chainstate)
|
Chainstate& chainstate)
|
||||||
{
|
{
|
||||||
BlockAssembler::Options options;
|
BlockAssembler::Options options;
|
||||||
CBlock block = BlockAssembler{chainstate, nullptr, options}.CreateNewBlock(scriptPubKey)->block;
|
CBlock block = BlockAssembler{chainstate, nullptr, options, m_node}.CreateNewBlock(scriptPubKey)->block;
|
||||||
|
|
||||||
Assert(block.vtx.size() == 1);
|
Assert(block.vtx.size() == 1);
|
||||||
for (const CMutableTransaction& tx : txns) {
|
for (const CMutableTransaction& tx : txns) {
|
||||||
|
@ -66,7 +66,7 @@ std::shared_ptr<CBlock> MinerTestingSetup::Block(const uint256& prev_hash)
|
|||||||
static uint64_t time = Params().GenesisBlock().nTime;
|
static uint64_t time = Params().GenesisBlock().nTime;
|
||||||
|
|
||||||
BlockAssembler::Options options;
|
BlockAssembler::Options options;
|
||||||
auto ptemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options}.CreateNewBlock(CScript{} << i++ << OP_TRUE);
|
auto ptemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options, m_node}.CreateNewBlock(CScript{} << i++ << OP_TRUE);
|
||||||
auto pblock = std::make_shared<CBlock>(ptemplate->block);
|
auto pblock = std::make_shared<CBlock>(ptemplate->block);
|
||||||
pblock->hashPrevBlock = prev_hash;
|
pblock->hashPrevBlock = prev_hash;
|
||||||
pblock->nTime = ++time;
|
pblock->nTime = ++time;
|
||||||
@ -331,7 +331,7 @@ BOOST_AUTO_TEST_CASE(witness_commitment_index)
|
|||||||
CScript pubKey;
|
CScript pubKey;
|
||||||
pubKey << 1 << OP_TRUE;
|
pubKey << 1 << OP_TRUE;
|
||||||
BlockAssembler::Options options;
|
BlockAssembler::Options options;
|
||||||
auto ptemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options}.CreateNewBlock(pubKey);
|
auto ptemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options, m_node}.CreateNewBlock(pubKey);
|
||||||
CBlock pblock = ptemplate->block;
|
CBlock pblock = ptemplate->block;
|
||||||
|
|
||||||
CTxOut witness;
|
CTxOut witness;
|
||||||
|
@ -260,3 +260,8 @@ void ValidationSignals::NewPoWValidBlock(const CBlockIndex *pindex, const std::s
|
|||||||
LOG_EVENT("%s: block hash=%s", __func__, block->GetHash().ToString());
|
LOG_EVENT("%s: block hash=%s", __func__, block->GetHash().ToString());
|
||||||
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NewPoWValidBlock(pindex, block); });
|
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NewPoWValidBlock(pindex, block); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ValidationSignals::NewBlockTemplate(const std::shared_ptr<node::CBlockTemplate>& blocktemplate) {
|
||||||
|
LOG_EVENT("%s", __func__);
|
||||||
|
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NewBlockTemplate(blocktemplate); });
|
||||||
|
}
|
||||||
|
@ -25,6 +25,7 @@ class BlockValidationState;
|
|||||||
class CBlock;
|
class CBlock;
|
||||||
class CBlockIndex;
|
class CBlockIndex;
|
||||||
struct CBlockLocator;
|
struct CBlockLocator;
|
||||||
|
namespace node { struct CBlockTemplate; }
|
||||||
enum class MemPoolRemovalReason;
|
enum class MemPoolRemovalReason;
|
||||||
struct RemovedMempoolTransactionInfo;
|
struct RemovedMempoolTransactionInfo;
|
||||||
struct NewMempoolTransactionInfo;
|
struct NewMempoolTransactionInfo;
|
||||||
@ -157,6 +158,8 @@ protected:
|
|||||||
* has been received and connected to the headers tree, though not validated yet.
|
* has been received and connected to the headers tree, though not validated yet.
|
||||||
*/
|
*/
|
||||||
virtual void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& block) {};
|
virtual void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& block) {};
|
||||||
|
|
||||||
|
virtual void NewBlockTemplate(const std::shared_ptr<node::CBlockTemplate>& blocktemplate) {}
|
||||||
/**
|
/**
|
||||||
* Notifies the validation interface that it is being unregistered
|
* Notifies the validation interface that it is being unregistered
|
||||||
*/
|
*/
|
||||||
@ -234,6 +237,7 @@ public:
|
|||||||
void ChainStateFlushed(ChainstateRole, const CBlockLocator &);
|
void ChainStateFlushed(ChainstateRole, const CBlockLocator &);
|
||||||
void BlockChecked(const CBlock&, const BlockValidationState&);
|
void BlockChecked(const CBlock&, const BlockValidationState&);
|
||||||
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
|
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
|
||||||
|
void NewBlockTemplate(const std::shared_ptr<node::CBlockTemplate>& blocktemplate);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BITCOIN_VALIDATIONINTERFACE_H
|
#endif // BITCOIN_VALIDATIONINTERFACE_H
|
||||||
|
Loading…
Reference in New Issue
Block a user