fedimint_server/config/
dkg.rs

1use std::collections::BTreeMap;
2
3use anyhow::Context;
4use async_trait::async_trait;
5use bls12_381::{G1Projective, G2Projective, Scalar};
6use fedimint_core::config::P2PMessage;
7use fedimint_core::net::peers::Recipient;
8use fedimint_core::{NumPeers, PeerId};
9use fedimint_logging::LOG_NET_PEER_DKG;
10use fedimint_server_core::config::PeerHandleOps;
11use tracing::info;
12
13use super::dkg_g1::run_dkg_g1;
14use super::dkg_g2::run_dkg_g2;
15use super::peer_handle::PeerHandle;
16
17#[async_trait]
18impl PeerHandleOps for PeerHandle<'_> {
19    fn num_peers(&self) -> NumPeers {
20        self.num_peers
21    }
22
23    async fn run_dkg_g1(&self) -> anyhow::Result<(Vec<G1Projective>, Scalar)> {
24        info!(
25            target: LOG_NET_PEER_DKG,
26            "Running distributed key generation for group G1..."
27        );
28
29        run_dkg_g1(self.num_peers, self.identity, self.connections).await
30    }
31
32    async fn run_dkg_g2(&self) -> anyhow::Result<(Vec<G2Projective>, Scalar)> {
33        info!(
34            target: LOG_NET_PEER_DKG,
35            "Running distributed key generation for group G2..."
36        );
37
38        run_dkg_g2(self.num_peers, self.identity, self.connections).await
39    }
40
41    async fn exchange_bytes(&self, bytes: Vec<u8>) -> anyhow::Result<BTreeMap<PeerId, Vec<u8>>> {
42        info!(
43            target: LOG_NET_PEER_DKG,
44            "Exchanging raw bytes..."
45        );
46
47        let mut peer_data: BTreeMap<PeerId, Vec<u8>> = BTreeMap::new();
48
49        self.connections
50            .send(Recipient::Everyone, P2PMessage::Encodable(bytes.clone()));
51
52        peer_data.insert(self.identity, bytes);
53
54        for peer in self.num_peers.peer_ids().filter(|p| *p != self.identity) {
55            let message = self
56                .connections
57                .receive_from_peer(peer)
58                .await
59                .context("Unexpected shutdown of p2p connections")?;
60
61            match message {
62                P2PMessage::Encodable(bytes) => {
63                    peer_data.insert(peer, bytes);
64                }
65                message => {
66                    anyhow::bail!("Invalid message from {peer}: {message:?}");
67                }
68            }
69        }
70
71        Ok(peer_data)
72    }
73}