use libp2p::{
core::{ProtocolName, PublicKey},
identify::Identify,
kad::{
record::store::{MemoryStore, MemoryStoreConfig},
Kademlia, KademliaConfig,
},
PeerId,
};
use super::{Config, ProtocolId};
use crate::components::chainspec_loader::Chainspec;
const KADEMLIA_PROTOCOL_NAME_INNER: &str = "kademlia-peer-discovery";
pub(super) fn new_behaviors(
config: &Config,
chainspec: &Chainspec,
our_public_key: PublicKey,
) -> (Kademlia<MemoryStore>, Identify) {
let our_peer_id = PeerId::from(our_public_key.clone());
let memory_store_config = MemoryStoreConfig {
max_records: 0,
max_value_bytes: 0,
..Default::default()
};
let memory_store = MemoryStore::with_config(our_peer_id.clone(), memory_store_config);
let protocol_id = ProtocolId::new(chainspec, KADEMLIA_PROTOCOL_NAME_INNER);
let mut kademlia_config = KademliaConfig::default();
kademlia_config
.set_protocol_name(protocol_id.protocol_name().to_vec())
.disjoint_query_paths(true)
.set_connection_idle_timeout(config.connection_keep_alive.into());
let kademlia = Kademlia::with_config(our_peer_id, memory_store, kademlia_config);
let protocol_version = format!("/casper/{}", chainspec.genesis.protocol_version);
let agent_version = format!("{}/{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
let identify = Identify::new(protocol_version, agent_version, our_public_key);
(kademlia, identify)
}