Skip to content

Commit ae3c791

Browse files
zhangsoledaddoitian
authored andcommitted
fix: sync too-new headers
1 parent e10ca96 commit ae3c791

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

sync/src/synchronizer/headers_process.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ where
310310
// HeaderVerifier return HeaderError or UnknownParentError
311311
if let Some(header_error) = error.downcast_ref::<HeaderError>() {
312312
if header_error.is_too_new() {
313+
state.temporary_invalid(Some(ValidationError::Verify(error)));
313314
false
314315
} else {
315316
state.dos(Some(ValidationError::Verify(error)), 100);
@@ -390,13 +391,14 @@ where
390391

391392
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
392393
pub enum ValidationState {
393-
VALID,
394-
INVALID,
394+
Valid,
395+
TemporaryInvalid,
396+
Invalid,
395397
}
396398

397399
impl Default for ValidationState {
398400
fn default() -> Self {
399-
ValidationState::VALID
401+
ValidationState::Valid
400402
}
401403
}
402404

@@ -422,10 +424,15 @@ impl ValidationResult {
422424
pub fn dos(&mut self, error: Option<ValidationError>, misbehavior: u32) {
423425
self.error = error;
424426
self.misbehavior += misbehavior;
425-
self.state = ValidationState::INVALID;
427+
self.state = ValidationState::Invalid;
428+
}
429+
430+
pub fn temporary_invalid(&mut self, error: Option<ValidationError>) {
431+
self.error = error;
432+
self.state = ValidationState::TemporaryInvalid;
426433
}
427434

428435
pub fn is_valid(&self) -> bool {
429-
self.state == ValidationState::VALID
436+
self.state == ValidationState::Valid
430437
}
431438
}

test/src/specs/sync/block_sync.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -513,28 +513,32 @@ impl Spec for SyncTooNewBlock {
513513
net.exit_ibd_mode();
514514

515515
let future = Duration::from_secs(6_000).as_millis() as u64;
516-
let too_new_block = node0
517-
.new_block_builder(None, None, None)
518-
.timestamp((now_ms() + future).pack())
519-
.build();
520516

521-
// node1 sync node1 with too new block
522-
let _too_new_hash = node0.process_block_without_verify(&too_new_block, false);
517+
for _ in 0..3 {
518+
let too_new_block = node0
519+
.new_block_builder(None, None, None)
520+
.timestamp((now_ms() + future).pack())
521+
.build();
522+
523+
// node1 sync node1 with too new block
524+
let _too_new_hash = node0.process_block_without_verify(&too_new_block, false);
525+
}
526+
527+
let (rpc_client0, rpc_client1) = (node0.rpc_client(), node1.rpc_client());
523528
node1.connect(node0);
524529

525530
// sync node0 node2
526-
node2.generate_blocks(2);
531+
node2.generate_blocks(6);
527532
node2.connect(node0);
528533
node2.waiting_for_sync(node0, node2.get_tip_block_number());
529534
node2.disconnect(node0);
530535

531536
sleep(15); // GET_HEADERS_TIMEOUT 15s
532537
node0.generate_block();
533-
let (rpc_client0, rpc_client1) = (node0.rpc_client(), node1.rpc_client());
534538
let ret = wait_until(20, || {
535539
let header0 = rpc_client0.get_tip_header();
536540
let header1 = rpc_client1.get_tip_header();
537-
header0 == header1 && header1.inner.number.value() == 4
541+
header0 == header1 && header1.inner.number.value() == 8
538542
});
539543
assert!(ret, "Node1 should not ban Node0",);
540544
}

0 commit comments

Comments
 (0)