1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
crate::ix!();

/**
  | State used to enforce CHAIN_SYNC_TIMEOUT
  | and EXTRA_PEER_CHECK_INTERVAL logic.
  | 
  | Both are only in effect for outbound,
  | non-manual, non-protected connections.
  | 
  | Any peer protected (m_protect = true)
  | is not chosen for eviction. A peer is
  | marked as protected if all of these are
  | true:
  | 
  | - its connection type is IsBlockOnlyConn() == false
  | 
  | - it gave us a valid connecting header
  | 
  | - we haven't reached MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT
  | yet
  | 
  | - its chain tip has at least as much work
  | as ours
  | 
  | CHAIN_SYNC_TIMEOUT: if a peer's best
  | known block has less work than our tip,
  | set a timeout CHAIN_SYNC_TIMEOUT seconds
  | in the future:
  | 
  | - If at timeout their best known block
  | now has more work than our tip when the
  | timeout was set, then either reset the
  | timeout or clear it (after comparing
  | against our current tip's work)
  | 
  | - If at timeout their best known block
  | still has less work than our tip did when
  | the timeout was set, then send a getheaders
  | message, and set a shorter timeout,
  | HEADERS_RESPONSE_TIME seconds in
  | future.
  | 
  | If their best known block is still behind
  | when that new timeout is reached, disconnect.
  | 
  | EXTRA_PEER_CHECK_INTERVAL: after
  | each interval, if we have too many outbound
  | peers, drop the outbound one that least
  | recently announced us a new block.
  |
  */
pub struct NodeStateChainSyncTimeoutState {

    /**
      | A timeout used for checking whether
      | our peer has sufficiently synced
      |
      */
    pub timeout:         Option<OffsetDateTime>,

    /**
      | A header with the work we require on our
      | peer's chain
      |
      */
    pub work_header:     Option<Arc<BlockIndex>>,

    /**
      | After timeout is reached, set to true
      | after sending getheaders
      |
      */
    pub sent_getheaders: bool,

    /**
      | Whether this peer is protected from
      | disconnection due to a bad/slow chain
      |
      */
    pub protect:         bool,
}

impl Default for NodeStateChainSyncTimeoutState {

    fn default() -> Self {
        Self {
            timeout:         None,
            work_header:     None,
            sent_getheaders: false,
            protect:         false,
        }
    }
}