diff --git a/src/protocols/light_client/mod.rs b/src/protocols/light_client/mod.rs index 942ec9c..d6845c5 100644 --- a/src/protocols/light_client/mod.rs +++ b/src/protocols/light_client/mod.rs @@ -852,11 +852,35 @@ impl LightClientProtocol { } let builder = packed::GetLastStateProof::new_builder() .last_hash(last_header.header().hash()) - .start_hash(start_hash) - .start_number(start_number.pack()) .last_n_blocks(last_n_blocks.pack()); let content = if last_number - start_number <= last_n_blocks { - builder.difficulty_boundary(start_total_difficulty.pack()) + let last_n_headers = self.storage.get_last_n_headers(); + let mut real_start_hash = start_hash; + let mut real_start_number = start_number; + // Find the number which satisfies that `last_number - number > last_n_blocks`. + // If not found, then choose the smallest number. + for (num, hash) in last_n_headers + .into_iter() + .rev() + // `skip_while` should do nothing, just for safety. + .skip_while(|(n, _)| *n >= start_number) + { + if real_start_number <= num { + continue; + } + if last_number > num + last_n_blocks { + break; + } + real_start_hash = hash; + real_start_number = num; + if last_number == num + last_n_blocks { + break; + } + } + builder + .start_hash(real_start_hash) + .start_number(real_start_number.pack()) + .difficulty_boundary(start_total_difficulty.pack()) } else { let (difficulty_boundary, difficulties) = sampling::sample_blocks( start_number, @@ -866,6 +890,8 @@ impl LightClientProtocol { last_n_blocks, ); builder + .start_hash(start_hash) + .start_number(start_number.pack()) .difficulty_boundary(difficulty_boundary.pack()) .difficulties(difficulties.into_iter().map(|inner| inner.pack()).pack()) }