diff --git a/include/bitcoin/node/chasers/chaser_validate.hpp b/include/bitcoin/node/chasers/chaser_validate.hpp index b32edabe..b1ac864d 100644 --- a/include/bitcoin/node/chasers/chaser_validate.hpp +++ b/include/bitcoin/node/chasers/chaser_validate.hpp @@ -43,6 +43,8 @@ class BCN_API chaser_validate void stop() NOEXCEPT override; protected: + using header_link = database::header_link; + using header_links = database::header_links; using signatures = system::chain::signatures; using race = network::race_unity; @@ -64,29 +66,26 @@ class BCN_API chaser_validate virtual void do_bump(height_t height) NOEXCEPT; /// Validation. - virtual void post_block(const database::header_link& link, - bool bypass) NOEXCEPT; - virtual void validate_block(const database::header_link& link, - bool bypass) NOEXCEPT; + virtual void post_block(const header_link& link, bool bypass) NOEXCEPT; + virtual void validate_block(const header_link& link, bool bypass) NOEXCEPT; virtual code validate(bool& batched, bool& faulted, bool bypass, - const system::chain::block& block, const database::header_link& link, + const system::chain::block& block, const header_link& link, const system::chain::context& ctx) NOEXCEPT; virtual code populate(bool bypass, const system::chain::block& block, const system::chain::context& ctx) NOEXCEPT; - virtual void complete_block(const code& ec, - const database::header_link& link, size_t height, bool bypass, - bool batched=false, bool faulted=false) NOEXCEPT; + virtual void complete_block(const code& ec, const header_link& link, + size_t height, bool bypass, bool batched=false, + bool faulted=false) NOEXCEPT; virtual void notify_block(const code& ec, size_t height, - const database::header_link& link, bool bypass) NOEXCEPT; + const header_link& link, bool bypass) NOEXCEPT; /// Batching. virtual code start_batch() NOEXCEPT; - virtual void push_batch(const database::header_link& link) NOEXCEPT; virtual void process_batch() NOEXCEPT; virtual bool process_valids() NOEXCEPT; - virtual bool process_invalids(const database::header_links& invalids, - const std::string_view& name) NOEXCEPT; - virtual signatures get_capture(const database::header_link& link) NOEXCEPT; + virtual void push_batch(const header_link& link, size_t height) NOEXCEPT; + virtual bool process_invalids(const header_links& invalids) NOEXCEPT; + virtual signatures get_capture(const header_link& link) NOEXCEPT; // Override base class strand because it sits on the network thread pool. network::asio::strand& strand() NOEXCEPT override; @@ -107,16 +106,15 @@ class BCN_API chaser_validate const shared_lock_cptr& lock) NOEXCEPT; bool do_ecdsa(const system::hash_digest& digest, const system::ec_compressed& point, const system::ec_signature& sign, - const database::header_link& link) NOEXCEPT; + const header_link& link) NOEXCEPT; bool do_schnorr(const system::hash_digest& digest, const system::ec_xonly& point, const system::ec_signature& sign, - const database::header_link& link) NOEXCEPT; + const header_link& link) NOEXCEPT; bool do_multisig(const system::hash_digest& digest, const system::ec_compresseds& points, - const system::ec_signatures& signs, const database::header_link& link, + const system::ec_signatures& signs, const header_link& link, const atomic_counter_ptr& sequence) NOEXCEPT; - bool do_threshold(const threshold_group& group, - const database::header_link& link, + bool do_threshold(const threshold_group& group, const header_link& link, const atomic_counter_ptr& sequence) NOEXCEPT; // Capture helpers. @@ -125,7 +123,7 @@ class BCN_API chaser_validate void log_captures() const NOEXCEPT; // These are protected by strand. - database::header_links batched_{}; + header_links batched_{}; network::threadpool validation_threadpool_; // These are thread safe. diff --git a/src/chasers/chaser_validate.cpp b/src/chasers/chaser_validate.cpp index fcb39a7f..068fdf12 100644 --- a/src/chasers/chaser_validate.cpp +++ b/src/chasers/chaser_validate.cpp @@ -369,6 +369,7 @@ void chaser_validate::complete_block(const code& ec, const header_link& link, // requiring a repost for block validation. if (faulted) { + // retry, no notify_block() this time. POST(post_block, link, bypass); return; } @@ -377,7 +378,9 @@ void chaser_validate::complete_block(const code& ec, const header_link& link, // If block is missed it will be picked up on next batch, or on restart. if (batched) { - POST(push_batch, link); + // notify_block() success comes from process_invalids() and fail is + // split beween push_batch() and process_valids(). + POST(push_batch, link, height); return; } diff --git a/src/chasers/chaser_validate_batch.cpp b/src/chasers/chaser_validate_batch.cpp index f8480951..840e8406 100644 --- a/src/chasers/chaser_validate_batch.cpp +++ b/src/chasers/chaser_validate_batch.cpp @@ -46,12 +46,6 @@ code chaser_validate::start_batch() NOEXCEPT !query.purge_schnorr_signatures())) ? error::batch1 : error::success; } -void chaser_validate::push_batch(const header_link& link) NOEXCEPT -{ - BC_ASSERT(stranded()); - batched_.push_back(link); -} - // TODO: This is only invoked by check chaser advancement. But it is possible // that entries may be captured after that point. So this must be bumped. void chaser_validate::process_batch() NOEXCEPT @@ -80,8 +74,7 @@ void chaser_validate::process_batch() NOEXCEPT } span(events::ecdsa_msecs, start); - if (!process_invalids(invalids, "ecdsa") || - !query.purge_ecdsa_signatures()) + if (!process_invalids(invalids) || !query.purge_ecdsa_signatures()) { fault(error::batch3); return; @@ -96,8 +89,7 @@ void chaser_validate::process_batch() NOEXCEPT } span(events::schnorr_msecs, start); - if (!process_invalids(invalids, "schnorr") || - !query.purge_schnorr_signatures()) + if (!process_invalids(invalids) || !query.purge_schnorr_signatures()) { fault(error::batch5); return; @@ -117,11 +109,19 @@ void chaser_validate::process_batch() NOEXCEPT LOGN("Batch signature verify end."); } +void chaser_validate::push_batch(const header_link& link, size_t height) NOEXCEPT +{ + BC_ASSERT(stranded()); + batched_.push_back(link); + + // chase portion of notify_block(success). + notify({}, chase::valid, possible_wide_cast(height)); +} + // Invalids might not be included in batched, as link push is a race. // Collected links are only required to set valid, not invalid, and do not // need to coincide with the batch that is currently being processed (!). -bool chaser_validate::process_invalids(const header_links& invalids, - const std::string_view& name) NOEXCEPT +bool chaser_validate::process_invalids(const header_links& invalids) NOEXCEPT { BC_ASSERT(stranded()); @@ -133,7 +133,6 @@ bool chaser_validate::process_invalids(const header_links& invalids, !query.set_block_unconfirmable(link)) return false; - LOGR("Invalid " << name << " signature in block (" << height << ")."); notify_block(system::error::invalid_signature, height, link, false); } @@ -167,7 +166,9 @@ bool chaser_validate::process_valids() NOEXCEPT !query.set_block_valid(link)) return false; - notify_block(system::error::block_success, height, link, false); + // logging portion of notify_block(success). + fire(events::block_validated, height); + LOGV("Block validated: " << height << " (batch)"); } batched_.clear(); @@ -248,9 +249,9 @@ bool chaser_validate::do_schnorr(const hash_digest& digest, return set; } -bool chaser_validate::do_multisig(const hash_digest& digest, - const ec_compresseds& points, const ec_signatures& signs, - const header_link& link, const atomic_counter_ptr& sequence) NOEXCEPT +bool chaser_validate::do_multisig(const hash_digest& , + const ec_compresseds& points, const ec_signatures& BC_DEBUG_ONLY(signs), + const header_link& , const atomic_counter_ptr& ) NOEXCEPT { BC_ASSERT(points.size() == signs.size()); @@ -263,7 +264,7 @@ bool chaser_validate::do_multisig(const hash_digest& digest, } bool chaser_validate::do_threshold(const threshold_group& group, - const header_link& link, const atomic_counter_ptr& sequence) NOEXCEPT + const header_link& , const atomic_counter_ptr& ) NOEXCEPT { threshold_ += group.entries.size(); ////const auto set = archive().set_signatures(group, (*sequence)++, link);