From 5b4fd284f4db9fefe2bb27f345892defa7af05b1 Mon Sep 17 00:00:00 2001 From: sedited Date: Fri, 22 May 2026 22:51:28 +0200 Subject: [PATCH] kernel: Generate a signet with a challenge --- src/kernel/bitcoinkernel.cpp | 11 +++++++++++ src/kernel/bitcoinkernel.h | 12 ++++++++++++ src/kernel/bitcoinkernel_wrapper.h | 5 ++++- src/test/kernel/test_kernel.cpp | 7 +++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/kernel/bitcoinkernel.cpp b/src/kernel/bitcoinkernel.cpp index ba3a57d4422..152f778b8b1 100644 --- a/src/kernel/bitcoinkernel.cpp +++ b/src/kernel/bitcoinkernel.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -822,6 +823,16 @@ btck_ChainParameters* btck_chain_parameters_create(const btck_ChainType chain_ty assert(false); } +btck_ChainParameters* btck_chain_parameters_create_signet(const void* challenge, size_t challenge_len) +{ + assert(challenge != nullptr || challenge_len == 0); + const uint8_t* p = static_cast(challenge); + CChainParams::SigNetOptions options{ + .challenge = std::vector{p, p + challenge_len}, + }; + return btck_ChainParameters::ref(const_cast(CChainParams::SigNet(options).release())); +} + btck_ChainParameters* btck_chain_parameters_copy(const btck_ChainParameters* chain_parameters) { return btck_ChainParameters::copy(chain_parameters); diff --git a/src/kernel/bitcoinkernel.h b/src/kernel/bitcoinkernel.h index fc0eb9e82d3..6d646b30f19 100644 --- a/src/kernel/bitcoinkernel.h +++ b/src/kernel/bitcoinkernel.h @@ -958,6 +958,18 @@ BITCOINKERNEL_API void btck_logging_connection_destroy(btck_LoggingConnection* l BITCOINKERNEL_API btck_ChainParameters* BITCOINKERNEL_WARN_UNUSED_RESULT btck_chain_parameters_create( btck_ChainType chain_type); +/** + * @brief Create a signet chain parameters struct with a user-provided + * challenge. + * + * @param[in] challenge The signet challenge value. Blocks must satisfy it in + * order to be valid. + * @param[in] challenge_len The length of the signet challenge. + * @return An allocated chain parameters opaque struct. + */ +BITCOINKERNEL_API btck_ChainParameters* BITCOINKERNEL_WARN_UNUSED_RESULT btck_chain_parameters_create_signet( + const void* challenge, size_t challenge_len); + /** * Copy the chain parameters. */ diff --git a/src/kernel/bitcoinkernel_wrapper.h b/src/kernel/bitcoinkernel_wrapper.h index ff7899d1d69..b00328af3c0 100644 --- a/src/kernel/bitcoinkernel_wrapper.h +++ b/src/kernel/bitcoinkernel_wrapper.h @@ -1056,9 +1056,12 @@ public: class ChainParams : public Handle { public: - ChainParams(ChainType chain_type) + explicit ChainParams(ChainType chain_type) : Handle{btck_chain_parameters_create(static_cast(chain_type))} {} + explicit ChainParams(std::span signet_challenge) + : Handle{btck_chain_parameters_create_signet(signet_challenge.data(), signet_challenge.size())} {} + ConsensusParamsView GetConsensusParams() const { return ConsensusParamsView{btck_chain_parameters_get_consensus_params(get())}; diff --git a/src/test/kernel/test_kernel.cpp b/src/test/kernel/test_kernel.cpp index 9050719c372..a49dcb8701f 100644 --- a/src/test/kernel/test_kernel.cpp +++ b/src/test/kernel/test_kernel.cpp @@ -651,6 +651,13 @@ BOOST_AUTO_TEST_CASE(logging_tests) Logger logger{std::make_unique()}; } +BOOST_AUTO_TEST_CASE(btck_chainparams_tests) +{ + ChainParams params_signet{ChainType::SIGNET}; + ChainParams params_signet_challenge{hex_string_to_byte_vec("51")}; + CheckHandle(params_signet, params_signet_challenge); +} + BOOST_AUTO_TEST_CASE(btck_context_tests) { { // test default context