fedimint_server/config/
dkg.rs1use 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}