From 2ae27652a811480a8815cb53f0089b0bc680d22c Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Sat, 24 Oct 2026 14:46:55 -0400 Subject: [PATCH] Validate signet block solutions. --- include/bitcoin/node/chasers/chaser_validate.hpp | 1 + src/chasers/chaser_validate.cpp | 1 + src/chasers/chaser_validate_parallel.cpp | 2 +- src/configuration.cpp | 8 ++++++++ test/configuration.cpp | 15 +++++++++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/include/bitcoin/node/chasers/chaser_validate.hpp b/include/bitcoin/node/chasers/chaser_validate.hpp index f2949b54..93cc5a9c 100644 --- a/include/bitcoin/node/chasers/chaser_validate.hpp +++ b/include/bitcoin/node/chasers/chaser_validate.hpp @@ -184,6 +184,7 @@ class BCN_API chaser_validate // These are thread safe. const uint32_t subsidy_interval_; const uint64_t initial_subsidy_; + const system::chain::script signet_challenge_; const size_t maximum_backlog_; const size_t maximum_height_; const uint64_t verify_target_; diff --git a/src/chasers/chaser_validate.cpp b/src/chasers/chaser_validate.cpp index b551ac29..49b5c90d 100644 --- a/src/chasers/chaser_validate.cpp +++ b/src/chasers/chaser_validate.cpp @@ -41,6 +41,7 @@ chaser_validate::chaser_validate(full_node& node) NOEXCEPT validation_strand_(validation_threadpool_.service().get_executor()), subsidy_interval_(node.system_settings().subsidy_interval_blocks), initial_subsidy_(node.system_settings().initial_subsidy()), + signet_challenge_(node.system_settings().signet_challenge), maximum_backlog_(node.node_settings().maximum_concurrency_()), maximum_height_(node.node_settings().maximum_height_()), verify_target_(node.node_settings().batch_verify), diff --git a/src/chasers/chaser_validate_parallel.cpp b/src/chasers/chaser_validate_parallel.cpp index 56d617d1..2a6837d5 100644 --- a/src/chasers/chaser_validate_parallel.cpp +++ b/src/chasers/chaser_validate_parallel.cpp @@ -260,7 +260,7 @@ code chaser_validate::validate(bool& batched, bool& capturing, auto& query = archive(); code ec{}; - if (((ec = block.check())) || ((ec = block.check(ctx)))) + if (((ec = block.check())) || ((ec = block.check(ctx, signet_challenge_)))) return ec; if ((ec = block.accept(ctx, subsidy_interval_, initial_subsidy_))) diff --git a/src/configuration.cpp b/src/configuration.cpp index 963b06de..3d910180 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -65,6 +65,14 @@ code configuration::initialize() NOEXCEPT if (!node.use_gpu_()) database.gpu_scan_minimum = max_uint32; + // The signet message identifier is derived from its challenge [bip325]. + if (bitcoin.forks.signet) + { + const auto challenge = bitcoin.signet_challenge.to_data(true); + const auto hash = system::bitcoin_hash(challenge); + network.identifier = system::from_little_endian(hash); + } + database.initialize(bitcoin, node.limited_blocks, node.silent_start_height); return network.initialize(); } diff --git a/test/configuration.cpp b/test/configuration.cpp index 886a7ef1..ed5b2419 100644 --- a/test/configuration.cpp +++ b/test/configuration.cpp @@ -39,6 +39,21 @@ BOOST_AUTO_TEST_CASE(configuration__initialize__mainnet__success_peer_identifier BOOST_REQUIRE_EQUAL(instance.network.peer.identifier, 0xd9b4bef9_u32); } +BOOST_AUTO_TEST_CASE(configuration__initialize__signet__success_peer_identifier_signet_magic) +{ + node::configuration instance(chain::selection::signet); + BOOST_REQUIRE(!instance.initialize()); + BOOST_REQUIRE_EQUAL(instance.network.peer.identifier, 0x40cf030a_u32); +} + +BOOST_AUTO_TEST_CASE(configuration__initialize__custom_signet__success_peer_identifier_challenge_magic) +{ + node::configuration instance(chain::selection::signet); + instance.bitcoin.signet_challenge = system::config::script{ "1" }; + BOOST_REQUIRE(!instance.initialize()); + BOOST_REQUIRE_EQUAL(instance.network.peer.identifier, from_little_endian(bitcoin_hash(base16_chunk("0151")))); +} + BOOST_AUTO_TEST_CASE(configuration__initialize__silent_without_witness__silent_unwitnessed) { node::configuration instance(chain::selection::mainnet);