Skip to content

Commit

Permalink
feat: dummy service can update multiple headers at once
Browse files Browse the repository at this point in the history
  • Loading branch information
yangby-cryptape committed Mar 16, 2024
1 parent b3e1f23 commit 3630867
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 42 deletions.
80 changes: 44 additions & 36 deletions prover/src/dummy_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,51 +47,59 @@ impl DummyService {
})
}

pub fn update(&mut self, header: core::Header) -> Result<packed::SpvUpdate> {
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<core::Header>) -> Result<packed::SpvUpdate> {
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)?
Expand All @@ -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())
}
Expand Down
2 changes: 1 addition & 1 deletion prover/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
mod block;
mod dummy_service;
mod result;
pub(crate) mod utilities;
pub mod utilities;

#[cfg(test)]
mod tests;
Expand Down
2 changes: 1 addition & 1 deletion prover/src/tests/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion verifier/src/types/conversion/pack.rs
Original file line number Diff line number Diff line change
@@ -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::*};

Expand Down
2 changes: 0 additions & 2 deletions verifier/src/types/conversion/unpack.rs
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
1 change: 1 addition & 0 deletions verifier/src/types/prelude.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
1 change: 0 additions & 1 deletion verifier/src/utilities/mmr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::{
Expand Down

0 comments on commit 3630867

Please sign in to comment.