From cc6b474b0d35f5fa3f00a742b1c0e18a9a1a25a3 Mon Sep 17 00:00:00 2001 From: hozan23 Date: Mon, 24 Jun 2024 19:25:57 +0200 Subject: p2p: use base64 to encode PeerID to string --- Cargo.lock | 3 +-- p2p/Cargo.toml | 28 ++++++++++++++-------------- p2p/src/error.rs | 10 ++++++++-- p2p/src/peer/peer_id.rs | 29 ++++++++++++++++++++++------- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8773140..b028ea7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,6 +1314,7 @@ dependencies = [ "async-channel 2.3.1", "async-std", "async-trait", + "base64", "bincode", "chrono", "clap", @@ -1323,7 +1324,6 @@ dependencies = [ "futures-rustls", "futures-util", "karyon_core", - "karyon_jsonrpc", "karyon_net", "log", "parking_lot", @@ -1332,7 +1332,6 @@ dependencies = [ "rustls-pki-types", "semver", "serde", - "serde_json", "sha2", "smol", "thiserror", diff --git a/p2p/Cargo.toml b/p2p/Cargo.toml index 9dd43d5..7eee02a 100644 --- a/p2p/Cargo.toml +++ b/p2p/Cargo.toml @@ -27,18 +27,26 @@ karyon_net = { workspace = true, default-features = false, features = [ "udp", ] } -async-trait = "0.1.77" -async-channel = "2.3.0" -futures-util = { version = "0.3.5", features = [ - "alloc", -], default-features = false } + log = "0.4.21" chrono = "0.4.35" -bincode = { version = "2.0.0-rc.3", features = ["derive"] } rand = "0.8.5" thiserror = "1.0.58" semver = "1.0.22" sha2 = "0.10.8" +parking_lot = "0.12.2" + +# encode/decode +bincode = { version = "2.0.0-rc.3", features = ["derive"] } +base64 = "0.22.1" +serde = { version = "1.0.197", features = ["derive"], optional = true } + +# async +async-trait = "0.1.77" +async-channel = "2.3.0" +futures-util = { version = "0.3.5", features = [ + "alloc", +], default-features = false } # tls rcgen = "0.12.1" @@ -50,11 +58,6 @@ futures-rustls = { version = "0.25.1", features = [ tokio-rustls = { version = "0.26.0", features = ["aws-lc-rs"], optional = true } rustls-pki-types = "1.7.0" -# serde -serde = { version = "1.0.197", features = ["derive"], optional = true } - -parking_lot = "0.12.2" - [dev-dependencies] async-std = "1.12.0" clap = { version = "4.5.2", features = ["derive"] } @@ -62,6 +65,3 @@ ctrlc = "3.4.4" easy-parallel = "3.3.1" env_logger = "0.11.3" smol = "2.0.0" -karyon_jsonrpc = { workspace = true, features = ["ws", "smol"] } -serde_json = "1.0.117" -serde = { version = "1.0.202", features = ["derive"] } diff --git a/p2p/src/error.rs b/p2p/src/error.rs index 97b7b7f..a490b57 100644 --- a/p2p/src/error.rs +++ b/p2p/src/error.rs @@ -11,8 +11,11 @@ pub enum Error { #[error("Unsupported protocol error: {0}")] UnsupportedProtocol(String), - #[error("Try from public key Error: {0}")] - TryFromPublicKey(&'static str), + #[error("PeerID try from PublicKey Error")] + PeerIDTryFromPublicKey, + + #[error("PeerID try from String Error")] + PeerIDTryFromString, #[error("Invalid message error: {0}")] InvalidMsg(String), @@ -23,6 +26,9 @@ pub enum Error { #[error(transparent)] ParseIntError(#[from] std::num::ParseIntError), + #[error(transparent)] + ParseIntError2(#[from] base64::DecodeError), + #[error(transparent)] ParseFloatError(#[from] std::num::ParseFloatError), diff --git a/p2p/src/peer/peer_id.rs b/p2p/src/peer/peer_id.rs index a769c86..145c199 100644 --- a/p2p/src/peer/peer_id.rs +++ b/p2p/src/peer/peer_id.rs @@ -1,3 +1,4 @@ +use base64::{engine::general_purpose::STANDARD, Engine}; use bincode::{Decode, Encode}; use rand::{rngs::OsRng, RngCore}; use sha2::{Digest, Sha256}; @@ -12,16 +13,12 @@ use crate::Error; /// Represents a unique identifier for a peer. #[derive(Clone, Debug, Eq, PartialEq, Hash, Decode, Encode)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(into = "String"))] pub struct PeerID(pub [u8; 32]); impl std::fmt::Display for PeerID { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - let id = self.0[0..8] - .iter() - .map(|b| format!("{:x}", b)) - .collect::>() - .join(""); - + let id = STANDARD.encode(self.0); write!(f, "{}", id) } } @@ -48,6 +45,24 @@ impl From<[u8; 32]> for PeerID { } } +impl From for String { + fn from(pid: PeerID) -> Self { + pid.to_string() + } +} + +impl TryFrom for PeerID { + type Error = Error; + + fn try_from(i: String) -> Result { + let result: [u8; 32] = STANDARD + .decode(i)? + .try_into() + .map_err(|_| Error::PeerIDTryFromString)?; + Ok(PeerID(result)) + } +} + impl TryFrom for PeerID { type Error = Error; @@ -55,7 +70,7 @@ impl TryFrom for PeerID { let pk: [u8; 32] = pk .as_bytes() .try_into() - .map_err(|_| Error::TryFromPublicKey("Failed to convert public key to [u8;32]"))?; + .map_err(|_| Error::PeerIDTryFromPublicKey)?; Ok(PeerID(pk)) } -- cgit v1.2.3