mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-29 23:09:44 -04:00
Some checks are pending
525e9dcba0
Add submitSolution to BlockTemplate interface (Sjors Provoost)47b4875ef0
Add getCoinbaseMerklePath() to Mining interface (Sjors Provoost)63d6ad7c89
Move BlockMerkleBranch back to merkle.{h,cpp} (Sjors Provoost) Pull request description: The new `BlockTemplate` interface introduced in #30440 allows for a more efficient way for a miner to submit the block solution. Instead of having the send the full block, it only needs to provide the nonce, timestamp, version fields and coinbase transaction. This PR introduces `submitSolution()` for that. It's currently unused. #29432 and https://github.com/Sjors/bitcoin/pull/48 use it to process the Stratum v2 message [SubmitSolution](https://github.com/stratum-mining/sv2-spec/blob/main/07-Template-Distribution-Protocol.md#77-submitsolution-client---server). The method should be sufficiently generic to work with alternative mining protocols (none exist that I'm aware off). This PR also introduces `getCoinbaseMerklePath()`, which is needed in Stratum v2 to construct the `merkle_path` field of the `NewTemplate` message (see [spec](https://github.com/stratum-mining/sv2-spec/blob/main/07-Template-Distribution-Protocol.md#72-newtemplate-server---client)). The coinbase merkle path is also used in Stratum "v1", see e.g. https://bitcoin.stackexchange.com/questions/109820/questions-on-merkle-root-hashing-for-stratum-pools This last function uses `BlockMerkleBranch` which was moved to the test code in #13191. The reason back then for moving it was that it was no longer used. This PR moves it back. This PR does not change behaviour since both methods are unused. ACKs for top commit: achow101: ACK525e9dcba0
itornaza: Code review ACK525e9dcba0
tdb3: Code review and light test ACK525e9dcba0
ryanofsky: Code review ACK525e9dcba0
. Left minor suggestions but none are important, and looks like this could be merged as-is Tree-SHA512: 2a6a8f5d409ff4926643193cb67702240c7c687615414371e53383d2c13c485807f65e21e8ed98515b5456eca3d9fca13cec04675814a4081467d88b849c5653
132 lines
4.7 KiB
C++
132 lines
4.7 KiB
C++
// Copyright (c) 2024 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_INTERFACES_MINING_H
|
|
#define BITCOIN_INTERFACES_MINING_H
|
|
|
|
#include <consensus/amount.h> // for CAmount
|
|
#include <interfaces/types.h> // for BlockRef
|
|
#include <node/types.h> // for BlockCreateOptions
|
|
#include <primitives/block.h> // for CBlock, CBlockHeader
|
|
#include <primitives/transaction.h> // for CTransactionRef
|
|
#include <stdint.h> // for int64_t
|
|
#include <uint256.h> // for uint256
|
|
#include <util/time.h> // for MillisecondsDouble
|
|
|
|
#include <memory> // for unique_ptr, shared_ptr
|
|
#include <optional> // for optional
|
|
#include <vector> // for vector
|
|
|
|
namespace node {
|
|
struct NodeContext;
|
|
} // namespace node
|
|
|
|
class BlockValidationState;
|
|
class CScript;
|
|
|
|
namespace interfaces {
|
|
|
|
//! Block template interface
|
|
class BlockTemplate
|
|
{
|
|
public:
|
|
virtual ~BlockTemplate() = default;
|
|
|
|
virtual CBlockHeader getBlockHeader() = 0;
|
|
virtual CBlock getBlock() = 0;
|
|
|
|
virtual std::vector<CAmount> getTxFees() = 0;
|
|
virtual std::vector<int64_t> getTxSigops() = 0;
|
|
|
|
virtual CTransactionRef getCoinbaseTx() = 0;
|
|
virtual std::vector<unsigned char> getCoinbaseCommitment() = 0;
|
|
virtual int getWitnessCommitmentIndex() = 0;
|
|
|
|
/**
|
|
* Compute merkle path to the coinbase transaction
|
|
*
|
|
* @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)
|
|
//! ability to create block templates.
|
|
class Mining
|
|
{
|
|
public:
|
|
virtual ~Mining() = default;
|
|
|
|
//! If this chain is exclusively used for testing
|
|
virtual bool isTestChain() = 0;
|
|
|
|
//! Returns whether IBD is still in progress.
|
|
virtual bool isInitialBlockDownload() = 0;
|
|
|
|
//! Returns the hash and height for the tip of this chain
|
|
virtual std::optional<BlockRef> getTip() = 0;
|
|
|
|
/**
|
|
* Waits for the connected tip to change. If the tip was not connected on
|
|
* startup, this will wait.
|
|
*
|
|
* @param[in] current_tip block hash of the current chain tip. Function waits
|
|
* for the chain tip to differ from this.
|
|
* @param[in] timeout how long to wait for a new tip
|
|
* @returns Hash and height of the current chain tip after this call.
|
|
*/
|
|
virtual BlockRef waitTipChanged(uint256 current_tip, MillisecondsDouble timeout = MillisecondsDouble::max()) = 0;
|
|
|
|
/**
|
|
* Construct a new block template
|
|
*
|
|
* @param[in] script_pub_key the coinbase output
|
|
* @param[in] options options for creating the block
|
|
* @returns a block template
|
|
*/
|
|
virtual std::unique_ptr<BlockTemplate> createNewBlock(const CScript& script_pub_key, const node::BlockCreateOptions& options = {}) = 0;
|
|
|
|
/**
|
|
* Processes new block. A valid new block is automatically relayed to peers.
|
|
*
|
|
* @param[in] block The block we want to process.
|
|
* @param[out] new_block A boolean which is set to indicate if the block was first received via this call
|
|
* @returns If the block was processed, independently of block validity
|
|
*/
|
|
virtual bool processNewBlock(const std::shared_ptr<const CBlock>& block, bool* new_block) = 0;
|
|
|
|
//! Return the number of transaction updates in the mempool,
|
|
//! used to decide whether to make a new block template.
|
|
virtual unsigned int getTransactionsUpdated() = 0;
|
|
|
|
/**
|
|
* Check a block is completely valid from start to finish.
|
|
* Only works on top of our current best block.
|
|
* Does not check proof-of-work.
|
|
*
|
|
* @param[in] block the block to validate
|
|
* @param[in] check_merkle_root call CheckMerkleRoot()
|
|
* @param[out] state details of why a block failed to validate
|
|
* @returns false if it does not build on the current tip, or any of the checks fail
|
|
*/
|
|
virtual bool testBlockValidity(const CBlock& block, bool check_merkle_root, BlockValidationState& state) = 0;
|
|
|
|
//! Get internal node context. Useful for RPC and testing,
|
|
//! but not accessible across processes.
|
|
virtual node::NodeContext* context() { return nullptr; }
|
|
};
|
|
|
|
//! Return implementation of Mining interface.
|
|
std::unique_ptr<Mining> MakeMining(node::NodeContext& node);
|
|
|
|
} // namespace interfaces
|
|
|
|
#endif // BITCOIN_INTERFACES_MINING_H
|