1use bitcoin::key::rand::distributions::Standard;
8use bitcoin::key::rand::prelude::Distribution;
9use bitcoin::key::rand::{thread_rng, Rng};
10use bitcoin::p2p::address::AddrV2;
11use bitcoin::p2p::ServiceFlags;
12
13use crate::chain::IndexedHeader;
14
15pub mod error;
17#[cfg(feature = "rusqlite")]
19pub mod sqlite;
20pub mod traits;
22
23#[derive(Debug, Clone, PartialEq)]
25pub struct PersistedPeer {
26 pub addr: AddrV2,
28 pub port: u16,
30 pub services: ServiceFlags,
32 pub status: PeerStatus,
34}
35
36impl PersistedPeer {
37 pub fn new(addr: AddrV2, port: u16, services: ServiceFlags, status: PeerStatus) -> Self {
39 Self {
40 addr,
41 port,
42 services,
43 status,
44 }
45 }
46
47 pub(crate) fn gossiped(addr: AddrV2, port: u16, services: ServiceFlags) -> Self {
48 Self {
49 addr,
50 port,
51 services,
52 status: PeerStatus::Gossiped,
53 }
54 }
55}
56
57impl From<PersistedPeer> for (AddrV2, u16) {
58 fn from(value: PersistedPeer) -> Self {
59 (value.addr, value.port)
60 }
61}
62
63#[derive(Debug, Clone, PartialEq, PartialOrd)]
65pub enum PeerStatus {
66 Gossiped,
68 Tried,
70 Ban,
72}
73
74impl Distribution<PeerStatus> for Standard {
75 fn sample<R: bitcoin::key::rand::Rng + ?Sized>(&self, rng: &mut R) -> PeerStatus {
76 match rng.gen_range(0..=1) {
77 0 => PeerStatus::Gossiped,
78 _ => PeerStatus::Tried,
79 }
80 }
81}
82
83impl PeerStatus {
84 pub(crate) fn random() -> PeerStatus {
85 let mut rng = thread_rng();
86 rng.gen()
87 }
88}
89
90#[derive(Debug, Clone)]
92pub enum BlockHeaderChanges {
93 Connected(IndexedHeader),
95 Reorganized {
97 accepted: Vec<IndexedHeader>,
99 reorganized: Vec<IndexedHeader>,
101 },
102}