// std // crates use libsecp256k1::SecretKey; use multiaddr::Multiaddr; use serde::{Deserialize, Serialize}; // internal /// Waku node configuration #[derive(Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct WakuNodeConfig { /// Listening IP address. Default `0.0.0.0` host: Option, /// Libp2p TCP listening port. Default `60000`. Use `0` for **random** port: Option, /// External address to advertise to other nodes. Can be ip4, ip6 or dns4, dns6. /// If null, the multiaddress(es) generated from the ip and port specified in the config (or default ones) will be used. /// Default: null advertise_addr: Option, /// Secp256k1 private key in Hex format (`0x123...abc`). Default random #[serde(with = "secret_key_serde")] node_key: Option, /// Interval in seconds for pinging peers to keep the connection alive. Default `20` keep_alive_interval: Option, /// Enable relay protocol. Default `true` relay: Option, /// The minimum number of peers required on a topic to allow broadcasting a message. Default `0` min_peers_to_publish: Option, /// Enable filter protocol. Default `false` filter: Option, } mod secret_key_serde { use libsecp256k1::SecretKey; use serde::de::Error; use serde::{Deserialize, Deserializer, Serialize, Serializer}; pub fn serialize(key: &Option, serializer: S) -> Result where S: Serializer, { let as_string: Option = key.as_ref().map(|key| hex::encode(key.serialize())); as_string.serialize(serializer) } pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { let as_string: Option = Option::::deserialize(deserializer)?; match as_string { None => Ok(None), Some(s) => { let key_bytes = hex::decode(s).map_err(|e| D::Error::custom(format!("{e}")))?; Ok(Some( SecretKey::parse_slice(&key_bytes) .map_err(|e| D::Error::custom(format!("{e}")))?, )) } } } }