From 3630867531c23cd2eb4e5795e1fb56a0a7d3e277 Mon Sep 17 00:00:00 2001 From: Boyu Yang Date: Sat, 16 Mar 2024 15:17:31 +0800 Subject: [PATCH] feat: dummy service can update multiple headers at once --- prover/src/dummy_service.rs | 80 ++++++++++++++----------- prover/src/lib.rs | 2 +- prover/src/tests/service.rs | 2 +- verifier/src/types/conversion/pack.rs | 1 - verifier/src/types/conversion/unpack.rs | 2 - verifier/src/types/prelude.rs | 1 + verifier/src/utilities/mmr.rs | 1 - 7 files changed, 47 insertions(+), 42 deletions(-) diff --git a/prover/src/dummy_service.rs b/prover/src/dummy_service.rs index 4e83255..2c81c27 100644 --- a/prover/src/dummy_service.rs +++ b/prover/src/dummy_service.rs @@ -47,51 +47,59 @@ impl DummyService { }) } - pub fn update(&mut self, header: core::Header) -> Result { - let height = self.client.headers_mmr_root.max_height + 1; - let positions = { - let index = height - self.client.headers_mmr_root.min_height; - let position = mmr::lib::leaf_index_to_pos(u64::from(index)); - vec![position] - }; + pub fn update(&mut self, headers: Vec) -> Result { let mut mmr = { let last_index = self.client.headers_mmr_root.max_height - self.client.headers_mmr_root.min_height; let mmr_size = mmr::lib::leaf_index_to_mmr_size(u64::from(last_index)); mmr::ClientRootMMR::new(mmr_size, &self.store) }; - let block_hash = header.block_hash().into(); - let digest = core::HeaderDigest::new_leaf(height, block_hash).pack(); - mmr.push(digest)?; - - match (height + 1) % DIFFCHANGE_INTERVAL { - 0 => { - let curr_target: core::Target = header.bits.into(); - log::trace!( - ">>> height {height:07}, time: {}, target {curr_target:#x}", - header.time - ); - let start_time: u32 = self.client.target_adjust_info.start_time().unpack(); - let next_target = calculate_next_target(curr_target, start_time, header.time); - log::info!(">>> calculated new target {next_target:#x}"); - let next_bits = next_target.to_compact_lossy(); - let next_target: core::Target = next_bits.into(); - log::info!(">>> after definition lossy {next_target:#x}"); - - self.client.target_adjust_info = - packed::TargetAdjustInfo::encode(start_time, next_bits); - } - 1 => { - self.client.target_adjust_info = - packed::TargetAdjustInfo::encode(header.time, header.bits); - } - _ => {} - }; + + let mut positions = Vec::new(); + let mut block_hash = core::Hash::all_zeros(); + let mut height = 0; + + for header in &headers { + height = self.client.headers_mmr_root.max_height + 1; + + let index = height - self.client.headers_mmr_root.min_height; + let position = mmr::lib::leaf_index_to_pos(u64::from(index)); + + block_hash = header.block_hash().into(); + let digest = core::HeaderDigest::new_leaf(height, block_hash).pack(); + + positions.push(position); + mmr.push(digest)?; + self.headers.insert(height, header.to_owned()); + + match (height + 1) % DIFFCHANGE_INTERVAL { + 0 => { + let curr_target: core::Target = header.bits.into(); + log::trace!( + ">>> height {height:07}, time: {}, target {curr_target:#x}", + header.time + ); + let start_time: u32 = self.client.target_adjust_info.start_time().unpack(); + let next_target = calculate_next_target(curr_target, start_time, header.time); + log::info!(">>> calculated new target {next_target:#x}"); + let next_bits = next_target.to_compact_lossy(); + let next_target: core::Target = next_bits.into(); + log::info!(">>> after definition lossy {next_target:#x}"); + + self.client.target_adjust_info = + packed::TargetAdjustInfo::encode(start_time, next_bits); + } + 1 => { + self.client.target_adjust_info = + packed::TargetAdjustInfo::encode(header.time, header.bits); + } + _ => {} + }; + } self.client.tip_block_hash = block_hash; self.client.headers_mmr_root.max_height = height; self.client.headers_mmr_root = mmr.get_root()?.unpack(); - self.headers.insert(height, header); let headers_mmr_proof_items = mmr .gen_proof(positions)? @@ -104,7 +112,7 @@ impl DummyService { .set(headers_mmr_proof_items) .build(); Ok(packed::SpvUpdate::new_builder() - .headers(vec![header].pack()) + .headers(headers.pack()) .new_headers_mmr_proof(headers_mmr_proof) .build()) } diff --git a/prover/src/lib.rs b/prover/src/lib.rs index ee9de23..7b1ed9d 100644 --- a/prover/src/lib.rs +++ b/prover/src/lib.rs @@ -3,7 +3,7 @@ mod block; mod dummy_service; mod result; -pub(crate) mod utilities; +pub mod utilities; #[cfg(test)] mod tests; diff --git a/prover/src/tests/service.rs b/prover/src/tests/service.rs index 3274e18..1700358 100644 --- a/prover/src/tests/service.rs +++ b/prover/src/tests/service.rs @@ -58,7 +58,7 @@ fn test_spv_client( .unwrap(); log::trace!("process header-{height} from file {}", header_bin.display()); - let update = service.update(header).unwrap(); + let update = service.update(vec![header]).unwrap(); let new_client: packed::SpvClient = service.tip_client().pack(); old_client diff --git a/verifier/src/types/conversion/pack.rs b/verifier/src/types/conversion/pack.rs index 4817936..c50cfc0 100644 --- a/verifier/src/types/conversion/pack.rs +++ b/verifier/src/types/conversion/pack.rs @@ -1,7 +1,6 @@ use alloc::vec::Vec; use bitcoin::consensus::serialize; -use bitcoin_hashes::Hash as _; use crate::types::{bytes::Bytes, core, packed, prelude::*}; diff --git a/verifier/src/types/conversion/unpack.rs b/verifier/src/types/conversion/unpack.rs index 23d6dbc..5462119 100644 --- a/verifier/src/types/conversion/unpack.rs +++ b/verifier/src/types/conversion/unpack.rs @@ -1,7 +1,5 @@ use alloc::borrow::ToOwned; -use bitcoin_hashes::Hash as _; - use crate::types::{core, packed, prelude::*}; macro_rules! impl_conversion_for_entity_unpack { diff --git a/verifier/src/types/prelude.rs b/verifier/src/types/prelude.rs index 21f220e..054b907 100644 --- a/verifier/src/types/prelude.rs +++ b/verifier/src/types/prelude.rs @@ -2,6 +2,7 @@ //! //! Few traits are re-exported from other crates, few are used as aliases and others are syntactic sugar. +pub use bitcoin_hashes::Hash; pub use molecule::prelude::{Builder, Entity, Reader}; /// A syntactic sugar to convert a rust type into binary data. diff --git a/verifier/src/utilities/mmr.rs b/verifier/src/utilities/mmr.rs index cec7618..5d2cbdb 100644 --- a/verifier/src/utilities/mmr.rs +++ b/verifier/src/utilities/mmr.rs @@ -4,7 +4,6 @@ use alloc::format; -use bitcoin_hashes::Hash as _; use ckb_mmr::{Error as MMRError, Merge, MerkleProof, Result as MMRResult, MMR}; use crate::{