kernel: Expose consensus parameters (btck_ConsensusParams)

Library users currently need to maintain a full context object to perform
context-free block validation. Exposing an opaque `btck_ConsensusParams`
struct allows callers to supply only the required consensus parameters,
resulting in a lighter-weight API and a clearer expression of the actual
validation behavior.

Co-authored-by: yuvicc <yuvichh01@gmail.com>
This commit is contained in:
w0xlt
2025-11-19 10:40:35 -08:00
parent 667e081a2a
commit 71f827c3c2
3 changed files with 37 additions and 0 deletions

View File

@@ -50,6 +50,10 @@
#include <utility>
#include <vector>
namespace Consensus {
struct Params;
} // namespace Consensus
using kernel::ChainstateRole;
using util::ImmediateTaskRunner;
@@ -496,6 +500,7 @@ struct btck_TransactionOutPoint: Handle<btck_TransactionOutPoint, COutPoint> {};
struct btck_Txid: Handle<btck_Txid, Txid> {};
struct btck_PrecomputedTransactionData : Handle<btck_PrecomputedTransactionData, PrecomputedTransactionData> {};
struct btck_BlockHeader: Handle<btck_BlockHeader, CBlockHeader> {};
struct btck_ConsensusParams: Handle<btck_ConsensusParams, Consensus::Params> {};
btck_Transaction* btck_transaction_create(const void* raw_transaction, size_t raw_transaction_len)
{
@@ -823,6 +828,11 @@ btck_ChainParameters* btck_chain_parameters_copy(const btck_ChainParameters* cha
return btck_ChainParameters::copy(chain_parameters);
}
const btck_ConsensusParams* btck_chain_parameters_get_consensus_params(const btck_ChainParameters* chain_parameters)
{
return btck_ConsensusParams::ref(&btck_ChainParameters::get(chain_parameters).GetConsensus());
}
void btck_chain_parameters_destroy(btck_ChainParameters* chain_parameters)
{
delete chain_parameters;

View File

@@ -225,6 +225,11 @@ typedef struct btck_Block btck_Block;
*/
typedef struct btck_BlockValidationState btck_BlockValidationState;
/**
* Opaque data structure for holding the Consensus Params.
*/
typedef struct btck_ConsensusParams btck_ConsensusParams;
/**
* Opaque data structure for holding the currently known best-chain associated
* with a chainstate.
@@ -864,6 +869,17 @@ BITCOINKERNEL_API btck_ChainParameters* BITCOINKERNEL_WARN_UNUSED_RESULT btck_ch
BITCOINKERNEL_API btck_ChainParameters* BITCOINKERNEL_WARN_UNUSED_RESULT btck_chain_parameters_copy(
const btck_ChainParameters* chain_parameters) BITCOINKERNEL_ARG_NONNULL(1);
/**
* @brief Get btck_ConsensusParams from btck_ChainParameters. The returned
* btck_ConsensusParams pointer is valid only for the lifetime of the
* btck_ChainParameters object and must not be destroyed by the caller.
*
* @param[in] chain_parameters Non-null.
* @return The btck_ConsensusParams.
*/
BITCOINKERNEL_API const btck_ConsensusParams* BITCOINKERNEL_WARN_UNUSED_RESULT btck_chain_parameters_get_consensus_params(
const btck_ChainParameters* chain_parameters) BITCOINKERNEL_ARG_NONNULL(1);
/**
* Destroy the chain parameters.
*/

View File

@@ -777,6 +777,12 @@ public:
: Handle{header} {}
};
class ConsensusParamsView : public View<btck_ConsensusParams>
{
public:
explicit ConsensusParamsView(const btck_ConsensusParams* ptr) : View{ptr} {}
};
class Block : public Handle<btck_Block, btck_block_copy, btck_block_destroy>
{
public:
@@ -971,6 +977,11 @@ class ChainParams : public Handle<btck_ChainParameters, btck_chain_parameters_co
public:
ChainParams(ChainType chain_type)
: Handle{btck_chain_parameters_create(static_cast<btck_ChainType>(chain_type))} {}
ConsensusParamsView GetConsensusParams() const
{
return ConsensusParamsView{btck_chain_parameters_get_consensus_params(get())};
}
};
class ContextOptions : public UniqueHandle<btck_ContextOptions, btck_context_options_destroy>