diff options
author | Sjors Provoost <sjors@sprovoost.nl> | 2024-07-15 15:31:35 +0200 |
---|---|---|
committer | Sjors Provoost <sjors@sprovoost.nl> | 2024-09-26 10:04:45 +0200 |
commit | 525e9dcba0b8c6744bcd3725864f39786afc8ed5 (patch) | |
tree | 711f4d24de91a01b72f37d047302bb5e658c998f | |
parent | 47b4875ef050c4a41bd04398021af8d605415cab (diff) |
Add submitSolution to BlockTemplate interface
-rw-r--r-- | src/interfaces/mining.h | 7 | ||||
-rw-r--r-- | src/ipc/capnp/mining.capnp | 1 | ||||
-rw-r--r-- | src/node/interfaces.cpp | 29 |
3 files changed, 35 insertions, 2 deletions
diff --git a/src/interfaces/mining.h b/src/interfaces/mining.h index 209b629aaf..2b6c001667 100644 --- a/src/interfaces/mining.h +++ b/src/interfaces/mining.h @@ -49,6 +49,13 @@ public: * @return merkle path ordered from the deepest */ virtual std::vector<uint256> getCoinbaseMerklePath() = 0; + + /** + * Construct and broadcast the block. + * + * @returns if the block was processed, independent of block validity + */ + virtual bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t nonce, CMutableTransaction coinbase) = 0; }; //! Interface giving clients (RPC, Stratum v2 Template Provider in the future) diff --git a/src/ipc/capnp/mining.capnp b/src/ipc/capnp/mining.capnp index fe7b125efa..5e0216acea 100644 --- a/src/ipc/capnp/mining.capnp +++ b/src/ipc/capnp/mining.capnp @@ -32,6 +32,7 @@ interface BlockTemplate $Proxy.wrap("interfaces::BlockTemplate") { getCoinbaseCommitment @5 (context: Proxy.Context) -> (result: Data); getWitnessCommitmentIndex @6 (context: Proxy.Context) -> (result: Int32); getCoinbaseMerklePath @7 (context: Proxy.Context) -> (result: List(Data)); + submitSolution@8 (context: Proxy.Context, version: UInt32, timestamp: UInt32, nonce: UInt32, coinbase :Data) -> (result: Bool); } struct BlockCreateOptions $Proxy.wrap("node::BlockCreateOptions") { diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp index 8ed06bd00d..67ebc24242 100644 --- a/src/node/interfaces.cpp +++ b/src/node/interfaces.cpp @@ -871,7 +871,7 @@ public: class BlockTemplateImpl : public BlockTemplate { public: - explicit BlockTemplateImpl(std::unique_ptr<CBlockTemplate> block_template) : m_block_template(std::move(block_template)) + explicit BlockTemplateImpl(std::unique_ptr<CBlockTemplate> block_template, NodeContext& node) : m_block_template(std::move(block_template)), m_node(node) { assert(m_block_template); } @@ -916,7 +916,32 @@ public: return BlockMerkleBranch(m_block_template->block); } + bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t nonce, CMutableTransaction coinbase) override + { + CBlock block{m_block_template->block}; + + auto cb = MakeTransactionRef(std::move(coinbase)); + + if (block.vtx.size() == 0) { + block.vtx.push_back(cb); + } else { + block.vtx[0] = cb; + } + + block.nVersion = version; + block.nTime = timestamp; + block.nNonce = nonce; + + block.hashMerkleRoot = BlockMerkleRoot(block); + + auto block_ptr = std::make_shared<const CBlock>(block); + return chainman().ProcessNewBlock(block_ptr, /*force_processing=*/true, /*min_pow_checked=*/true, /*new_block=*/nullptr); + } + const std::unique_ptr<CBlockTemplate> m_block_template; + + ChainstateManager& chainman() { return *Assert(m_node.chainman); } + NodeContext& m_node; }; class MinerImpl : public Mining @@ -990,7 +1015,7 @@ public: { BlockAssembler::Options assemble_options{options}; ApplyArgsManOptions(*Assert(m_node.args), assemble_options); - return std::make_unique<BlockTemplateImpl>(BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(script_pub_key)); + return std::make_unique<BlockTemplateImpl>(BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(script_pub_key), m_node); } NodeContext* context() override { return &m_node; } |