Skip to content

Commit 94bde57

Browse files
committed
Merge rust-bitcoin#4639: feat(p2p): create NetworkExt trait for default P2P port and Magic values
eba1204 feat(p2p): create `NetworkExt` trait for default P2P port and network `Magic` values (Luis Schwab) Pull request description: Closes rust-bitcoin#4632. ~~Depends on rust-bitcoin#4640.~~ This PR introduces the `NetworkExt` trait that extends `Network` with getters for default P2P port and network `Magic` bytes. ## Changelog - Create `NetworkExt` trait. - Implement `default_p2p_port` for `Network`. - Implement `default_network_magic` for `Network`. ACKs for top commit: tcharding: ACK eba1204 apoelstra: ACK eba1204; successfully ran local tests Tree-SHA512: 83e05981b54e04f047ae6778755ba9f872634be18aedc179c86134f8ecae53d76a16c0a0caa7824f475ef83b0446acd94c3d2f2941fb5403191feb6773a30fb3
2 parents 4b2226c + eba1204 commit 94bde57

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

p2p/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub mod message_bloom;
2323
pub mod message_compact_blocks;
2424
pub mod message_filter;
2525
pub mod message_network;
26+
mod network_ext;
2627

2728
extern crate alloc;
2829

@@ -38,7 +39,7 @@ use io::{BufRead, Write};
3839

3940
#[rustfmt::skip]
4041
#[doc(inline)]
41-
pub use self::address::Address;
42+
pub use self::{address::Address, network_ext::NetworkExt};
4243

4344
/// Version of the protocol as appearing in network message headers.
4445
///

p2p/src/network_ext.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// SPDX-License-Identifier: CC0-1.0
2+
3+
//! This module implements an extension trait for [`Network`]
4+
//! with getter methods for the default P2P port and default
5+
//! network [`Magic`] bytes.
6+
7+
use bitcoin::{Network, TestnetVersion};
8+
9+
use crate::Magic;
10+
11+
/// Trait that extends [`Network`] by adding getter methods for the default P2P ports and [`Magic`] bytes.
12+
pub trait NetworkExt {
13+
/// The default P2P port for a given [`Network`].
14+
fn default_p2p_port(self) -> u16;
15+
16+
/// The default network [`Magic`] for a given [`Network`].
17+
fn default_network_magic(self) -> Magic;
18+
}
19+
20+
impl NetworkExt for Network {
21+
/// The default P2P port for a given [`Network`].
22+
///
23+
/// Note: All [`TestnetVersion`] variants >4 are treated as [`TestnetVersion::V4`].
24+
/// This function will be updated as new test networks are defined.
25+
fn default_p2p_port(self) -> u16 {
26+
match &self {
27+
Network::Bitcoin => 8333,
28+
Network::Signet => 38333,
29+
Network::Testnet(TestnetVersion::V3) => 18333,
30+
Network::Testnet(TestnetVersion::V4) => 48333,
31+
Network::Testnet(_) => 48333,
32+
Network::Regtest => 18444,
33+
}
34+
}
35+
36+
/// The default network [`Magic`] for a given [`Network`].
37+
///
38+
/// Note: All [`TestnetVersion`] variants >4 are treated as [`TestnetVersion::V4`].
39+
/// This function will be updated as new test networks are defined.
40+
fn default_network_magic(self) -> Magic {
41+
match &self {
42+
Network::Bitcoin => Magic::BITCOIN,
43+
Network::Signet => Magic::SIGNET,
44+
Network::Testnet(TestnetVersion::V3) => Magic::TESTNET3,
45+
Network::Testnet(TestnetVersion::V4) => Magic::TESTNET4,
46+
Network::Testnet(_) => Magic::TESTNET4,
47+
Network::Regtest => Magic::REGTEST,
48+
}
49+
}
50+
}
51+
52+
#[cfg(test)]
53+
mod tests {
54+
use super::*;
55+
56+
#[test]
57+
fn default_p2p_port() {
58+
let networks = [
59+
Network::Bitcoin,
60+
Network::Signet,
61+
Network::Testnet(TestnetVersion::V3),
62+
Network::Testnet(TestnetVersion::V4),
63+
Network::Regtest,
64+
];
65+
66+
let p2p_ports = vec![8333, 38333, 18333, 48333, 18444];
67+
68+
for (network, p2p_port) in networks.iter().zip(p2p_ports) {
69+
assert_eq!(network.default_p2p_port(), p2p_port);
70+
}
71+
}
72+
73+
#[test]
74+
fn default_network_magic() {
75+
let networks = [
76+
Network::Bitcoin,
77+
Network::Signet,
78+
Network::Testnet(TestnetVersion::V3),
79+
Network::Testnet(TestnetVersion::V4),
80+
Network::Regtest,
81+
];
82+
83+
let network_magics =
84+
vec![Magic::BITCOIN, Magic::SIGNET, Magic::TESTNET3, Magic::TESTNET4, Magic::REGTEST];
85+
86+
for (network, network_magic) in networks.iter().zip(network_magics) {
87+
assert_eq!(network.default_network_magic(), network_magic);
88+
}
89+
}
90+
}

0 commit comments

Comments
 (0)