diff --git a/builds/msvc/properties/Link.props b/builds/msvc/properties/Link.props index db15fbb4..1323369c 100644 --- a/builds/msvc/properties/Link.props +++ b/builds/msvc/properties/Link.props @@ -9,6 +9,7 @@ true + true UseLinkTimeCodeGeneration diff --git a/builds/msvc/vs2026/libbitcoin-node-test/libbitcoin-node-test.vcxproj b/builds/msvc/vs2026/libbitcoin-node-test/libbitcoin-node-test.vcxproj index 3b8db655..0a28325b 100644 --- a/builds/msvc/vs2026/libbitcoin-node-test/libbitcoin-node-test.vcxproj +++ b/builds/msvc/vs2026/libbitcoin-node-test/libbitcoin-node-test.vcxproj @@ -161,7 +161,7 @@ - + @@ -177,7 +177,7 @@ - + diff --git a/builds/msvc/vs2026/libbitcoin-node-test/packages.config b/builds/msvc/vs2026/libbitcoin-node-test/packages.config index 3b42d1f3..65fc2d20 100644 --- a/builds/msvc/vs2026/libbitcoin-node-test/packages.config +++ b/builds/msvc/vs2026/libbitcoin-node-test/packages.config @@ -6,7 +6,7 @@ | --> - + diff --git a/builds/msvc/vs2026/libbitcoin-node/libbitcoin-node.vcxproj b/builds/msvc/vs2026/libbitcoin-node/libbitcoin-node.vcxproj index 3870e61d..326b95b0 100644 --- a/builds/msvc/vs2026/libbitcoin-node/libbitcoin-node.vcxproj +++ b/builds/msvc/vs2026/libbitcoin-node/libbitcoin-node.vcxproj @@ -241,7 +241,7 @@ - + @@ -256,7 +256,7 @@ - + diff --git a/builds/msvc/vs2026/libbitcoin-node/packages.config b/builds/msvc/vs2026/libbitcoin-node/packages.config index cc1fb9a3..a4bd03fd 100644 --- a/builds/msvc/vs2026/libbitcoin-node/packages.config +++ b/builds/msvc/vs2026/libbitcoin-node/packages.config @@ -6,7 +6,7 @@ | --> - + diff --git a/src/chasers/chaser_validate_batch.cpp b/src/chasers/chaser_validate_batch.cpp index a269929f..ef6360bc 100644 --- a/src/chasers/chaser_validate_batch.cpp +++ b/src/chasers/chaser_validate_batch.cpp @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -103,7 +104,7 @@ void chaser_validate::process_batch(bool residual) NOEXCEPT const auto start = network::logger::now(); if (!query.verify_ecdsa_signatures(stopping_, invalids)) { - // False return implies canceled (only). + LOGN("Batch verify ecdsa canceled (" << ecdsa << ")."); return; } @@ -128,7 +129,7 @@ void chaser_validate::process_batch(bool residual) NOEXCEPT const auto start = network::logger::now(); if (!query.verify_schnorr_signatures(stopping_, invalids)) { - // False return implies canceled (only). + LOGN("Batch verify schnorr canceled (" << schnorr << ")."); return; } @@ -203,25 +204,31 @@ bool chaser_validate::process_valids(bool residual) NOEXCEPT BC_ASSERT(stranded()); auto& query = archive(); - for (const auto& link: batched_) + std::atomic_bool fault{}; + constexpr auto parallel = poolstl::execution::par; + + std::for_each(parallel, batched_.cbegin(), batched_.cend(), + [&](auto link) NOEXCEPT { - // Terminal links are previously set invalid (to be skipped). + // terminal links are previously set invalid (to be skipped). if (link == header_link::terminal) - continue; + return; size_t height{}; - if (!query.get_height(height, link) || - !query.set_block_valid(link)) - return false; + if (!query.get_height(height, link) || !query.set_block_valid(link)) + { + fault.store(true); + return; + } notify_block(system::error::success, height, link, false); - } + }); batched_.clear(); if (residual) batched_.shrink_to_fit(); - return true; + return fault.load(); } BC_POP_WARNING()