kona_node_service/actors/network/
driver.rs1use alloy_primitives::Address;
2use futures::future::OptionFuture;
3use kona_p2p::{ConnectionGater, Discv5Driver, GossipDriver, PEER_SCORE_INSPECT_FREQUENCY};
4use kona_sources::{BlockSigner, BlockSignerStartError};
5use libp2p::TransportError;
6use tokio::sync::watch;
7
8use crate::actors::network::handler::NetworkHandler;
9
10#[derive(Debug)]
12pub struct NetworkDriver {
13 pub gossip: GossipDriver<ConnectionGater>,
15 pub discovery: Discv5Driver,
17 pub unsafe_block_signer_sender: watch::Sender<Address>,
19 pub signer: Option<BlockSigner>,
21}
22
23#[derive(Debug, thiserror::Error)]
25pub enum NetworkDriverError {
26 #[error("error starting libp2p Swarm")]
28 GossipStartError(#[from] TransportError<std::io::Error>),
29 #[error("error starting block signer client: {0}")]
31 BlockSignerStartError(#[from] BlockSignerStartError),
32}
33
34impl NetworkDriver {
35 pub async fn start(mut self) -> Result<NetworkHandler, NetworkDriverError> {
37 let (handler, enr_receiver) = self.discovery.start();
39
40 self.gossip.start().await?;
42
43 let peer_score_inspector = tokio::time::interval(*PEER_SCORE_INSPECT_FREQUENCY);
45
46 let signer =
48 OptionFuture::from(self.signer.map(async |s| s.start().await)).await.transpose()?;
49
50 Ok(NetworkHandler {
51 gossip: self.gossip,
52 discovery: handler,
53 enr_receiver,
54 unsafe_block_signer_sender: self.unsafe_block_signer_sender,
55 peer_score_inspector,
56 signer,
57 })
58 }
59}