kernel: Generate a signet with a challenge
What changed, and why it matters
This commit adds a new public API to Bitcoin Core's libbitcoinkernel that lets callers create a custom 'signet' network with their own challenge script. Signet is a test network where blocks must be signed by a known key. The change only exposes existing internal functionality through the kernel library and adds a test; there is no indication it fixes a security bug.
No security action required; treat as normal feature/API expansion. Reviewers may want to confirm the wrapper's explicit constructor overload does not accidentally accept unintended argument types.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch introduces btck_chain_parameters_create_signet() in the C API and a matching C++ wrapper constructor that accepts a user-supplied signet challenge vector. It routes to the existing CChainParams::SigNet(options) factory. The change is additive API surface for the kernel library and includes a unit test. No vulnerability, bug fix, or security-relevant correction is evident from the diff.
Changed components
src/kernel/bitcoinkernel.cppsrc/kernel/bitcoinkernel.hsrc/kernel/bitcoinkernel_wrapper.hsrc/test/kernel/test_kernel.cppInspect captured patch +34 / −1
diff --git a/src/kernel/bitcoinkernel.cpp b/src/kernel/bitcoinkernel.cpp
index ba3a57d4..152f778b 100644
--- a/src/kernel/bitcoinkernel.cpp
+++ b/src/kernel/bitcoinkernel.cpp
@@ -45,6 +45,7 @@
#include <functional>
#include <list>
#include <memory>
+#include <optional>
#include <span>
#include <stdexcept>
#include <string>
@@ -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<const uint8_t*>(challenge);
+ CChainParams::SigNetOptions options{
+ .challenge = std::vector<uint8_t>{p, p + challenge_len},
+ };
+ return btck_ChainParameters::ref(const_cast<CChainParams*>(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 fc0eb9e8..6d646b30 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 ff7899d1..b00328af 100644
--- a/src/kernel/bitcoinkernel_wrapper.h
+++ b/src/kernel/bitcoinkernel_wrapper.h
@@ -1056,9 +1056,12 @@ public:
class ChainParams : public Handle<btck_ChainParameters, btck_chain_parameters_copy, btck_chain_parameters_destroy>
{
public:
- ChainParams(ChainType chain_type)
+ explicit ChainParams(ChainType chain_type)
: Handle{btck_chain_parameters_create(static_cast<btck_ChainType>(chain_type))} {}
+ explicit ChainParams(std::span<const std::byte> 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 9050719c..a49dcb87 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<TestLog>()};
}
+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
Why this scored 17/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.