fedimint_testing_core/
config.rs

1use std::collections::{BTreeMap, HashMap};
2use std::sync::{Arc, LazyLock};
3
4use fedimint_core::PeerId;
5use fedimint_core::module::ApiAuth;
6use fedimint_core::setup_code::{PeerEndpoints, PeerSetupCode};
7use fedimint_server::config::ConfigGenParams;
8use fedimint_server::net::p2p_connector::gen_cert_and_key;
9use tokio_rustls::rustls;
10
11pub static API_AUTH: LazyLock<ApiAuth> = LazyLock::new(|| ApiAuth("pass".to_string()));
12
13/// Creates the config gen params for each peer
14///
15/// Uses peers * 2 ports offset from `base_port`
16pub fn local_config_gen_params(
17    peers: &[PeerId],
18    base_port: u16,
19) -> anyhow::Result<HashMap<PeerId, ConfigGenParams>> {
20    // Generate TLS cert and private key
21    let tls_keys: HashMap<
22        PeerId,
23        (
24            rustls::pki_types::CertificateDer<'static>,
25            Arc<rustls::pki_types::PrivateKeyDer<'static>>,
26        ),
27    > = peers
28        .iter()
29        .map(|peer| {
30            (
31                *peer,
32                gen_cert_and_key(&format!("peer-{}", peer.to_usize())).unwrap(),
33            )
34        })
35        .collect();
36
37    // Generate the P2P and API URL on 2 different ports for each peer
38    let connections: BTreeMap<PeerId, PeerSetupCode> = peers
39        .iter()
40        .map(|peer| {
41            let peer_port = base_port + u16::from(*peer) * 3;
42
43            let p2p_url = format!("fedimint://127.0.0.1:{peer_port}");
44            let api_url = format!("ws://127.0.0.1:{}", peer_port + 1);
45
46            let params = PeerSetupCode {
47                name: format!("peer-{}", peer.to_usize()),
48                endpoints: PeerEndpoints::Tcp {
49                    api_url: api_url.parse().expect("Should parse"),
50                    p2p_url: p2p_url.parse().expect("Should parse"),
51                    cert: tls_keys[peer].0.as_ref().to_vec(),
52                },
53                federation_name: None,
54            };
55            (*peer, params)
56        })
57        .collect();
58
59    peers
60        .iter()
61        .map(|peer| {
62            let params = ConfigGenParams {
63                identity: *peer,
64                api_auth: API_AUTH.clone(),
65                tls_key: Some(tls_keys[peer].1.clone()),
66                iroh_api_sk: None,
67                iroh_p2p_sk: None,
68                peers: connections.clone(),
69                meta: BTreeMap::new(),
70            };
71            Ok((*peer, params))
72        })
73        .collect()
74}