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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
crate::ix!();

pub struct PeerManagerInner {

    pub txrequest:                Arc<Mutex<TxRequestTracker>>,

    /**
      | Number of nodes with fSyncStarted.
      | 
      */
    pub n_sync_started:           i32, // default = 0

    /**
      | Sources of received blocks, saved to
      | be able punish them when processing
      | happens afterwards.
      | 
      | Set mapBlockSource[hash].second
      | to false if the node should not be punished
      | if the block is invalid.
      |
      */
    pub map_block_source:         HashMap<u256,(NodeId,bool)>,

    /**
      | Number of peers with wtxid relay.
      |
      */
    pub wtxid_relay_peers:        AtomicI32, // default = 0

    /**
      | Number of outbound peers with m_chain_sync.m_protect.
      |
      */
    pub outbound_peers_with_protect_from_disconnect: AtomicI32, // default = 0

    /**
      | Filter for transactions that were recently
      | rejected by
      | 
      | AcceptToMemoryPool. These are not
      | rerequested until the chain tip changes,
      | at which point the entire filter is reset.
      | 
      | Without this filter we'd be re-requesting
      | txs from each of our peers, increasing
      | bandwidth consumption considerably.
      | For instance, with 100 peers, half of
      | which relay a tx we don't accept, that
      | might be a 50x bandwidth increase. A
      | flooding attacker attempting to roll-over
      | the filter using minimum-sized, 60byte,
      | transactions might manage to send 1000/sec
      | if we have fast peers, so we pick 120,000
      | to give our peers a two minute window
      | to send invs to us.
      | 
      | Decreasing the false positive rate
      | is fairly cheap, so we pick one in a million
      | to make it highly unlikely for users
      | to have issues with this filter.
      | 
      | We typically only add wtxids to this
      | filter. For non-segwit transactions,
      | the txid == wtxid, so this only prevents
      | us from re-downloading non-segwit
      | transactions when communicating with
      | non-wtxidrelay peers -- which is important
      | for avoiding malleation attacks that
      | could otherwise interfere with transaction
      | relay from non-wtxidrelay peers. For
      | communicating with wtxidrelay peers,
      | having the reject filter store wtxids
      | is exactly what we want to avoid redownload
      | of a rejected transaction.
      | 
      | In cases where we can tell that a segwit
      | transaction will fail validation no
      | matter the witness, we may add the txid
      | of such transaction to the filter as
      | well. This can be helpful when communicating
      | with txid-relay peers or if we were to
      | otherwise fetch a transaction via txid
      | (eg in our orphan handling).
      | 
      | Memory used: 1.3 MB
      | 
      |
      */
    pub recent_rejects:                    RollingBloomFilter,

    pub hash_recent_rejects_chain_tip:     u256,

    pub map_blocks_in_flight:              Arc<Mutex<HashMap<u256,(NodeId, QueuedBlockIter)>>>,

    /**
      | Relay map (txid or wtxid -> CTransactionRef)
      |
      */
    pub map_relay:                         PeerManagerMapRelay,

    /**
      | Expiration-time ordered list of (expire
      | time, relay map entry) pairs.
      | 
      |
      */
    pub g_relay_expiration:                VecDeque<(OffsetDateTime /* micros */,PeerManagerMapRelayIterator)>,

    /**
      | Stack of nodes which we have set to announce
      | using compact blocks
      | 
      |
      */
    pub l_nodes_announcing_header_and_ids: VecDeque<NodeId>,

    /**
      | Number of peers from which we're downloading
      | blocks.
      | 
      |
      */
    pub peers_downloading_from:            AtomicI32, // default = 0
}