Skip to content

Commit 0dae1d5

Browse files
committed
Fix header hashes sync issue. Segmenter/desegmenter need to use the same method to calculate the number of hases to exchange
1 parent adb8d21 commit 0dae1d5

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

chain/src/chain.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1340,9 +1340,10 @@ impl Chain {
13401340
let mut segm_header_pmmr_backend: VecBackend<Hash> = VecBackend::new();
13411341
let mut segm_header_pmmr = PMMR::new(&mut segm_header_pmmr_backend);
13421342

1343-
for i in (0..header.height).step_by(HEADERS_PER_BATCH as usize) {
1343+
let hash_num = txhashset::calc_header_hashes_from_target_height(header.height);
1344+
for i in 0..hash_num {
13441345
let data = self
1345-
.get_header_hash_by_height(i)
1346+
.get_header_hash_by_height(i * HEADERS_PER_BATCH as u64)
13461347
.expect("Header data is expected below horizon");
13471348
segm_header_pmmr.push(&data).map_err(|s| {
13481349
Error::SyncError(format!("Unable to create Headers hash MMR, {}", s))

chain/src/txhashset/headers_desegmenter.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ pub struct HeaderHashesDesegmenter {
4747
pibd_params: Arc<PibdParams>,
4848
}
4949

50+
/// This formula must be the same for segmenter and desegmenter
51+
/// Both party needs to be onthe same page regarding the size of the data
52+
pub fn calc_header_hashes_from_target_height(target_height: u64) -> u64 {
53+
target_height / HEADERS_PER_BATCH as u64 + 1
54+
}
55+
5056
impl HeaderHashesDesegmenter {
5157
/// Create a new segmenter based on the provided txhashset and the specified block header
5258
pub fn new(
@@ -55,7 +61,7 @@ impl HeaderHashesDesegmenter {
5561
headers_root_hash: Hash, // target height and headers_root_hash must be get as a result of handshake process.
5662
pibd_params: Arc<PibdParams>,
5763
) -> Self {
58-
let n_leaves = target_height / HEADERS_PER_BATCH as u64 + 1;
64+
let n_leaves = calc_header_hashes_from_target_height(target_height);
5965
let header_pmmr_size = pmmr::insertion_to_pmmr_index(n_leaves);
6066
let header_segments = Desegmenter::generate_segments(
6167
Hash::LEN,

chain/tests/test_pibd_copy.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,8 @@ impl DesegmenterRequestor {
378378
}
379379
}
380380
fn test_pibd_copy_impl(src_root_dir: &str, dest_root_dir: &str) {
381-
global::set_global_chain_type(global::ChainTypes::Mainnet);
382-
let genesis = genesis::genesis_main();
381+
global::set_global_chain_type(global::ChainTypes::Floonet);
382+
let genesis = genesis::genesis_floo();
383383

384384
let src_responder = Arc::new(SegmenterResponder::new(src_root_dir, genesis.clone()));
385385

@@ -432,8 +432,8 @@ fn test_pibd_copy_real() {
432432
util::init_test_logger();
433433

434434
// if testing against a real chain, insert location here
435-
let src_root_dir = format!("/Users/bay/.mwc/main_orig/chain_data");
436-
let dest_root_dir = format!("/Users/bay/.mwc/main_copy/chain_data");
435+
let src_root_dir = format!("/Users/bay/.mwc/floo_orig");
436+
let dest_root_dir = format!("/Users/bay/.mwc/floo_copy");
437437

438438
//self::chain_test_helper::clean_output_dir(&dest_root_dir);
439439
test_pibd_copy_impl(&src_root_dir, &dest_root_dir);

0 commit comments

Comments
 (0)