fmt::Debug for JoinSplitData {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.debug_struct("JoinSplitData")
+ .field("first", &self.first)
+ .field("rest", &self.rest)
+ .field("pub_key", &self.pub_key)
+ .field("sig", &HexDebug(&self.sig.to_bytes()))
+ .finish()
+ }
+}
+
impl fmt::Display for JoinSplitData {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut fmter =
diff --git a/zebra-chain/src/transaction/serialize.rs b/zebra-chain/src/transaction/serialize.rs
index da6a3770bf1..dd8a8c2e4c0 100644
--- a/zebra-chain/src/transaction/serialize.rs
+++ b/zebra-chain/src/transaction/serialize.rs
@@ -268,15 +268,15 @@ impl ZcashDeserialize for Option> {
// Create shielded spends from deserialized parts
let spends: Vec<_> = spend_prefixes
.into_iter()
- .zip(spend_proofs.into_iter())
- .zip(spend_sigs.into_iter())
+ .zip(spend_proofs)
+ .zip(spend_sigs)
.map(|((prefix, proof), sig)| Spend::::from_v5_parts(prefix, proof, sig))
.collect();
// Create shielded outputs from deserialized parts
let outputs = output_prefixes
.into_iter()
- .zip(output_proofs.into_iter())
+ .zip(output_proofs)
.map(|(prefix, proof)| Output::from_v5_parts(prefix, proof))
.collect();
@@ -427,7 +427,7 @@ impl ZcashDeserialize for Option {
// Create the AuthorizedAction from deserialized parts
let authorized_actions: Vec = actions
.into_iter()
- .zip(sigs.into_iter())
+ .zip(sigs)
.map(|(action, spend_auth_sig)| {
orchard::AuthorizedAction::from_parts(action, spend_auth_sig)
})
@@ -884,9 +884,6 @@ impl ZcashDeserialize for Transaction {
}
// Denoted as `nConsensusBranchId` in the spec.
// Convert it to a NetworkUpgrade
- //
- // Clippy 1.64 is wrong here, this lazy evaluation is necessary, constructors are functions. This is fixed in 1.66.
- #[allow(clippy::unnecessary_lazy_evaluations)]
let network_upgrade =
NetworkUpgrade::from_branch_id(limited_reader.read_u32::()?)
.ok_or_else(|| {
@@ -1026,8 +1023,17 @@ impl fmt::Display for SerializedTransaction {
impl fmt::Debug for SerializedTransaction {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ // A transaction with a lot of transfers can be extremely long in logs.
+ let mut data_truncated = hex::encode(&self.bytes);
+ if data_truncated.len() > 1003 {
+ let end = data_truncated.len() - 500;
+ // Replace the middle bytes with "...", but leave 500 bytes on either side.
+ // The data is hex, so this replacement won't panic.
+ data_truncated.replace_range(500..=end, "...");
+ }
+
f.debug_tuple("SerializedTransaction")
- .field(&hex::encode(&self.bytes))
+ .field(&data_truncated)
.finish()
}
}
diff --git a/zebra-chain/src/transaction/unmined.rs b/zebra-chain/src/transaction/unmined.rs
index 6b953966627..da716573e8b 100644
--- a/zebra-chain/src/transaction/unmined.rs
+++ b/zebra-chain/src/transaction/unmined.rs
@@ -325,7 +325,6 @@ impl From<&Arc> for UnminedTx {
//
// This struct can't be `Eq`, because it contains a `f32`.
#[derive(Clone, PartialEq)]
-#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
pub struct VerifiedUnminedTx {
/// The unmined transaction.
pub transaction: UnminedTx,
@@ -337,6 +336,13 @@ pub struct VerifiedUnminedTx {
/// transparent inputs and outputs.
pub legacy_sigop_count: u64,
+ /// The number of conventional actions for `transaction`, as defined by [ZIP-317].
+ ///
+ /// The number of actions is limited by [`MAX_BLOCK_BYTES`], so it fits in a u32.
+ ///
+ /// [ZIP-317]: https://zips.z.cash/zip-0317#block-production
+ pub conventional_actions: u32,
+
/// The number of unpaid actions for `transaction`,
/// as defined by [ZIP-317] for block production.
///
@@ -381,6 +387,7 @@ impl VerifiedUnminedTx {
legacy_sigop_count: u64,
) -> Result {
let fee_weight_ratio = zip317::conventional_fee_weight_ratio(&transaction, miner_fee);
+ let conventional_actions = zip317::conventional_actions(&transaction.transaction);
let unpaid_actions = zip317::unpaid_actions(&transaction, miner_fee);
zip317::mempool_checks(unpaid_actions, miner_fee, transaction.size)?;
@@ -390,6 +397,7 @@ impl VerifiedUnminedTx {
miner_fee,
legacy_sigop_count,
fee_weight_ratio,
+ conventional_actions,
unpaid_actions,
})
}
diff --git a/zebra-chain/src/transaction/unmined/zip317.rs b/zebra-chain/src/transaction/unmined/zip317.rs
index 44ef709aacd..e9f4a757e53 100644
--- a/zebra-chain/src/transaction/unmined/zip317.rs
+++ b/zebra-chain/src/transaction/unmined/zip317.rs
@@ -133,7 +133,7 @@ pub fn conventional_fee_weight_ratio(
/// as defined by [ZIP-317].
///
/// [ZIP-317]: https://zips.z.cash/zip-0317#fee-calculation
-fn conventional_actions(transaction: &Transaction) -> u32 {
+pub fn conventional_actions(transaction: &Transaction) -> u32 {
let tx_in_total_size: usize = transaction
.inputs()
.iter()
diff --git a/zebra-chain/src/transparent.rs b/zebra-chain/src/transparent.rs
index afea036afb6..7982468288c 100644
--- a/zebra-chain/src/transparent.rs
+++ b/zebra-chain/src/transparent.rs
@@ -66,7 +66,10 @@ pub const EXTRA_ZEBRA_COINBASE_DATA: &str = "z\u{1F993}";
//
// TODO: rename to ExtraCoinbaseData, because height is also part of the coinbase data?
#[derive(Clone, Eq, PartialEq)]
-#[cfg_attr(any(test, feature = "proptest-impl"), derive(Serialize))]
+#[cfg_attr(
+ any(test, feature = "proptest-impl", feature = "elasticsearch"),
+ derive(Serialize)
+)]
pub struct CoinbaseData(
/// Invariant: this vec, together with the coinbase height, must be less than
/// 100 bytes. We enforce this by only constructing CoinbaseData fields by
@@ -110,7 +113,11 @@ impl std::fmt::Debug for CoinbaseData {
///
/// A particular transaction output reference.
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
-#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary, Serialize))]
+#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
+#[cfg_attr(
+ any(test, feature = "proptest-impl", feature = "elasticsearch"),
+ derive(Serialize)
+)]
pub struct OutPoint {
/// References the transaction that contains the UTXO being spent.
///
@@ -145,7 +152,10 @@ impl OutPoint {
/// A transparent input to a transaction.
#[derive(Clone, Debug, Eq, PartialEq)]
-#[cfg_attr(any(test, feature = "proptest-impl"), derive(Serialize))]
+#[cfg_attr(
+ any(test, feature = "proptest-impl", feature = "elasticsearch"),
+ derive(Serialize)
+)]
pub enum Input {
/// A reference to an output of a previous transaction.
PrevOut {
@@ -383,9 +393,10 @@ impl Input {
/// that spends my UTXO and sends 1 ZEC to you and 1 ZEC back to me
/// (just like receiving change).
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
+#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary, Deserialize))]
#[cfg_attr(
- any(test, feature = "proptest-impl"),
- derive(Arbitrary, Serialize, Deserialize)
+ any(test, feature = "proptest-impl", feature = "elasticsearch"),
+ derive(Serialize)
)]
pub struct Output {
/// Transaction value.
diff --git a/zebra-chain/src/transparent/address.rs b/zebra-chain/src/transparent/address.rs
index 01b78320cc2..0faeb9216fb 100644
--- a/zebra-chain/src/transparent/address.rs
+++ b/zebra-chain/src/transparent/address.rs
@@ -4,7 +4,6 @@ use std::{fmt, io};
use ripemd::{Digest, Ripemd160};
use secp256k1::PublicKey;
-use sha2::Digest as Sha256Digest;
use sha2::Sha256;
use crate::{
diff --git a/zebra-chain/src/value_balance/tests/prop.rs b/zebra-chain/src/value_balance/tests/prop.rs
index 9ee2fb1e634..248824157d0 100644
--- a/zebra-chain/src/value_balance/tests/prop.rs
+++ b/zebra-chain/src/value_balance/tests/prop.rs
@@ -79,7 +79,7 @@ proptest! {
) {
let _init_guard = zebra_test::init();
- let collection = vec![value_balance1, value_balance2];
+ let collection = [value_balance1, value_balance2];
let transparent = value_balance1.transparent + value_balance2.transparent;
let sprout = value_balance1.sprout + value_balance2.sprout;
diff --git a/zebra-chain/src/work/difficulty/tests/vectors.rs b/zebra-chain/src/work/difficulty/tests/vectors.rs
index 3a64cdec6f1..d198fd32c4b 100644
--- a/zebra-chain/src/work/difficulty/tests/vectors.rs
+++ b/zebra-chain/src/work/difficulty/tests/vectors.rs
@@ -457,7 +457,9 @@ fn check_testnet_minimum_difficulty_block(height: block::Height) -> Result<(), R
.signed_duration_since(previous_block.header.time);
// zcashd requires a gap that's strictly greater than 6 times the target
- // threshold, but ZIP-205 and ZIP-208 are ambiguous. See bug #1276.
+ // threshold, as documented in ZIP-205 and ZIP-208:
+ // https://zips.z.cash/zip-0205#change-to-difficulty-adjustment-on-testnet
+ // https://zips.z.cash/zip-0208#minimum-difficulty-blocks-on-testnet
match NetworkUpgrade::minimum_difficulty_spacing_for_height(Network::Testnet, height) {
None => Err(eyre!("the minimum difficulty rule is not active"))?,
Some(spacing) if (time_gap <= spacing) => Err(eyre!(
diff --git a/zebra-chain/src/work/equihash.rs b/zebra-chain/src/work/equihash.rs
index 731d9497afd..e8b73b1614a 100644
--- a/zebra-chain/src/work/equihash.rs
+++ b/zebra-chain/src/work/equihash.rs
@@ -87,9 +87,7 @@ impl Copy for Solution {}
impl Clone for Solution {
fn clone(&self) -> Self {
- let mut bytes = [0; SOLUTION_SIZE];
- bytes[..].copy_from_slice(&self.0[..]);
- Self(bytes)
+ *self
}
}
diff --git a/zebra-consensus/Cargo.toml b/zebra-consensus/Cargo.toml
index 885b3f82554..25024287e1c 100644
--- a/zebra-consensus/Cargo.toml
+++ b/zebra-consensus/Cargo.toml
@@ -1,10 +1,19 @@
[package]
name = "zebra-consensus"
-version = "1.0.0-beta.24"
+version = "1.0.0-beta.28"
authors = ["Zcash Foundation "]
+description = "Implementation of Zcash consensus checks"
license = "MIT OR Apache-2.0"
+repository = "https://github.com/ZcashFoundation/zebra"
edition = "2021"
+readme = "../README.md"
+homepage = "https://zfnd.org/zebra/"
+# crates.io is limited to 5 keywords and categories
+keywords = ["zebra", "zcash"]
+# Must be one of
+categories = ["asynchronous", "cryptography::cryptocurrencies"]
+
[features]
default = []
@@ -31,41 +40,41 @@ bellman = "0.14.0"
bls12_381 = "0.8.0"
halo2 = { package = "halo2_proofs", version = "0.3.0" }
jubjub = "0.10.0"
-rand = { version = "0.8.5", package = "rand" }
+rand = "0.8.5"
rayon = "1.7.0"
-chrono = { version = "0.4.24", default-features = false, features = ["clock", "std"] }
+chrono = { version = "0.4.26", default-features = false, features = ["clock", "std"] }
displaydoc = "0.2.4"
lazy_static = "1.4.0"
-once_cell = "1.17.1"
-serde = { version = "1.0.163", features = ["serde_derive"] }
+once_cell = "1.18.0"
+serde = { version = "1.0.179", features = ["serde_derive"] }
futures = "0.3.28"
futures-util = "0.3.28"
-metrics = "0.21.0"
-thiserror = "1.0.40"
-tokio = { version = "1.28.0", features = ["time", "sync", "tracing", "rt-multi-thread"] }
+metrics = "0.21.1"
+thiserror = "1.0.44"
+tokio = { version = "1.29.1", features = ["time", "sync", "tracing", "rt-multi-thread"] }
tower = { version = "0.4.13", features = ["timeout", "util", "buffer"] }
tracing = "0.1.37"
tracing-futures = "0.2.5"
-orchard = "0.4.0"
+orchard = "0.5.0"
-zcash_proofs = { version = "0.11.0", features = ["local-prover", "multicore", "download-params"] }
+zcash_proofs = { version = "0.12.1", features = ["local-prover", "multicore", "download-params"] }
-tower-fallback = { path = "../tower-fallback/" }
-tower-batch = { path = "../tower-batch/" }
+tower-fallback = { path = "../tower-fallback/", version = "0.2.41-beta.4" }
+tower-batch-control = { path = "../tower-batch-control/", version = "0.2.41-beta.4" }
-zebra-script = { path = "../zebra-script" }
-zebra-state = { path = "../zebra-state" }
-zebra-node-services = { path = "../zebra-node-services" }
-zebra-chain = { path = "../zebra-chain" }
+zebra-script = { path = "../zebra-script", version = "1.0.0-beta.28" }
+zebra-state = { path = "../zebra-state", version = "1.0.0-beta.28" }
+zebra-node-services = { path = "../zebra-node-services", version = "1.0.0-beta.28" }
+zebra-chain = { path = "../zebra-chain", version = "1.0.0-beta.28" }
# prod feature progress-bar
howudoin = { version = "0.1.2", optional = true }
# Test-only dependencies
-proptest = { version = "1.1.0", optional = true }
+proptest = { version = "1.2.0", optional = true }
proptest-derive = { version = "0.3.0", optional = true }
[dev-dependencies]
@@ -76,11 +85,11 @@ tinyvec = { version = "1.6.0", features = ["rustc_1_55"] }
hex = "0.4.3"
num-integer = "0.1.45"
-proptest = "1.1.0"
+proptest = "1.2.0"
proptest-derive = "0.3.0"
spandoc = "0.2.2"
-tokio = { version = "1.28.0", features = ["full", "tracing", "test-util"] }
+tokio = { version = "1.29.1", features = ["full", "tracing", "test-util"] }
tracing-error = "0.2.0"
tracing-subscriber = "0.3.17"
diff --git a/zebra-consensus/src/block.rs b/zebra-consensus/src/block.rs
index 80d4bea9c59..970cf4118aa 100644
--- a/zebra-consensus/src/block.rs
+++ b/zebra-consensus/src/block.rs
@@ -35,9 +35,9 @@ pub use request::Request;
#[cfg(test)]
mod tests;
-/// Asynchronous block verification.
+/// Asynchronous semantic block verification.
#[derive(Debug)]
-pub struct BlockVerifier {
+pub struct SemanticBlockVerifier {
/// The network to be verified.
network: Network,
state_service: S,
@@ -100,14 +100,14 @@ impl VerifyBlockError {
///
pub const MAX_BLOCK_SIGOPS: u64 = 20_000;
-impl BlockVerifier
+impl SemanticBlockVerifier
where
S: Service + Send + Clone + 'static,
S::Future: Send + 'static,
V: Service + Send + Clone + 'static,
V::Future: Send + 'static,
{
- /// Creates a new BlockVerifier
+ /// Creates a new SemanticBlockVerifier
pub fn new(network: Network, state_service: S, transaction_verifier: V) -> Self {
Self {
network,
@@ -117,7 +117,7 @@ where
}
}
-impl Service for BlockVerifier
+impl Service for SemanticBlockVerifier
where
S: Service + Send + Clone + 'static,
S::Future: Send + 'static,
@@ -280,10 +280,10 @@ where
check::miner_fees_are_valid(&block, network, block_miner_fees)?;
// Finally, submit the block for contextual verification.
- let new_outputs = Arc::try_unwrap(known_utxos)
+ let new_outputs = Arc::into_inner(known_utxos)
.expect("all verification tasks using known_utxos are complete");
- let prepared_block = zs::PreparedBlock {
+ let prepared_block = zs::SemanticallyVerifiedBlock {
block,
hash,
height,
@@ -311,7 +311,7 @@ where
.ready()
.await
.map_err(VerifyBlockError::Commit)?
- .call(zs::Request::CommitBlock(prepared_block))
+ .call(zs::Request::CommitSemanticallyVerifiedBlock(prepared_block))
.await
.map_err(VerifyBlockError::Commit)?
{
@@ -319,7 +319,7 @@ where
assert_eq!(committed_hash, hash, "state must commit correct hash");
Ok(hash)
}
- _ => unreachable!("wrong response for CommitBlock"),
+ _ => unreachable!("wrong response for CommitSemanticallyVerifiedBlock"),
}
}
.instrument(span)
diff --git a/zebra-consensus/src/block/check.rs b/zebra-consensus/src/block/check.rs
index ddd3dbefa63..5f4aaa6ced6 100644
--- a/zebra-consensus/src/block/check.rs
+++ b/zebra-consensus/src/block/check.rs
@@ -315,7 +315,7 @@ pub fn merkle_root_validity(
//
// Duplicate transactions should cause a block to be
// rejected, as duplicate transactions imply that the block contains a
- // double-spend. As a defense-in-depth, however, we also check that there
+ // double-spend. As a defense-in-depth, however, we also check that there
// are no duplicate transaction hashes.
//
// ## Checkpoint Validation
diff --git a/zebra-consensus/src/block/tests.rs b/zebra-consensus/src/block/tests.rs
index bad6ab40630..13e8be79cf0 100644
--- a/zebra-consensus/src/block/tests.rs
+++ b/zebra-consensus/src/block/tests.rs
@@ -144,7 +144,7 @@ async fn check_transcripts() -> Result<(), Report> {
let transaction = transaction::Verifier::new(network, state_service.clone());
let transaction = Buffer::new(BoxService::new(transaction), 1);
let block_verifier = Buffer::new(
- BlockVerifier::new(network, state_service.clone(), transaction),
+ SemanticBlockVerifier::new(network, state_service.clone(), transaction),
1,
);
diff --git a/zebra-consensus/src/checkpoint.rs b/zebra-consensus/src/checkpoint.rs
index ce31ac29a77..bcd49187764 100644
--- a/zebra-consensus/src/checkpoint.rs
+++ b/zebra-consensus/src/checkpoint.rs
@@ -4,11 +4,11 @@
//! speed up the initial chain sync for Zebra. This list is distributed
//! with Zebra.
//!
-//! The checkpoint verifier queues pending blocks. Once there is a
+//! The checkpoint verifier queues pending blocks. Once there is a
//! chain from the previous checkpoint to a target checkpoint, it
//! verifies all the blocks in that chain, and sends accepted blocks to
-//! the state service as finalized chain state, skipping contextual
-//! verification checks.
+//! the state service as finalized chain state, skipping the majority of
+//! contextual verification checks.
//!
//! Verification starts at the first checkpoint, which is the genesis
//! block for the configured network.
@@ -32,7 +32,7 @@ use zebra_chain::{
parameters::{Network, GENESIS_PREVIOUS_BLOCK_HASH},
work::equihash,
};
-use zebra_state::{self as zs, FinalizedBlock};
+use zebra_state::{self as zs, CheckpointVerifiedBlock};
use crate::{
block::VerifyBlockError,
@@ -59,7 +59,7 @@ pub use list::CheckpointList;
#[derive(Debug)]
struct QueuedBlock {
/// The block, with additional precalculated data.
- block: FinalizedBlock,
+ block: CheckpointVerifiedBlock,
/// The transmitting end of the oneshot channel for this block's result.
tx: oneshot::Sender>,
}
@@ -68,7 +68,7 @@ struct QueuedBlock {
#[derive(Debug)]
struct RequestBlock {
/// The block, with additional precalculated data.
- block: FinalizedBlock,
+ block: CheckpointVerifiedBlock,
/// The receiving end of the oneshot channel for this block's result.
rx: oneshot::Receiver>,
}
@@ -265,10 +265,11 @@ where
let (sender, receiver) = mpsc::channel();
#[cfg(feature = "progress-bar")]
- let queued_blocks_bar = howudoin::new().label("Queued Checkpoint Blocks");
+ let queued_blocks_bar = howudoin::new_root().label("Checkpoint Queue Height");
#[cfg(feature = "progress-bar")]
- let verified_checkpoint_bar = howudoin::new().label("Verified Checkpoints");
+ let verified_checkpoint_bar =
+ howudoin::new_with_parent(queued_blocks_bar.id()).label("Verified Checkpoints");
let verifier = CheckpointVerifier {
checkpoint_list,
@@ -580,7 +581,7 @@ where
/// Check that the block height, proof of work, and Merkle root are valid.
///
- /// Returns a [`FinalizedBlock`] with precalculated block data.
+ /// Returns a [`CheckpointVerifiedBlock`] with precalculated block data.
///
/// ## Security
///
@@ -590,7 +591,10 @@ where
/// Checking the Merkle root ensures that the block hash binds the block
/// contents. To prevent malleability (CVE-2012-2459), we also need to check
/// whether the transaction hashes are unique.
- fn check_block(&self, block: Arc) -> Result {
+ fn check_block(
+ &self,
+ block: Arc,
+ ) -> Result {
let hash = block.hash();
let height = block
.coinbase_height()
@@ -601,7 +605,7 @@ where
crate::block::check::equihash_solution_is_valid(&block.header)?;
// don't do precalculation until the block passes basic difficulty checks
- let block = FinalizedBlock::with_hash(block, hash);
+ let block = CheckpointVerifiedBlock::with_hash(block, hash);
crate::block::check::merkle_root_validity(
self.network,
@@ -967,7 +971,7 @@ pub enum VerifyCheckpointError {
#[error("checkpoint verifier was dropped")]
Dropped,
#[error(transparent)]
- CommitFinalized(BoxError),
+ CommitCheckpointVerified(BoxError),
#[error(transparent)]
Tip(BoxError),
#[error(transparent)]
@@ -1081,36 +1085,36 @@ where
// we don't reject the entire checkpoint.
// Instead, we reset the verifier to the successfully committed state tip.
let state_service = self.state_service.clone();
- let commit_finalized_block = tokio::spawn(async move {
+ let commit_checkpoint_verified = tokio::spawn(async move {
let hash = req_block
.rx
.await
.map_err(Into::into)
- .map_err(VerifyCheckpointError::CommitFinalized)
+ .map_err(VerifyCheckpointError::CommitCheckpointVerified)
.expect("CheckpointVerifier does not leave dangling receivers")?;
// We use a `ServiceExt::oneshot`, so that every state service
// `poll_ready` has a corresponding `call`. See #1593.
match state_service
- .oneshot(zs::Request::CommitFinalizedBlock(req_block.block))
- .map_err(VerifyCheckpointError::CommitFinalized)
+ .oneshot(zs::Request::CommitCheckpointVerifiedBlock(req_block.block))
+ .map_err(VerifyCheckpointError::CommitCheckpointVerified)
.await?
{
zs::Response::Committed(committed_hash) => {
assert_eq!(committed_hash, hash, "state must commit correct hash");
Ok(hash)
}
- _ => unreachable!("wrong response for CommitFinalizedBlock"),
+ _ => unreachable!("wrong response for CommitCheckpointVerifiedBlock"),
}
});
let state_service = self.state_service.clone();
let reset_sender = self.reset_sender.clone();
async move {
- let result = commit_finalized_block.await;
+ let result = commit_checkpoint_verified.await;
// Avoid a panic on shutdown
//
- // When `zebrad` is terminated using Ctrl-C, the `commit_finalized_block` task
+ // When `zebrad` is terminated using Ctrl-C, the `commit_checkpoint_verified` task
// can return a `JoinError::Cancelled`. We expect task cancellation on shutdown,
// so we don't need to panic here. The persistent state is correct even when the
// task is cancelled, because block data is committed inside transactions, in
@@ -1118,7 +1122,7 @@ where
let result = if zebra_chain::shutdown::is_shutting_down() {
Err(VerifyCheckpointError::ShuttingDown)
} else {
- result.expect("commit_finalized_block should not panic")
+ result.expect("commit_checkpoint_verified should not panic")
};
if result.is_err() {
// If there was an error committing the block, then this verifier
diff --git a/zebra-consensus/src/checkpoint/list/tests.rs b/zebra-consensus/src/checkpoint/list/tests.rs
index 9ad1febeb7a..da07c689464 100644
--- a/zebra-consensus/src/checkpoint/list/tests.rs
+++ b/zebra-consensus/src/checkpoint/list/tests.rs
@@ -103,7 +103,7 @@ fn checkpoint_list_no_genesis_fail() -> Result<(), BoxError> {
fn checkpoint_list_null_hash_fail() -> Result<(), BoxError> {
let _init_guard = zebra_test::init();
- let checkpoint_data = vec![(block::Height(0), block::Hash([0; 32]))];
+ let checkpoint_data = [(block::Height(0), block::Hash([0; 32]))];
// Make a checkpoint list containing the non-genesis block
let checkpoint_list: BTreeMap =
@@ -119,7 +119,7 @@ fn checkpoint_list_null_hash_fail() -> Result<(), BoxError> {
fn checkpoint_list_bad_height_fail() -> Result<(), BoxError> {
let _init_guard = zebra_test::init();
- let checkpoint_data = vec![(
+ let checkpoint_data = [(
block::Height(block::Height::MAX.0 + 1),
block::Hash([1; 32]),
)];
@@ -131,7 +131,7 @@ fn checkpoint_list_bad_height_fail() -> Result<(), BoxError> {
"a checkpoint list with an invalid block height (block::Height::MAX + 1) should fail",
);
- let checkpoint_data = vec![(block::Height(u32::MAX), block::Hash([1; 32]))];
+ let checkpoint_data = [(block::Height(u32::MAX), block::Hash([1; 32]))];
// Make a checkpoint list containing the non-genesis block
let checkpoint_list: BTreeMap =
diff --git a/zebra-consensus/src/checkpoint/main-checkpoints.txt b/zebra-consensus/src/checkpoint/main-checkpoints.txt
index 5cc13e1d3b5..dd8e688feb3 100644
--- a/zebra-consensus/src/checkpoint/main-checkpoints.txt
+++ b/zebra-consensus/src/checkpoint/main-checkpoints.txt
@@ -10667,3 +10667,348 @@
2074108 00000000015062ecafe1e087ddc8cdca74c6fcabb7552b36b784c8e05020be80
2074332 0000000001830c15b8c76ef48cb08fe3fc5f362a6015f3bdf847933446c5a42f
2074713 0000000000b6a6f7e35eacfa84a205e2ac86da55b518d11134917f9da0778faf
+2075113 0000000001a99f5cbd00ee510fbbdbbe7f72c694350045e66fbb79c7bd0af17f
+2075355 000000000190bf4d0a14a1d653f16e44ed4dbbf317cc5aede4a7c45a42eddb11
+2075591 0000000000e2ac282b74d35eec430a46f159415dcee10c5baffc791410347e57
+2075830 000000000092281422f9bfa7c8a76d4d9a1f7673e7fb02631a5c4e7e911e7dfa
+2076040 000000000019993f0bdb9370fe9712b77004682cb6c7c55821a1b39dea2f5a8b
+2076239 000000000183d8c7e5a83c6645d9a8b6121192902fc68277e256dbeec175799f
+2076465 000000000045ee10334a4f89e0c94f739b2b9e01f42f0fc3cd8e83583dd4eacb
+2076621 00000000014975b2eeef5ddfeb41e4f35b703ed8e62817c709a2a12084dfc182
+2076909 0000000000ac0d6bb6b12c413e98554e67e08255548c2da1182700321336a4ff
+2077156 00000000010dbf97b3209b05eabc9f01f089bd97d48622b36773b4c331382ed1
+2077291 00000000007d51fb3e413ddd36719e650ec4a1c727a30aa5380ad8af810d6654
+2077422 0000000000625df0e029adbd29103627b9425e770bc95fd5fc7bc0e1c2670b71
+2077550 00000000001bcba0aaa8a9587f3b97f5c387241dc10fb1b518b629b3ba9c6f5d
+2077660 0000000000a6c3a14f93012e5106bde5120ea3a87eb233c5ffc277d0c5cbf0f3
+2077775 0000000001c2f9bec36c0903d8aebb10aee022f6c038827b0989c12c03b308c1
+2077898 0000000001282ebbff0a872d53231cebc08b43f82cf49568fbdb33996a6bd0d2
+2078041 000000000102cf8ca8bebd5a0c211369ab15a9bfc487c9cb5463a5beb8a7dbb4
+2078158 00000000005c84fae7637880208b1a5e56fe90010e1bbf8077de8a6805221610
+2078284 00000000013e02d5696bf80ebd6953a9d0b890d6ced8b5c7034c15016f5abd2b
+2078402 0000000000737730069b08e3d1f59006e754045a0e2a643516930e7a12bb3601
+2078499 0000000000c1c6c6d7dadbfde9b3d52151aba05bf6053e1eb0ef4daa41ebe4b1
+2078604 0000000000bbc8474aabe166b367f053ab3ccefaf1c9f922e747c6e20deea7d4
+2078703 0000000000193a5c667ae00e51465ddefd6ad7ec9130db8d9909ba27bd88c5cf
+2078813 000000000127c5c3016530ee95d7fbd826580600c1fd50ffb71190dc60e3572e
+2078943 000000000133ff5ea8249786e58b9aa1f4eb4fee0abf8552e0f670396622710b
+2079111 000000000019ed9cfc533b0b8307b2b69974b602afbcb9c458aea978bddc3a92
+2079277 000000000076658b08cea75506e7b3302a5b99cdefbb76292fa28fc67b98b52b
+2079380 00000000015a2a71549a3fe6d658cc62224de854b98b54bc6a195dae41998b10
+2079523 00000000002aca3a883235acd879b2404f37528f5957d803e4f762257f0c20a5
+2079662 0000000001d5971debe4b032b9949b8e52aa35360c089011f9b5bb4871114a63
+2079807 00000000005854f7d4ce31683f79b8612b4506990d4a03f7c5fd11f3abd0269b
+2079991 00000000012744f6be1d5d352630ad60bd06b7ac303313899da55dfe4b3d92dd
+2080129 0000000001ed04450f257bc8b7c95629659688c6f36dfd9185f5d67715526f9b
+2080309 0000000000ad74ed21dbe8a0807729759e4c0170f6740fea30fe7d0232e3311b
+2080709 0000000000e0fee4e08e761d52a6d25c36763fc1788d809b008c4286feadc0c4
+2081029 00000000014ebb5c2cd581f8b3eebacea0d75f7659db2801e9c74dc2aafa2749
+2081185 000000000142344e494c8686e0828ca763841492a56d09f93b265c18db8eee31
+2081297 00000000017718db0074dd9903f4fb1e5a79ea81f7bca5dc55c8e9daa7a19401
+2081404 00000000003b81dd192a5ed2dcff69469bd1902b6a77edda77ae174a6f31c23e
+2081514 00000000013f483f1a79d515beee205bf821ad36fecd4642e9627ea4b54fb14a
+2081636 000000000054ec8a49b0b2b3638fbe5363cd62a4fceda2519d8b775580a106f7
+2081745 00000000019dd976a602f82cf79d2252f741836ef65de94d19817ceda3a9b046
+2081883 0000000000167f3797a557e26240e5ed10ff574d45d88d27bec44189e1f4a4f0
+2082013 00000000010dafd4f31b09d4f70a38e76fc1a40a67497ab4b0af35139bb972a2
+2082139 000000000180fa80db5c37e49ac748dda9adc81e97004eed1c67d898de2f408c
+2082272 000000000093a93c48fbb4759f494599805206dd7db1e6cc483928e156b0c985
+2082403 000000000109103341c173547c6a6696025ed8d3b6d5c3b81e0fff73f62ddce2
+2082554 0000000001287ae5df7f6ba6497325863a956fd9482c3811d85e684f6b785cda
+2082686 0000000000628e50012d4582a199a35ea7b13730ee315e327eb1548e1aeffcc4
+2082845 0000000000fea04ea60477b21314b0dbceefec88c269b968adf5fb6a68e69179
+2082969 0000000001cfadc95ac815fa8d4dc3210e844584744e69122a566f84155847ae
+2083104 00000000013e581f16c4715f39d43f61c5db974664ee2cb1437134c9238a0b22
+2083229 000000000085e08c8f8a33889a7a6fb3a48aec7c2955b435e6d74df6f4d9caf3
+2083332 000000000136e02aa8e0d6bd970c9a3b7ef0cfdf3dc8bcc3ecfb32a5ecedd03f
+2083435 000000000185e9c7af88403485a12a760574f3ae0479c671219f5a8c2dd1fbea
+2083573 00000000012602f9a5270af537e0aad4fd955c08116ba65ae01071cf23e5b743
+2083706 0000000000b425d837a7091c4c94b16c8f634fe1f8616c6dbcc32605879c39a6
+2083811 0000000000acf4ccbfd1649a8fedd5cb5bc3ff3e84c4f6dd63782fd72d161990
+2083941 00000000009c2a22fe12fc1c7a37d47ed7c63753e1b492c82562cc7f62d7b15b
+2084074 00000000003ecf1222c6b8786dfb7ebd9bcee5110fd84d02823f2ea7839db06a
+2084195 0000000000c1c49ae460a1a6a06b6a7f76f7f7c49a98752f3ad2d52002e3349b
+2084326 0000000000b9faee1b460f0053868ed7b7444566943780ffea4aedba153c7bfa
+2084432 00000000014399d32f8b4c918e0a27ab2d9adc8e59541c0faf6f26e7e04304f7
+2084558 0000000000391f7fc515fd02df4ad7a9b87038ebf9a2f7838bfa4f1501cff24d
+2084695 00000000006c2526054bcd1e3d770d5175b565f964ebcac3b6cda84495905a23
+2084839 00000000009a17158b0a1ed2b8301dc41fd0d3f79f7b248685e606383dd2d746
+2084965 000000000083a29f9b23c35799d15f31879fc3e7c4e14f99d971ed0ae47a4318
+2085087 000000000174e61ccb20f8b1a2e0cbc14e4ea4b7355daa4257ae77a90b9b3824
+2085222 0000000000ff69aee2b7e4ab0ce84a78220c2e238ae4cd4b7c7fe80b42d78a91
+2085302 0000000000a3c808c1bd1a2ce000bb2dae84ccf2bf61f7efb316cc8df74e14d8
+2085413 0000000001a411687105ec5e6df08a408094b6efeccdad9637d05f559705a750
+2085577 000000000036144af8d64b6eda6f7b6c3a0e072bfc7414a0fec80f74346a30e0
+2085719 0000000000f5e597f032c5c4c314bea90b5a615fedcd343a66d9b190c4b30728
+2085880 0000000000c2fd91ea1a788befa956d96191122f52ca7dd40e112b7fc1d368b7
+2086000 00000000010f5c6fb2c3a27c4c89f1d3c80ffb9478d5138dbf89d8c46705ab44
+2086114 0000000000e0609fe931e181ddfea66d5a156ab443fc9ce0c0323cd8a73c1715
+2086279 0000000000801ee3c97e79cfb0328673bb402927b199059cc01fc9078aee3a02
+2086411 00000000005825160e58a707808118d1c53c3b5fb1a7b23c4a71b587e77218ba
+2086539 0000000000a6b8b89ce3753e5426912a3302b5f0815333eb34ac13f90892d9ca
+2086652 000000000032c4aee2b456017f5c44ece27dfe6f82ce793d6a2c8e6cf9705181
+2086755 00000000008b381f7aa4911d580c7e9925f9547b5b035e49fb3b6052c3ffd208
+2086905 0000000001052632e3bb2bc5c1fb399b99ee42d0204d31bf42fec607705d6b1b
+2087034 0000000001474b9758fab2f332507c27190707d4dd25a22ddb868cc46ae654fa
+2087133 000000000111733ff1eb1398e0fc424ee0a790f48f4255ead39921f67aa6784c
+2087243 000000000064babe446f9f017692c4014f57e7fe7ac3af54d8e0bb080b601a06
+2087398 00000000004a5564c138e812b337ca04688a8cdb986e605c625a68397cffe782
+2087520 0000000000658ce81447a526e4ab0cb86fe290d5c91b438b5045fe296dc2fc2b
+2087648 0000000001912acf62fdb254caec219475bf19de2968530d6bae14e5abd6e132
+2087786 0000000000a776a8153c5d8d5df0c46f3dbdb06e0842176845cd189303cd0634
+2087891 00000000002ccb4b12628cbff1b098dc97067419dc4e9d6fb080a0332c853c46
+2088044 0000000000f6a45be7b62776431b2d9b8af4fc3ac41777d8e6641ef6c91a56f2
+2088195 000000000002a33003d8425848a941e31f271f52175297ce7b620ccc3e59d1bd
+2088324 0000000001417d7d06bdbe473761c8682604892e59977e892e729a46ddc0ab46
+2088468 0000000000fbb79d003db0a0b4daf4b3e58127f2940565b03d05544bcfc9c922
+2088594 00000000013bac8323b8061d16f665010dfe67c3ec9f468cb9e61580e04b79c7
+2088726 0000000000fb4583ce7b2175a27ccb7e4aed7d79d81708cdb33c3a5b65c869e0
+2088848 0000000001958630b3397d77b058a659e47ef03a6c30c548f3817f618d6274ec
+2089011 000000000111f5a56df6d45411256d7cc54ff69ff3d9e66b6c99b5980143fea8
+2089136 0000000000995a0fd722fe9521b641914cd42b87a0b3114856025514405c465b
+2089290 00000000014f205ee8c866b48777bd5b8423161143c3304eb32680942a87bb46
+2089444 00000000005aade414a8e456d9726c6537136eff19fda583108fc6621244e0fe
+2089551 0000000000e9c3ee19aa6145ba94c3f59e3c0396ee621baf6129b3528f539c12
+2089667 0000000000b1ea2da31d5d8eb8a18c621f6bc2c79fe95ecde1964af19c2b95eb
+2089795 00000000006c9c29a3ebbbc0a88bed7e8a292fd004dbb4d8a31a6e7f48d3a881
+2089921 00000000001e842aea64af9109cc5fccde5452ceeaa01ce0d931ef43ff3c04f0
+2090048 000000000189b07ece1910e7cd1df564cad6d198b90bdde937ba8d0d8c0fb0cc
+2090198 00000000001ca7557b6317bc1424714d64dedf382527ce5c2e522e063a773091
+2090321 000000000081e3efad4e1a4ca570adff25257c91504e1446a85601e97ed07b14
+2090491 000000000057c842f1b7c2872a23dd2b7a070980184f566d55614d89edf48b3c
+2090619 00000000001d01eec1878379670550483e7b79c139f22d08179f09cf5e6f4be6
+2090714 00000000014056f035e3d7f93a92e2e761b8c39f155dbb965307e6ed9bb170e5
+2090850 000000000145aff813301f53126ab43e12322a39de94ef6b5c6415da041f3758
+2090979 000000000170349ba82f090f52557c75bc9af3194acd01b51fbf9c06b44f030c
+2091126 0000000000c01ce110634c6e639a31a685453090b8068bb89368f2bb9eca1120
+2091251 0000000000d1c7eb27f2827306534733eb99f176a0c9d5dd438cd23938ef680c
+2091367 000000000121421e33b4f6f7deb178eb367a88a42fa4cb128bebb5bcc8b53827
+2091494 000000000090ee533f3170cced652435525a92461da39f8a48e3109699fcc664
+2091642 0000000001741cb8f3fe51bc7d128cd54f796b4b5190872a230b2d5317675603
+2091743 000000000155855fa11342133b6fcfd5d9994739f456559b846ea5e19f4035de
+2091862 0000000000b97d6804bc58ca8aadf678614f5a05885ff992ec39fdbfa500cbcf
+2091969 000000000026c91a63f379118acd5b3b9ef4e5b63732d28ae7e4374a9efa539b
+2092094 000000000005ed59479c82647e54020ede65c39a1fc8644c76c2ad47906bbec9
+2092243 00000000016d798087735a6adcfc45f1b453c99f3e815287b3eddde288a6f47f
+2092354 0000000000df2e13976590ca0de726838139c3a4d26decea868797ceff8925b0
+2092442 00000000019fa546714a01c2c98cac576ede6c9b7245bfc06e30aa79132097e5
+2092577 00000000006fc88b68bcb75e2b9183cb65604d0297d095fcc5d1580d8696d26a
+2092727 00000000003745c16340b006689f9f9beb68c5f05d06ab041a866205a1da0b99
+2092830 000000000109c548e333cc58a86278cf7a1e6fbdb956ce0077a250a9f8706b90
+2092947 000000000135e5a70a02cf995623c7e529fff35400dde4eddf5797c9a3aee732
+2093093 0000000000f9458e958ca596df0af857057e02b9c498055de0aa4ad531bf9b16
+2093209 000000000025246750e066373b65649a45b11304a18520f63c52b5db520eb063
+2093353 00000000010cef5c3ba1f1943596ce9e0a88937f0425b1c569e618133b695b4c
+2093475 000000000127a92e27e42a379870f5ec6eef37272523537436ee50d284df35ba
+2093599 0000000000f7478cad724e166935715a65536587b651445bd63185ba9f03681d
+2093704 00000000001f605497e26424f85c9d0e7fe50d448bbbded57893536b137dc810
+2093847 00000000007a2b5cfa3d3b75d83a2e088706327dadcda59e7dbe7f461e1db70f
+2093984 000000000147c1590105c0b33e4c5acb5a6c0e3cd0b97b4290578b641feb64de
+2094130 0000000000e62e23345cbe34b2e8f9e670b1867512a363afed387ac44b25ca0c
+2094272 0000000001081abca01a5593db3a73d7c15c34bf80b8c24a4f6c22a6c585c2d5
+2094400 00000000001d0e52398c31bd5e65306c4c98450633423e47a05657cb19970a97
+2094602 0000000001bb52a477ba7a6dcaa5b69edf249b193cfffb48dfbc7d58b5d81a3f
+2094832 00000000019cb9d5f6dbd810a4024a519310fb5245fe571efcb1636411db050a
+2095050 00000000012b4df2ac3c737227560b507437049fd3cf54f460f912e452ba7881
+2095276 00000000007d87573801bb0a1ebb0b62bcfa41920a48da68f36af0dd73163cd4
+2095507 000000000100405f5523ac56768cb001b7f1150f06b5b776a7e6fc5aae6b5f35
+2095768 00000000010c7c5d98a49d0ffc78309f461732b688a6f8f38883d54b5715eff2
+2095996 0000000000f9c91ffc58ba89159128a057ba0bd42c17416926a17f66529cabea
+2096252 00000000015aa2059a7f4d8ae0d0e2c7830c887a46d2e888a28c4725d18e89ff
+2096467 000000000098c095d51fb23327f2eef50af0ccd992c7c22fe82ad5fb494141f4
+2096660 0000000000d2fa4dbd07c6bf86768a7862d54b7dc9dd763ce3db9654e0eedef6
+2096903 0000000000e8fc62e98ad1c279523f04a55b8ad432c69bf2994e247e28aa551f
+2097179 00000000010f68b4ca057a42199459d1bf7462c7d0e84faec16416081b3f02f8
+2097435 0000000000547ee4b69300de21a1ecba0b9c9a31f6d49c8e574cf549c41df924
+2097686 00000000005606ecf6d0f8a76f0c49b909cf8dc21092146501303ab1e8bedfae
+2097908 00000000013e314a2da8a5c37fad8f66bb93549ee723fe64d5d2cd1789068a27
+2098115 0000000000619d8ebebc9c5e314ef50ed424680f72640393ae4cddb06787cbb5
+2098356 00000000006a5bd6a2cf39d29936a2fc3f24ef0b96ab6a3bf34fb30e0bb0fca1
+2098639 00000000016cbe6be35a7e51a5f7af4f61ddcac80cc091a220fc367e3383410c
+2098824 000000000159d8583b4e5bb535705bf5bc87fa9c945aab9869c0a4c3b3855e71
+2099031 0000000000b2f71cff88dcb2733aed5295b8df299493ff376ab0c208a667c7ef
+2099206 00000000004c580fa34990eef81ea528e76e2edcab313ee817afd14428c99124
+2099443 00000000013ee542bf98e6a5bbfdaefc63e80cc2f352d369f0b8c1c421b9f503
+2099688 0000000000bfdc4c16a54ac414edb19d0ff954a4e660e085aaf2c3ee04752ba2
+2099909 00000000008d1bb1394d7eb061d24d09313535c5390835faf8736c29413db3c9
+2100132 00000000008d8bc2ba2bab2ab1ec144ea90ae6eea9fc53e2625be5c2a2f31af7
+2100338 0000000000b7182364fab1c4d886c7320f760727fcd6bdc3579ec89c2bfdcae3
+2100563 0000000001709e775eb92dc1bb3947b43a2cebd6a1aa1f8361ca9171ee7e568b
+2100799 00000000007a830c89fc58233dd9dcd920178e18e7ecefb7b7c41abad6ef63b3
+2101027 0000000000ba306e1b028fc7e6c9b596e5aea4c0e03deb5a261fd285b7807c1d
+2101249 000000000147292eb7a34e69d7ada2434d17acf883edb97b480d8131a67e6695
+2101488 0000000000bb967770e76aa56783ecf9811be8509cee1185fe5e3ce459c430c3
+2101706 000000000064a94c632d64928781a822de69bca875fb2d728af2b8c6d76de035
+2102003 000000000006729c11fbd2b36cf45cef154b5be993271d13164d0535a6b28084
+2102282 00000000016a24b3ecd9a5645768ab60cacd3dba95ed66c969823cf7e064f644
+2102557 0000000001400d652c5013ad285d1c2091a281e8a50f46998d991ec941044b0e
+2102794 000000000175190d14b451705b876ab43e1c0178aa58b40d9a0fd7a75f7c2d86
+2103089 0000000000124f0adb813216722c1d9a0f426e1a7db2d701800994f8474a5948
+2103399 000000000007ba597b2a6a5786a04b903ea59fa5d351b5330f650ac386e408f7
+2103668 0000000000bcf023e1f9325995fa9c7420e95d82354c9b70ec56760d4a12fd86
+2103935 00000000015705e5a3ab8b2602678411356198cb3a6bc961a601d796cc61e833
+2104217 000000000101c6a29a3e520ee6371acd728a4284c08ca37a943879b1f2550953
+2104503 00000000008426c5a699a586790038e3bd5cf5f02bf1558e5ace5a0c06acfd1b
+2104771 00000000001c27faa1701f94afd0edfa4527b2464ca6cd243f597a52b2338b0a
+2105042 000000000181438c35b05daa85e68e7c94987234b56619d0fdbbd35f30de88a7
+2105343 0000000000d7fb4c5a7b89a4bdec72c766c9cbbb30657164b7aaef5b12bb48f9
+2105640 0000000000edeca93d6da6f0d2165025328fd590a95fa13fa3ee1e944c42bbc9
+2105949 0000000000be17c29160f95f978bfdd44d3e9b0801fe5c15a370ef339634fd5e
+2106261 0000000001cd0274c7b1e750eaeb56523228e3daa50933d3b5b1e4ab24c04c24
+2106595 000000000046b741edf7f7314ef6c62d571622a4c7257c050124d2e34df4b89a
+2106871 00000000016ec9bc1eca28390b20e26a30a45588826ea986e1f8c3f550a435bd
+2107132 0000000001642153d541f9744667aeacc50731682938bafaa2ee2ef0ca837bbc
+2107416 0000000001c27104d4f31a26b484f7fb334b0e84907c6415a1342b11a6e0fdad
+2107740 000000000169f8a49f66287ed3c2bf41df12592a5dc525b336622de12c79d0e9
+2108033 0000000001318d782ef724c07192781b0d69906a3ff1a570eebd239d41fa3b0d
+2108322 000000000137548212186de70d9be0960655dd856620ab46d8459c32e557f294
+2108618 0000000000e9e4a451fd409324a7790496787ec829aee266cf076c1d16daac39
+2108909 0000000000c49cdc19e6d24a74905799219392bd8fd6232d0934d62b6d95e9d8
+2109225 00000000007b7daf13baac8d9eec989c559cbb9b3af7dd2a2f9096f4ffe20982
+2109509 00000000013ea4b51437a7d29d3eba586de862563535b59ea60b7dfc6609930c
+2109811 00000000009ab0ab6fd7b5fb3e978d2d27e6e0351bb04b1ae9ef1e3fca705415
+2110101 00000000001221d61b8bd5178692a8c35418098b1920fb0470e447de1a2b8a38
+2110416 0000000001baef0c680fb91ffab2de7db11b0a57aab546325493e6bbc32bfc95
+2110816 0000000001be2f3576ea68beec4757c14446f2044d78681492b318aca9c89d8d
+2111216 000000000046f9457ce05ad5c9d87a7d6de5f0d526290f2f71dc4feb723d579c
+2111616 000000000122596e9a9897ed9130aeff0ec850e078ef65f623e5626414b7f0c9
+2112016 00000000011c14231f9405b2c4dddb7049677f85197af9059f0fb09ed8868d3f
+2112416 0000000001b569f523b60e13d853da0a0db6e49859ba8abdca4cabdf03f01a5c
+2112816 0000000000ae445d0053cf26a0cfd85202f606b7ef032c6faacf017f0e4f965d
+2113216 0000000000dbd1b82b8c5156be270db65bf3ae45130b5a6f1874914f15041d20
+2113616 0000000000b45acbdc3ed6703ce8e31479907e43f1cccaebe9e651b0a3d0058e
+2114016 00000000010e8dab09722bb9bc75abe949b72492158b528a2db60bc09c247c3a
+2114416 000000000075e1dca1b3775083de165418f3aae99405e3df3e2826ab1e4e609c
+2114816 0000000000f700ef27222c61e255cbc44b867b59a157b930b6c6d502c87a872d
+2115216 000000000038d59f2b7571905bca2bf9ca67564f5dc90ae9b53859431108e5a5
+2115616 0000000000a2ac4c4c3270c9c57236407fe4d74053a940e701fcd9c4e3b8d1a3
+2116016 00000000019282be257a52518559a9c66cc3963b1c45c2dcfc5d3a84e8d3b9cc
+2116416 0000000001826392c47f07bf16cece3ddef30bbe434e5514f7baa05615ae5a82
+2116816 000000000039630d200d3ff912e5e745eb5e994d14dbd69c405c7e2eeba7e9cb
+2117216 0000000000b722d83cc8568b94bb9765509c45302a48f7f9251262854e816137
+2117616 0000000000b91c891557df28d4173766562cc455b3b5ab27e83c9a03958bbc14
+2118016 00000000013eb4b6e1cd5b9f19ad032670cad97fd4837b1dd7e876358ff8752a
+2118416 0000000000a5e8d0c81b4fb1036d94ac7d16d192bd068258d3aa07fe903b8736
+2118816 00000000003fb9615f739bad0dac026ed1c0f7861330737c4b55d292da4d981f
+2119216 0000000000b5e61882e7e4d69c75f335c96a6c1744e8d4602e77caa46f9ee187
+2119616 0000000000d8509fe19c295db85f6001031816dc05aff2674b95925b88c8242f
+2120016 0000000000dc0337c69742d294267dd2bd434017827151d6ae7965ec19fd3cef
+2120416 00000000010b5fb468a019e2b9115aa0e0ec8cb92017195a4ebd4e9b5a47c6be
+2120816 0000000001206742e94d9b3cb8187b4c26be13290724ef97848c62f7d01e90bb
+2121216 0000000000b2531dd904338ddf602c87ac70ec14e7aca566d297dff7278648ab
+2121616 0000000000b5fca10a6ff18c158d38b83369405362f97f5de4c9bf2cfd12b23c
+2122016 000000000121e68a6ab027b23fb9a5e73eb38fa6af0fef88931af48dafc71821
+2122416 0000000000ee1cb21aa6d9b957578ef6f3e45b6730ce7c6e22edfa729d3301f9
+2122816 0000000000fcc1ef9a8d0e4b71f55947fd094ac9254ee0f21e2531eec099a538
+2123196 0000000000c38a681500f237539b08b8d3f75d9ab0233e2b5252b76ddc4727d9
+2123582 0000000000c4014be9b89ef009959a45e4fb48c074881c7afe1780b760853127
+2123932 0000000000e4c93f99189deadd479ecabd3660de1041ebb4a0c5ef5d7cbe5e51
+2124280 000000000127f2b6c0c0ab4048b16116e559dc9b9a934fdbd7810e1ae49b5349
+2124602 0000000001bc3445533dfc7baf59b6294ea1d4585ee928ec18c79b6b49f3dabf
+2124906 00000000001e2edad0443cb8d4df1da641c3c58f2f83893e361fa37fd121c29d
+2125219 0000000001280e8b6a0642a896b7b5337aac71c543cc36b26d2d296ead4af381
+2125509 00000000001d565ed9c555b1b276dccaaa87a3c0bbed390a340c799776e37be0
+2125805 00000000017827e42bf3b99f40c6ee11c8d4e56dabb802ad56e74c766a31ae2c
+2126109 00000000014e149e7bbed108446e842a5c25e400423074ca891cd88c16e18bb1
+2126422 00000000005bf996c990b6124d3a93f50dd6a8403104be774a659f0c4a1ee54c
+2126703 00000000010b6fb36760137accc7926c3d8c314307816f15f84c63eefdded7a8
+2127017 00000000012e0ba6b5a5f0a4ff5310b931c063098f3e96fc997c7b6fb44a24ff
+2127320 000000000116fa60015d9f21754b07269703129fb4af00a7b33f7b0fb5c128bc
+2127612 0000000000df367879d160aab3f1c3834462110de823b7c2e1407014b49f5544
+2127899 00000000004731b6685e37ccead8caf23b7c1b229aab4407376a07766ea1871b
+2128194 00000000013eeadbf973df717320aa63ec2b3e81f0b19e521c37db25ce2ad630
+2128515 00000000002b17686a2aa58e52433e4a11fddd1172020e1464e91ba54d6bef29
+2128803 00000000017166558e5f022e46f2a476c67c69f9963f48951f421ab37426e3a4
+2129111 000000000136b194b3e7bcacf1a0222a8c7f6d3f739e42fb7db2b9ebcf1b6332
+2129418 0000000000ade562bdb165aa21fbefcc0d2e655e213e5ddf0b2bc5459c0b53c7
+2129741 0000000000408733f90084aad38ffa5a356d9f220e40ad077178d492e96ee696
+2130039 00000000015295051bce1c94530d5c8341f51b7aeabed721c26024088acc033e
+2130324 000000000047140460766777a3cc6ce71bccf3d2d1aeff7b74936f21cc9f666f
+2130628 000000000010fafc22180689562f6447240af96dc3645a666d88655a15509758
+2130915 0000000000ff00e5f8d3608e0549e680f32cb9eca3fe15eab2f1b43f8f5f1f38
+2131206 00000000007e0b7952afbd83aa3f8bbf5277eb025a8d7c130f750b9a75cdef40
+2131495 000000000060944b74e2badfc81d0043c4d97577450193a72c9f640bb8925b57
+2131813 0000000000eb90d10f092764603621bdc345875631ce08106e7bc5cdbea23902
+2132122 0000000000fe437b14ce7ad15b01d31f85076d84331ac0fefad44dbe81246e48
+2132410 0000000001768b04e8620bfd1de919e9ae09b04c0a962b158b106a33986b9aa8
+2132711 00000000007aadf626595d2e46ecff42d199b02849e7815fb4ab499e902b7923
+2133000 00000000012bd3092c628405bd45bd3c3ddfd9d7f282c5099047ec456a83d4dd
+2133300 0000000001affcdb85411d7d2edaae4ece70497edd418b6ac5a6b61471401d69
+2133604 0000000000cbe948c19907c592e4e2704ddb155c1da1cd3a2e6db5ebc8451494
+2133905 000000000157943224c2fc9672f4456dd5babf2fd7404077d85f9136d54fe067
+2134228 0000000000663b7abc789a86bbe3cb0a8fbe5be67c74302e9d6abeda775abd98
+2134528 0000000000449198effd2777d6a2157e94916e317b13eedda1b833c633cbdfb0
+2134835 00000000006ba2705c7eaafcc186ccad35b7f934da0c765e757f76e151137b27
+2135171 00000000010460ae8510ece826a72703f77ff0e7a463e33378c22e136f8152ea
+2135462 0000000001195d894fd61b555ace3d99a6c1c124d985880279d0435263941135
+2135769 000000000054b8e03388a56b73a9652f3ff23e87ade79993c76cf6d65397e353
+2136070 0000000000d350786b28b662a544fd929f02dd778b46bf73c0944bc6b0b39e2a
+2136396 00000000012230ee900503937205d1b6a6899128801a75b4b1d584f3c13e2fd4
+2136700 00000000002ae376a9bf93e1909594728aebda019466440037e75d3083e0b7e7
+2137028 00000000006023df4efc2a79131181cd46109b4bd788256ad10662edabbad5d1
+2137357 000000000057627e27490f20ff6290004762a698d7d69f9d818c2df2777d9282
+2137686 0000000000f52577e5e8392873b1206ccce3d4ea25360d297d3c3476dbd982de
+2138018 000000000006e84370babab79c13faa64113afb4386a92375983d3a7987619ca
+2138392 00000000010a100e0d11eabd1692eac1cb93989d2cd03b355e5b0240f77cf978
+2138792 00000000001c6417d7df1be185d6b0ec0657703eebb22e68a418a565da99dbad
+2139192 00000000009943cee98c43f5d391769eff1a1f89f4b2aa8f61f1ca0b7a1a035e
+2139592 0000000000598a978f9fb352a6fa920de69260096e159d68dc8d40aff3c17e92
+2139960 0000000000cc1ccb9f4b4f48a5bb8598e7205db3042f98b37eb02e3b37e6fc6b
+2140206 00000000008d6f467aa6c002fe0a64c9a4fbf92421de221690f0cb653b34f646
+2140557 000000000116303502e9e57339e1a9366ad41dc8b2856ee93d0ba9325acbacea
+2140935 00000000012a549d767f9baadb9d5fbc32b5731e5f17984fae0f710aa2c07e4d
+2141335 0000000000aeb392feef141bdc08e20dd7e3b240e48d5a71444747f1380c1590
+2141659 000000000069f06cde1416523d991d82103ec685d6e83a523511c481488ee1a3
+2142040 000000000111b9d1034a10f455c7b8fa23c513b137978d9277c3cb228aa1b87c
+2142388 00000000012dff7fc274b000fb33ce3bebeb804fbafe2d3ac192699a07f89866
+2142701 0000000000a3a77419c416ddca708cadea1f8f824b1471b9ae15d82bef3221e2
+2143001 0000000000b75101aa7213929ebb6c1cdcea847b7b6fbc5cf80f08819e921839
+2143342 000000000177e02b211712c21ee84c4318643568101ec549770a93bc39188e4c
+2143638 00000000001e80d2127c27a6e9943f6289dfb63ff38c870457026af6bb60bf97
+2143939 0000000000d42517546ae61193b197dda0eed95779d905608b6d8b9c5312d3ff
+2144245 000000000142361c95ae61438f7184aa13797381d4b55b40e53ea1b733fc3c61
+2144564 00000000010a68a12792eea5a16ef54d758abe202b3e5675116f799416f4aa94
+2144872 0000000000d16090f1782e5068e54f8090de1c618067461b875a9ed634599678
+2145166 0000000001eff76b65bee186f9ee3a8334a8aaddc26592f1adc13dcb54fc4dd5
+2145479 000000000130119c71832a87a08b20ab3ebe14c27d45fa4771e03741804b0ca3
+2145753 000000000030dc3f97729f24a349776dd0fb3d76791daa2546008018bef34d4a
+2146049 0000000000bc378dd8cb00ffc2ed5903334f139435d4836e00b433662f4f8745
+2146356 0000000001cf420569c9dc8e1d53043245fe041fc03a42ebb7029cd5d96ccc1f
+2146681 000000000184c12fe3bfe8f2a9e07f32ef069d1ccd0e1e37e593e11defcc9f81
+2146962 00000000011ef518062c4bf693fbbc5a9a8cf14070dadf0e034455c950d2cbc4
+2147278 0000000001433728c12320b61be87dbf5064ce53c5d0c2ec0d88849606ac791d
+2147579 0000000000c6baafb5f6d4505f9df1531695a4ef162627fb74dfba790f889bf1
+2147887 0000000001551ae09945147c25bae678d0ba160e3fdd5526dab400c6e7f15d0a
+2148184 000000000016e7048f77880ee061ce62210461d0f16d9bacb977a313bb7a6a79
+2148497 00000000018e77540b791666e462d03fe2092064730e13e5dc4412cfaf8054a0
+2148798 000000000015ca4de3c9f8eee7a5db5e5743039ddcc794a9ab63898ccdac4eac
+2149107 0000000000b95386a0dcf5ea3378ea4a71a8d47504dec77525fc30abc372329e
+2149402 000000000129f21442d711334026047792418d7552ac15446f804e65e503520c
+2149682 00000000011366ca792e91c4c568e3d8739d97c1a385ef6bfed90a477a9622d6
+2149994 00000000019ebc82fa134540b12d44baf296a7de847012aff9f6d7984dd59f8e
+2150295 0000000000f338ec2ee075c53165dd3c2075340053f29117ce560858cbcb89ea
+2150628 000000000104a1912842bac89d50faeeb95d6381085365a98a74a6ffc5df5916
+2151028 00000000018b4d5632fe0fecd4b39df78dfd5c0baa9718b8540d8e20a7ac5a44
+2151428 00000000006dad2c3e9e63da48eb994eeea239c2e2ead76129d9092ae0da8611
+2151828 0000000000e482a079287b9a742fccbd8fd15a0cdde94207214a2923e1717030
+2152228 00000000018e17d2ad8f040334355580cf8d94217b50c2d3a0a32223fe2455eb
+2152628 00000000010d95f51d45c376c436fc478d15b5f19043ae9b877554edd6e955ae
+2153028 0000000001ed3f035ff96ff981bd1baf7105e8ceac2ccbb08d484ce09fea84f2
+2153428 000000000056e97ed55b0ecad057d20e5d1945655dbfa945352efc68080fb106
+2153828 00000000004a6c97362e2022c443ff1676e7f385834eed887e6dea4a967f5f9c
+2154228 00000000004e30690838777e4bdd9594c07c9859d09c831e182ac41c803ba4dd
+2154628 000000000158f8dd48314777079df1f7f4b40f03c80bc7ff79325e3ec9795c7d
+2155028 00000000006a566ab3d31064dbbacaa7c4f9d0cde9a2151379ad8eb82b5c22b7
+2155428 00000000019d5b3b490aad9d696f73ce6e2c9dcc5aaa0f59d895037f0c42464c
+2155828 00000000013fda74b17fe46eb349312cc8641e4e4cc8e82c7461a0c5dde9942f
+2156228 00000000002a5dcecbc9fc649a00bd369b3614a2966e31dd8f6f0486d5423f95
+2156628 000000000063e00e765733cbf1fa8f91b3918704f8f7f5f2164e7c4db93db0ab
+2157028 00000000011ad7748b6ad9f296bebc2fd5d5fd2471c3957538a05e12442e5220
+2157428 000000000229fb466e7d68465f58a0a107291164f98c4a8aa473b61b27bc58bb
+2157828 000000000029febeb9e9ff7308a46dc08b7cc6de7b8525f6e71b40611b7eb8a7
+2158228 000000000132364ef3ce63c688d7c89bd2d81f9db403f688013783d231ec77db
+2158628 0000000000747ce4c907c89887de3084bd7987bf82da755b99c27ea5003591d8
+2159028 00000000009f9607df64f4a64f09405c34ed470683711ddad307fca1fcbfe242
+2159428 0000000000024d54b83f05fd6a7a4a61abab1b1491560e4175b6590b99fb9792
+2159792 000000000022521614534df6b3640b8ee5e83481223f17dc98b16eb209a51aa1
+2160160 000000000160c7dc4b42f0b2df00563adc885f9a540912f25251a8de8cdda6a8
diff --git a/zebra-consensus/src/checkpoint/test-checkpoints.txt b/zebra-consensus/src/checkpoint/test-checkpoints.txt
index 979f082390c..be02a5648a7 100644
--- a/zebra-consensus/src/checkpoint/test-checkpoints.txt
+++ b/zebra-consensus/src/checkpoint/test-checkpoints.txt
@@ -5827,3 +5827,249 @@
2330400 008669568ece470d9864735b490caf727b68b74e757f162dd0ad3718123dfea8
2330800 007e9deec86c3d54574fed9a49e758dedfbb764cef3f74c19df64a0045596020
2331200 004580f2f264ff7157f510c680b4efe51bf1ca78e3fd551609e0a77bd60de4f2
+2331600 0009b548a3b16906c4d46672ef6beb0f3226307eecdadfba2582a6268954040a
+2332000 00aa72040fa3145ba80541e37f4f6e9f70db71e0afe1e7a2b295f587d2bc0af8
+2332400 00139b8e079e992cd8ba70bf3d7244cd2be3f256702983dae000eaa935bd14e9
+2332800 0099e2baf3e1643694d85b94c0b5c33bc674af14599dd7bd000916977d12b51d
+2333200 008abbcb1bac2807ba498201768b3822eac4e0e78252a8b4393e0b5f9054379c
+2333600 002e725d23d6968f9c92781a65e0d459351e672272b626573ee0622f9bdef682
+2334000 0035c24576f6f50e63bd8de5a41a7d89f0dd7f30038131b44c723ce07c0338d1
+2334400 000f0523d5a9d678a910043b9381c7b2af2168d149c95488ba0ef373902d09cd
+2334800 009e4d9a4c04b2a9ab7bc7fb5bab1285dc74814a36ddc244d294627aacee56d0
+2335200 000fa3566a2aa663b5c09126622a64ed693457813e7627a7659c58637c5c4bc3
+2335600 0161d8e382f90e119eafffc24f2144a2657431afd0f6995a3e9828e4d69330b4
+2336000 0082fec597fe97fcd30c735646f4603165d65223ebbf0a132da0b259b07a323b
+2336400 0040abbdcadec76905536f8ad001a9ba6a10537d42b0ce98115f0f7e5adfb907
+2336800 003fe35636f76edc5ea3e75a36f92d03a149a85b44f428a15c8ff152f3b208e8
+2337200 00c38f200be5e9ddbdb18b0c7844b12c75f95028d472bc359b97655af822f3f5
+2337600 00de39f3f6783ecc0845028b5a08a73595895533d464d6cf0e603711a9cee770
+2338000 0005d876aaf60f9c28ef9a54ebd06bb2266d627715d7c3171198fa81809ff7c4
+2338400 00406b335801d4fa99c3c4250c13a61f69279453d82236d9787b51e0dc7530d4
+2338800 006fd53c497975438dc904aa93c365f2e0b5d9066c43acc1473622fb880ad7ee
+2339200 00a31a27bdc1f593b3c625f817127b82b1075e9532dad4945e3215582cd93113
+2339600 00041c8a9bcddab0514870703fe8278255c2e92d32cc42b0cf60849efbb3d738
+2340000 002c18eedab7798ae6286a36d5e88fe076c5dd1b82309895536498d6a55c2300
+2340400 0065e036f01972b5ad0451b065a7ab2104f0e80680598f8f065dc200fca8fb02
+2340800 0088e3ec20439443bdfb329d2e79875d626ab401497467b29221b8603346d8b8
+2341200 0005ba8b7687bafe4bd5d6c4120caf2e50550ba5ac9871dc8616cee6322a6a2b
+2341600 0033dccdfc3c42e3f2a2b9102d9f34c2635991a548f67702a77d2e7dbfdd2212
+2342000 005e714c96771eaec8d83cd0c4f7b59e09f46235e00e8f073c3bb8667479df87
+2342400 00655671a299d7f388239324db297b9418b01cc9212545eba77f8ad30d2f2c5e
+2342800 00ec042621ba4a3ed3401fe0adb5a77318f1805c4f11fbe6b81919f920e0ddb6
+2343200 002d58735bad815988159e96baf4436de6639bbf168025a73ad36fc63de12057
+2343600 004c983227e2dcacbaa5977a1b460823bbf8bf9ef840c49ec9909fa86b35c611
+2344000 00bfe21a73d76c6ff21d4a8510cab28095961e9145ff792766c947bd84a92124
+2344400 003e68d18a9d946f310e59c0d305e6dedc65f79fab0b80e658395a7f4f994d38
+2344800 000223ee61a4906b733deb9e977bee05a4466fe405df0c89cc99e30397cd8260
+2345200 00dfcfaf90014a93dd46ffaeee52962e009fb21919c69603b27a2f62ed9b9012
+2345600 010100706849c4be8acd87b9ea422ff6cf94b1d74bb0aecfe4b9e60d02133a74
+2346000 002828b1a8d3e52bfa0e41bccffa2165e6b9ea9eb889a1931330a87aee6f6bb6
+2346400 005a52a2a7cde557512f276c0342c04939147bd1a9524c7e97aaed7f5255d55c
+2346800 0095cbac48a6546ad31398e5372411e09ff9da184a82ec244f1a0ffeaa4d0394
+2347200 0078cd2181201db4a98a0dead70d1bd2f30d419425a5584e46aa791b6d4a7bfe
+2347600 00329c81a460483493209cbf6ec41bb09deb1c1b7b6b65f8ec26aafda24a87c9
+2348000 0006d3cbfc8f0c441fd4edc9f53b0df7bc56c4d0f68e2c0e20aeec4a62e5ba17
+2348400 0082d919c612628ffc19129767c9f2040dfb9affcfac70b97daf031df68c3b42
+2348800 0051896f03230319b16947b723ceac4a3ee83d8ee51053f2008e5fb4fc3697d5
+2349200 0081d630671395b578e78f9c5ab2e86d9882aff8dafe3d90d74a909c80e47788
+2349600 00572ca27cd2c286e3a2a60f446cb7245fa6abaddb54f5baabd04843a7f700ef
+2350000 003069053a60727191c6b37d3895682242b964889c5634ae4d348dc00c4619dc
+2350400 01248ca3b868fc3108a909277037d9a567a275d6f30103faf375b87d54e5b29f
+2350800 002f764225f023895da74fb99c34fe639c98df5c20d0cdebcc1914d82712c061
+2351200 004f24fd7a90d1b35c2b2d9ea299d3487566385bb18835e0849cc99e46e67189
+2351600 003c60f452959cca109c4fee5a848ad174f7f25a61d5e799b729da38721f5297
+2352000 00983f53efe520e91c8faefa5c92e8d601a9165ecf127d7cfe31ebe7c8fb86f7
+2352400 004961d0674de9009f77fe929382851b79f842acbacefe36654d48d26b5f93db
+2352800 0021ba495ad27eab30ce8be12a9b75bb12ba70fc6d1435e051954066c46a069f
+2353200 000e774789bf9600e46f489c1aaebfa9fa2e5c7ea50915c17c8cbd225a788f73
+2353600 00921d0864b9668fb2d89e32861527600bbfbd8c89cd7f1e8b4d848196494e4b
+2354000 002a6729589cbe35528fe63b42168fa3ad42248b9168a00c6e76dac5693d3fd7
+2354400 0040c9fe0d48436c5c242d418e4d3e1785e2a06aeddff362e17e6bd83a1f4c02
+2354800 006f70ea8090d18b8b91b06d442f88170de92d51005edf94f595e0ddff4f693c
+2355200 006c31fc1d68146f1190286a73e5230b922bb877704ef038631ebaa8b5a660ee
+2355600 000dbf54a92779a7dc6abaf7af8572e4e8b8b2a200761e96acd003e4a9bfa5ea
+2356000 000e1fe86ab564557cfde4a2aa4321b293b7a2b8ee74c595a6071a15206458e0
+2356400 004f8c72fa892a68ccba76b2a2a58d3950a650d7fe5e08132d523cbf7dc49d06
+2356800 000c345abfce35324d97821d9ddf2dfebee89c68641ef85fb2030f31b6b2934a
+2357200 00586f1618612ae82a75a4dc8c4af2db3165c7ee7ada1cc51effdc81b7f2d588
+2357600 0002efcdbd777660634a77bd4b910344428c649bb169d1f2350341ffa189604f
+2358000 016ce033b882949997208502e67986d4f72ee331b38186d30edbac7754f39248
+2358400 0036008ddbde2fa0047b61d34dd0dd4523191aa50ce5c3ee84f8bf3ebb08858e
+2358800 00125c02d232037b34ccd5499e0b22ab52943561930948ad377693afed91982f
+2359200 0044a5e6f02310b18b2abc57bbd09ec7934b3aa80df4fa8f81464266550cbc2b
+2359600 00a484fa68a3ccc5dc55dda3d0c6a90ac0ab7b77fb7049fcaff519e3991a019e
+2360000 0031d12534f35e54170ae9b8fedcd611c48f12a1be093d47bf1226e219beb418
+2360400 005963b47b255547135ca26224cc6a9b5257286f83bee1ff8512292b0f7f74bc
+2360800 00822cc61eac54709c5874842ea3a6f2129d34c20022264147c1987247b4a96d
+2361200 00359f742d9a06a76fee644305542517f6240b8fa86af388a574d2e1d5f12c59
+2361600 0021df1ce0a6971f3c6988933a3acc3ecf8fd94b251bc4a13d0a3ea7ffa8b20f
+2362000 006d2ae23c9ae386d85cf17d8a14a54ff9e5bb49a93066098f732c644760fa5a
+2362400 004856c1492a51ff1c082e9ae62e102b7f3590866f38bf243b170bdf57a1944a
+2362800 001a6a6eb376abfb9dcd974b1a7e8065e353479e972334fe3fba1911f6136505
+2363200 009cf8e442dbb74299b4bc4bfd83fa43ac28c8ffb7630f55efb660bc9e5812a7
+2363600 001efe1adbde8a31e70c911be35561002bb30b48dc311920d474b1f1ac4012bf
+2364000 004c11faf0bb27bb84cba0912b16fba211ec71bb4b69825f9a9a343cdebb2263
+2364400 004899370613a6893207f45da046907041ce17c06e6ac6b4ea79aa02cde132de
+2364800 0028a024cc2e565b0206243b17d54655529831d70bfe6cc8c640cb64af634f78
+2365200 0094b6f96828a0295e198e32341424e2854bf6a062cc2c2e0855fb35995ff6c0
+2365600 00a52a846cbeaa6534605bb8396e3139594f5160e705f582acd3bc607d63b43f
+2366000 0077758232f91645e9abaa27648b2ec5e7af9d61eaace15ff5751cdcd50a03a2
+2366400 002229c39b034e7c2b1eaf1b32b2c9f50e70559a075a7ef6ad642a61898eae0b
+2366800 00315ac86628c5372f133436ea85d0c17bd5f98ed8a7b50039397eaff0334b30
+2367200 0058b2290e17df289cca7f4548bb9bb77e35fe5a0c6e5e57c8fa542c23e5f568
+2367600 0053add58a099464f321b8708c39b186b8af3a75b749de0a0caa16f9fb6bc81b
+2368000 00225a4916fbc660f70e45558d4a99a602fe9cce26a2d8c1bb3356717805b174
+2368400 0064f94f5ff49088aee047af2b56619a86832bfc8266f5e136c957a7a6b7f036
+2368800 005d7aced5d77767ec25ad54ff28efb5bbdbdbb3e4ec159833212cb4a130c7fe
+2369200 0005b8eb5b727e8971d467db170f9338e751bc9c7d02aefa61bac5599f83be50
+2369600 0043074760a32a7eae055124859f7f447fdbb77535b31d946d4e0ef962011065
+2370000 0000b3672c7628008574f5c0c83dd37b49eb45d353d2e578d9f47d188dcfa2c2
+2370400 001dfa30609c198411049da4a13709527289f483752e1afba516065cb939b8d8
+2370800 00124174ac647f00f6656209e0e7edb87bb76f8ba32ed3f929a0c7480bacc2fa
+2371200 001dd4010f636def1bab43d7b5d621ca984712c7cd579995b0d9138c5f8bbb87
+2371600 00101a398fe99963ce0ae45f67091b8ee71673ef7ce6a16d4dd010712aca7f16
+2372000 002a414b6b69758f8408326c7b79f0607d27a95ffe2c46177c9dfc6179ee67df
+2372400 00135546d02b716693f9b1c7764d30c7db7b876a4095cfd7b391f4a34f5bcaba
+2372800 0007010345aa4f5cb2d4ac761d1c5b9a82ab7749aff5cbb8e881a2701fc88b11
+2373200 00180bcbc032ea60438ed1e1251ff5cbd8f728347758ed177ab56d4a8ccc7cf5
+2373600 004f6e9f158296590d25f38c46ab5fb7af52c681c2cf122c9caa1cdb651b5187
+2374000 001ad81a27ce25859c4cbe28da98b6b1f298aa460e842ebb868b6d5721cbde06
+2374400 00e5c9d7cd641388f23714dd3fc1eceb929968b908c4411fb78c3bd9ee036d61
+2374800 000bc5e9a8ee1b0ff85efcb1118386c88184c83001ac99bd0b30841bb3b0187e
+2375200 002961f9c0ac851246c2a796b7569410c0b0ac0eac8c0873b7c65c511f0523ea
+2375600 00a0b4d01e3bfaad57be6469ee23cd58f6fb19ed34d87358a1c8479db5ea59c4
+2376000 00071275ff1a42fac46138b1a1b5997cec976bde326d3dbe016d457e5294906b
+2376400 002e111e59b3bebaf40f9038ba97327b92ace389eea95f8a5d439f97d8e43a2d
+2376800 001cd77884be5224bb6fb047be86fedc29b771e31e51801b30a10a10716e10ab
+2377200 00129deaddbe60261a544be644022841468741e94a0a2ae298ef1b8dde19af8f
+2377600 001fe8a1f4cb96cfee6a7485c7eee913170b82b5cc6a8b44864c6fed186e9339
+2378000 001a299d0587852d9718ee4c696827d96b4168be9865805222cb515f14fbdbae
+2378400 000f60d57bc9c19d171f04662ee5e06a1dca91f091c8c1f10e4acf827cb9548c
+2378800 00192766442c4ecade78c79653645c5fb06cc99e26a900a5b1139dfbf470d6d0
+2379200 004391bd427bde706e2754f5a5f84024536b8d27d763c37b5ecb9261bef359b9
+2379600 0000a22e46cc27732a84126a2de66dfbe0bd31a8fcfbd314b773cdbb0624ab99
+2380000 0001cc2c2db186634b6820310aa9f7c5a1779e8027b446c966de2d4df1db119c
+2380400 00138d1e655c247f4835b23bd67637a54f325074f48a6d5d8cfd198af1dd389e
+2380800 0018c3e56d80300f2c933e7d605d7328706479fbbd426985669b67986aeaf241
+2381200 001eb8a8a29d3a665d7c9dd63e055950ba5f62e8cf9fee85dcaae129f72438c3
+2381600 00169effb224e50d189a3c80e1c8e20ae9ce89dec5d231f3cb4d9ad2ef188cad
+2382000 003ef4a716a195588c7946a6a5fcfdac029f4674740d5aa71d7ad5c33530ca24
+2382400 0005cc2b3dead6906263c3f61f16e03b9e9418046a3bd1f44b1057e136a45513
+2382800 00462a258adde935bb9ddb900b595d340938c0a05155c6690bd0a2959b1115d1
+2383200 00187156e8329cc8f0374c7278c53a05dcc6b9fca8320c1a11eca1ea77fca05b
+2383600 000b74dac7fe5f75926959a06d00a02f8bb8025766a1f484baa055dfa18d66ac
+2384000 000df197d3dc51cae497b2853c6ce5ac8221f0e8fe20d6287a7d8a4cdfa6a9d9
+2384400 000af5b611047bfd10b5fdca61ff6d70a54fc0b94088f05e070877e400d7a551
+2384800 000e34fc2f2f29a8d32b04e6c8527608ca51ed3ab764d5e413ac14d86e0cc0b1
+2385200 001dd51a0f99105c819b165aa744867a05f706daf75b43fed397a61034ca150d
+2385600 002373147ea295799c286bbcea88dcac18493dd7bc88c6e8afc1d649d07be0ec
+2386000 000760d50b320d2143a522402f640f06774564e39b88abfe2638c4a3c5ee85c0
+2386400 000687e79efad695c376389d7b067a74cbcf7ff01d1503f40d13db6fbcc0f044
+2386800 001dba9917f4f3f03bd2113bdfb7606b374f583b26e1274234dfb014645542e1
+2387200 000f0e7482a8f65f5a7e8cc3bf9d3bc0b352c10f309a8e3048870e4a0d3f32a2
+2387600 001a75b87be98b8fc41bec67db3d5ca41c1cc73e86ad292d5498dafc8409f325
+2388000 000681e3c3dd26646a307943bb5e46abff6422681bfeb4e059ccce1d56a68b69
+2388400 001954d674bb1468c290ce6e41c9e30499c887b609a9feb5a13907744650ce2a
+2388800 0026a02c112c93a3239d05f8c02f268bb9965ff149993f33ca7c821893fdd590
+2389200 00125d3b01118461734ea74ae3a0f0fe471cc2a86687cb767717f99ec702fde9
+2389600 0005876465b0416be5f26b2c3d0f89eb2575fbfb4a2739d16983f151f00e2bfb
+2390000 00165f0dd4864f342c30158a6d7ecaad6eae3617388783346926fb477f69f3fe
+2390400 000a864fe4954ac591be34451389367d06d70bd1cce51f35d21b4b199b55087c
+2390800 0012a95faa1c1ecbc9328337827c3dd1b317b240bea483bd59bdd2f9fedf0b03
+2391200 0015984bead0ee986c0e55621f68c8c0b4b5cc0482ee4469b3179e5dfe85f5ca
+2391600 006903d70ac042330094b2571789c62af43230467c8cf7982d0d76ffe6121d3e
+2392000 00161e72c469aa7f8fad67138af97f4dee0d1efbcb7cdaa76979e065c908d8c3
+2392400 00016dfe99fbbc22672d52cf62fadcbdb451c1c8280dd829ff6f930833d8a905
+2392800 000690e3c90bfb4eb82b2dcdd0353d274a60a9cad309b0fec3e7458e7b65506b
+2393200 000cc40350d6872b86abe8ce159ca0d8a5f275713b4d1c0d6d6db5f3f35d1d2f
+2393600 000aae4b2b7d546f42fb3b73963cfd957324245ba470eebb2debf96a1e212450
+2394000 0072ce0c882d219ee14105040dac351f6b73b4735aac0ee699b0cbac8800307d
+2394400 001913cae8692b3c6b645d86d0be6f43882bc11c0568017abfeee2febbc1e58c
+2394800 001cffe7c7602e64a9cf6da7fa7b21ab475975b6aac94a2b4c9d4f6ac9771582
+2395200 00179a14baa1629fb4e937cdf6280375ae16312679ca27e23b236689423c0cac
+2395600 0020b3e0e96d419ea0bbe1b45c1ab21440377a973d6b063368f47bf5dc4095a7
+2396000 0048d7587504d873ff5f25a419c258984acf384a3c3b7e3c29b39905f65fc610
+2396400 000296911fcca5522ecb2a00d5abb7718afc20c984c67446a1ac1255b3adbc49
+2396800 0033e251f1671667f60576fdc4736a3540a6cd6863646833b64b90294fcfa793
+2397200 0025444202d8824a1fce2f56594b5b215b41b43dab116526aa54f6fac328ec32
+2397600 0018efea056bd7e711ff110536e1fd06d72c3bcb59808ec78ecd6a8bc6f809e9
+2398000 001a8d6641c623e2217d8c8cd0ac1a4f431a096e4d4c234a23a75248e2934a98
+2398400 004e7e1176eb92c65814b208401b258149ebdbd4fc8e70356ce133ee20846412
+2398800 00104ca6428e88d1789492a302503471b8f81ec1d74dd4484621fcd836971923
+2399200 001a192b3b9c798ec182f1385e56245d8afb55698fe6e8f9ac3cbbe7c6a18a28
+2399600 0034e7c97a1a7755e9e83a69df53a7722ca3eeb7c827ca0212cff32a6ab7d224
+2400000 0014f90b82658ecce4b29d8c4e4b755324f5b75fb85b96421074c3bae652ce1c
+2400400 008495070e1d0de594ecb8c74c0d79bc07c558661fe20f9492c60adff42983e7
+2400800 0009959bf6deb71a7198df94c2e607d23b887934dc0e3bd031c19b56f7df427b
+2401200 0020158fed99b7bbe09e0470edc0632d05e7559cb31767f883ae8ee9dd3c3fa8
+2401600 00177c5621ac7a61674f66aa8e9015745c4b50f4c90b6b410ee9939dc7c2f136
+2402000 00018340c3a99b95f5de82c248ac47735cad3a0fbdc6006caa094db0673b38f0
+2402400 0018c3aa759949a1280b4f865c639609e82a9a1e27332264ca6f87a9c531634a
+2402800 0009715feac14163c78a68f477608f0a6424efd02ffe936d7e9731241ee67078
+2403200 00058881db360bdf0245b5be0cd6bd85ef1650388a90eaa4a2f8644221b3459e
+2403600 0067d8e71caef5f552904c15d8560500b810c2cce0928b630e8ac6382055ef89
+2404000 000a309d9d8ec47ed3be870aea4a03dd75822e88790229bc9bee09de86e0ebd0
+2404400 001d29fbe998d3039b6967f944f1b50e10ce70421d60d0ed87f39cf7d5a8e350
+2404800 007574d68dac9c4f91607ae1077b05c0394e9da87cad82d8efc920f752d947c0
+2405200 00184c4242fbcd575979107f6a0f9040d1873fbc48d606f6759da52c3ced87d3
+2405600 001b392f4bef65085a04ca389975b3ed42fae965d933152f1248ca1ca589e6c3
+2406000 001e4aba075ba633b8ad7f79704ae0ec486e4861482e86ce1bcd791f700ac6e9
+2406400 0018867cc75db62da321c0011d28ee3892a2b7fb55f4f88740b3a5a83cbc2e10
+2406800 00215d1a7e594637abff20c50db5e72914e2008ffe695e99b27a634c582f7457
+2407200 001f9f6d16eb0826cae423c7f5b1c9be7cab97f1f43156f9c60600f21c63106a
+2407600 001245fc5f829bec3db26630ad7c9a51a1fd99669035f66ab41e7790fe7b1b9d
+2408000 001b893907719478f6ae2fa9a673a6632942aeffa95b98ed20c477ada5396cb7
+2408400 00113b4a16d8e076f3dfe6250964cacc6fcdec235a685591a7264abdf92a8c36
+2408800 002fbc1b1325182ef8419bc3118e6c79d1dbed62ea665b3c7900656aba4e0a35
+2409200 001f0a8c467e598e8032c535b974c273eea839e8078c2b154724ddd132fd77af
+2409600 0013cb11e27ef00c30b63509d5421f4d9e3fcae15bb58ff59cb6deddf50312dc
+2410000 003562055f67b993af8e15649617dfa5ac9596ebe60f3aef82cefe757b972401
+2410400 001aa605b3120d9f312e118ff7fd4262b62e112fec65c5c9c753535223a98ff3
+2410800 0099af7fdca8353addc8baadcbde264b15660e0db61f52aaa0e7793160ead9da
+2411200 000635de7abcb55bb2b93c1ab04ccb802b17d5c88f6a6efdd3480e389de9b5b2
+2411600 00113848f9b8797931dbf481c481cfbb24360575bf2a49805823cef865634916
+2412000 000f6742293ff5ef97bb9be28647500afbae23fa86896326a7393b2d6d45b310
+2412400 0013e29c30e96db9c2309e0dd1bcae2bd3fe5e8bbea455c1bcb0a7189bd3e431
+2412800 001e404f3ef35c06248169aa4f0c4a0acfea14545f064fbb8c148f6cd0884c0e
+2413200 000c83c13e110c71eb729776deae6fc3bf8641dbd32cd3565ea0e386258d3833
+2413600 0000246eb0b7231fa7733128ebda3035802926787ffa37f8875ecce4de4760fb
+2414000 000e73156de990023f9abedea44aa6b3fe773da8dd2a748540aaaac189f7b4c6
+2414400 000af497ba3897498f01e19375373ea445567d79603eb1c31e8087672817fb23
+2414800 001d3546ec3934694333b807ddc094ce788f123007e118098f97516758855a64
+2415200 0024b3d2b66a83dc985f478043ea92f28d4fb2e282d058b709191603c50fb0a2
+2415600 0011f73490bd8e9bc0dec7b71ae9763b51bde03808bd7c12f672ca280ccefca0
+2416000 0009a7c7a04dd18e1e9f9b3547b90051d2ff2ca49deb8501e61522d59926f4d5
+2416400 000ff62d148ece31ac95244231e0b2afc6594064b42821a6b7a6dd7f44012a67
+2416800 0001f2f6e77ddfd2b26f6effd5e69b395dbfb444375336c2fa33b8171470cd92
+2417200 000a1eb94898508f9240bb084a15d17dd339a8dc645a0f02140a760a96e348a1
+2417600 0009122adddb8203272b43f810e0b91ddee7b50023a4ad4ef3bec6cd6e8b3b82
+2418000 00b572de4fc8f36553fedd6f8052abf9ef3e23379672585dba56e51ab0d28943
+2418400 000e1452a59a48d05e696ddc6c2c855b970ad8b75d6ae27a10b89350426dc2bf
+2418800 001327fa234866e2a63c5303ff72a9c2ae1a7cb62681d0418c28f308c61bd304
+2419200 0016c2fda05b563490258c503c6e77b7bb76a51d637968f1c8f768709a55f6ec
+2419600 000453e2a08768d6eb42fc12e194206ef9b319e5b05aa7901ea0c26241860009
+2420000 00036ebc9345e3404b47395118cee2f30a3b1e526e2ac1309675f3a04409fd16
+2420400 00095db89b9b48847b864aa2235a864b98f5745f0c386ebcd4dc62213ff4a62d
+2420800 002250914adffa2990ab8065b7a83b3e209792b40173d68ac77f1db74b87ab61
+2421200 0018a36332d5413807371cc524205aa52f3abef4497215a4a8cb554f61418ee6
+2421600 000fb66dfdde35a7b270f6059fe2d6e37839ad52518721bf26fc2c9751cd463b
+2422000 000b3f76cfd75aecfa369de06ffc5cc3887dacb3b52d08401dc716864de010bb
+2422400 0015215a0dbb7ff3495a358120d392955a78d228213db9a6c712517b0580d332
+2422800 000831a8b66f9b6c2843332d6a902e8d63e1fa5db82041fd333ddae0f6698b66
+2423200 00028a73f946360c3f666e6136976e8922ab3325476318eae443e5bb67089cdc
+2423600 0027da308c8c2cc1b7d119e58a2667547d0ee303cfe2f79cbdf8a9dda929d240
+2424000 00061c81c151c285e03fe2858624ccf0a5b9d1978a34350874e817361fdfcdac
+2424400 0017a3a30f6590348b91c38a6ec391de9c13cb165bac6df0a2be1d31d8ce64b5
+2424800 000d5f96aa63c9a43c2f93a5abad4549bc4def6791deee9988959b9c8db98525
+2425200 0016128ab597f53bd775f80b5ffd21a92c941b246c449bd224bcb5bbb43eb1e2
+2425600 0001f32b316f38b44651da105fe3f5cb7ac6f666418cc2f8112815ac41846767
+2426000 001d221d7777f6fa2c8607a98b43ef3a58958a15508a6ca8acaa244e67d8f82f
+2426400 0010bc73ac2042cb1eeee66bdecda69d609e033416765efa70150337f91365f4
+2426800 000b9219464787ec2129f70fb3abaed943cf7684e182890789992cb492cfe7ae
+2427200 00104b3e83562c2f114e01b277c93084d62794680208e4da6ebd6ea79d82f5fe
+2427600 0119c00e0ddf4c0f69c01cd7120664128648bd39e0ed589ffd1605406d46d633
+2428000 000fe605457e5b68313b1822a1b3f76eca5f8f3044acde6870afe1e1be25504a
+2428400 0019de074ee2032cece66e85144729274c7cf16a81dc89176ddc9f4617dac926
+2428800 00046f19373ffa9c354dc7a971cc1857495fb547ea808938cf93aec57f6d2120
+2429200 00087c7ee96c3358d4793e4c64b0b86b9c092b8e162192c7e15f2fd73ebb4d50
+2429600 0006481c064325f6890cf9721cf2bc768d37e177dca971d7d80c283e78d150fe
diff --git a/zebra-consensus/src/checkpoint/tests.rs b/zebra-consensus/src/checkpoint/tests.rs
index 66331310735..9fb29048c40 100644
--- a/zebra-consensus/src/checkpoint/tests.rs
+++ b/zebra-consensus/src/checkpoint/tests.rs
@@ -254,7 +254,7 @@ async fn continuous_blockchain(
// - checkpoints start at genesis
// - checkpoints end at the end of the range (there's no point in having extra blocks)
let expected_max_height = block::Height((blockchain_len - 1).try_into().unwrap());
- let checkpoint_list = vec![
+ let checkpoint_list = [
&blockchain[0],
&blockchain[blockchain_len / 3],
&blockchain[blockchain_len / 2],
@@ -326,7 +326,7 @@ async fn continuous_blockchain(
// SPANDOC: Add block directly to the state {?height}
ready_state_service
- .call(zebra_state::Request::CommitFinalizedBlock(
+ .call(zebra_state::Request::CommitCheckpointVerifiedBlock(
block.clone().into(),
))
.await
diff --git a/zebra-consensus/src/lib.rs b/zebra-consensus/src/lib.rs
index cb53cedb9aa..7b8f58f9c90 100644
--- a/zebra-consensus/src/lib.rs
+++ b/zebra-consensus/src/lib.rs
@@ -41,8 +41,8 @@ mod parameters;
mod primitives;
mod script;
-pub mod chain;
pub mod error;
+pub mod router;
pub mod transaction;
pub use block::{
@@ -55,7 +55,6 @@ pub use block::{
},
Request, VerifyBlockError, MAX_BLOCK_SIGOPS,
};
-pub use chain::VerifyChainError;
pub use checkpoint::{
CheckpointList, VerifyCheckpointError, MAX_CHECKPOINT_BYTE_COUNT, MAX_CHECKPOINT_HEIGHT_GAP,
};
@@ -63,6 +62,7 @@ pub use config::Config;
pub use error::BlockError;
pub use parameters::FundingStreamReceiver;
pub use primitives::{ed25519, groth16, halo2, redjubjub, redpallas};
+pub use router::RouterError;
/// A boxed [`std::error::Error`].
pub type BoxError = Box;
diff --git a/zebra-consensus/src/primitives.rs b/zebra-consensus/src/primitives.rs
index 333ff1156f9..e3ab3a4f865 100644
--- a/zebra-consensus/src/primitives.rs
+++ b/zebra-consensus/src/primitives.rs
@@ -1,5 +1,9 @@
//! Asynchronous verification of cryptographic primitives.
+use tokio::sync::oneshot::error::RecvError;
+
+use crate::BoxError;
+
pub mod ed25519;
pub mod groth16;
pub mod halo2;
@@ -11,3 +15,37 @@ const MAX_BATCH_SIZE: usize = 64;
/// The maximum latency bound for any of the batch verifiers.
const MAX_BATCH_LATENCY: std::time::Duration = std::time::Duration::from_millis(100);
+
+/// Fires off a task into the Rayon threadpool, awaits the result through a oneshot channel,
+/// then converts the error to a [`BoxError`].
+pub async fn spawn_fifo_and_convert<
+ E: 'static + std::error::Error + Into + Sync + Send,
+ F: 'static + FnOnce() -> Result<(), E> + Send,
+>(
+ f: F,
+) -> Result<(), BoxError> {
+ spawn_fifo(f)
+ .await
+ .map_err(|_| {
+ "threadpool unexpectedly dropped response channel sender. Is Zebra shutting down?"
+ })?
+ .map_err(BoxError::from)
+}
+
+/// Fires off a task into the Rayon threadpool and awaits the result through a oneshot channel.
+pub async fn spawn_fifo<
+ E: 'static + std::error::Error + Sync + Send,
+ F: 'static + FnOnce() -> Result<(), E> + Send,
+>(
+ f: F,
+) -> Result, RecvError> {
+ // Rayon doesn't have a spawn function that returns a value,
+ // so we use a oneshot channel instead.
+ let (rsp_tx, rsp_rx) = tokio::sync::oneshot::channel();
+
+ rayon::spawn_fifo(move || {
+ let _ = rsp_tx.send(f());
+ });
+
+ rsp_rx.await
+}
diff --git a/zebra-consensus/src/primitives/ed25519.rs b/zebra-consensus/src/primitives/ed25519.rs
index 22b7f76613c..7a17ac9e14a 100644
--- a/zebra-consensus/src/primitives/ed25519.rs
+++ b/zebra-consensus/src/primitives/ed25519.rs
@@ -11,13 +11,16 @@ use futures::{future::BoxFuture, FutureExt};
use once_cell::sync::Lazy;
use rand::thread_rng;
-use rayon::prelude::*;
use tokio::sync::watch;
use tower::{util::ServiceFn, Service};
-use tower_batch::{Batch, BatchControl};
+use tower_batch_control::{Batch, BatchControl};
use tower_fallback::Fallback;
use zebra_chain::primitives::ed25519::{batch, *};
+use crate::BoxError;
+
+use super::{spawn_fifo, spawn_fifo_and_convert};
+
#[cfg(test)]
mod tests;
@@ -43,7 +46,10 @@ pub type Item = batch::Item;
/// you should call `.clone()` on the global handle to create a local, mutable
/// handle.
pub static VERIFIER: Lazy<
- Fallback, ServiceFn BoxFuture<'static, VerifyResult>>>,
+ Fallback<
+ Batch,
+ ServiceFn BoxFuture<'static, Result<(), BoxError>>>,
+ >,
> = Lazy::new(|| {
Fallback::new(
Batch::new(
@@ -120,43 +126,22 @@ impl Verifier {
/// Flush the batch using a thread pool, and return the result via the channel.
/// This function returns a future that becomes ready when the batch is completed.
- fn flush_spawning(batch: BatchVerifier, tx: Sender) -> impl Future