mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-04-25 11:02:12 +00:00
*: Add Serialize and Deserialize to PeerId gossipsub MessageId and kad Key (#2408)
Co-authored-by: Max Inden <mail@max-inden.de>
This commit is contained in:
parent
e19391e966
commit
5617481e56
@ -60,6 +60,7 @@ wasm-ext-websocket = ["wasm-ext", "libp2p-wasm-ext/websocket"]
|
|||||||
websocket = ["libp2p-websocket"]
|
websocket = ["libp2p-websocket"]
|
||||||
yamux = ["libp2p-yamux"]
|
yamux = ["libp2p-yamux"]
|
||||||
secp256k1 = ["libp2p-core/secp256k1"]
|
secp256k1 = ["libp2p-core/secp256k1"]
|
||||||
|
serde = ["libp2p-core/serde", "libp2p-kad/serde", "libp2p-gossipsub/serde"]
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
all-features = true
|
all-features = true
|
||||||
|
@ -11,10 +11,13 @@
|
|||||||
|
|
||||||
- Add `ConnectedPoint::is_relayed` (see [PR 2392]).
|
- Add `ConnectedPoint::is_relayed` (see [PR 2392]).
|
||||||
|
|
||||||
|
- Implement `Serialize` and `Deserialize` for `PeerId` (see [PR 2408])
|
||||||
|
|
||||||
[PR 2339]: https://github.com/libp2p/rust-libp2p/pull/2339
|
[PR 2339]: https://github.com/libp2p/rust-libp2p/pull/2339
|
||||||
[PR 2350]: https://github.com/libp2p/rust-libp2p/pull/2350
|
[PR 2350]: https://github.com/libp2p/rust-libp2p/pull/2350
|
||||||
[PR 2352]: https://github.com/libp2p/rust-libp2p/pull/2352
|
[PR 2352]: https://github.com/libp2p/rust-libp2p/pull/2352
|
||||||
[PR 2392]: https://github.com/libp2p/rust-libp2p/pull/2392
|
[PR 2392]: https://github.com/libp2p/rust-libp2p/pull/2392
|
||||||
|
[PR 2408]: https://github.com/libp2p/rust-libp2p/pull/2408
|
||||||
|
|
||||||
# 0.30.1 [2021-11-16]
|
# 0.30.1 [2021-11-16]
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ thiserror = "1.0"
|
|||||||
unsigned-varint = "0.7"
|
unsigned-varint = "0.7"
|
||||||
void = "1"
|
void = "1"
|
||||||
zeroize = "1"
|
zeroize = "1"
|
||||||
|
_serde = { package = "serde", version = "1", optional = true, features = ["derive"] }
|
||||||
|
|
||||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||||
ring = { version = "0.16.9", features = ["alloc", "std"], default-features = false }
|
ring = { version = "0.16.9", features = ["alloc", "std"], default-features = false }
|
||||||
@ -48,6 +49,8 @@ criterion = "0.3"
|
|||||||
libp2p-mplex = { path = "../muxers/mplex" }
|
libp2p-mplex = { path = "../muxers/mplex" }
|
||||||
libp2p-noise = { path = "../transports/noise" }
|
libp2p-noise = { path = "../transports/noise" }
|
||||||
libp2p-tcp = { path = "../transports/tcp" }
|
libp2p-tcp = { path = "../transports/tcp" }
|
||||||
|
serde_json = "1.0"
|
||||||
|
rmp-serde = "0.15"
|
||||||
multihash = { version = "0.14", default-features = false, features = ["arb"] }
|
multihash = { version = "0.14", default-features = false, features = ["arb"] }
|
||||||
quickcheck = "0.9.0"
|
quickcheck = "0.9.0"
|
||||||
rand07 = { package = "rand", version = "0.7" }
|
rand07 = { package = "rand", version = "0.7" }
|
||||||
@ -59,6 +62,7 @@ prost-build = "0.9"
|
|||||||
default = [ "secp256k1", "ecdsa" ]
|
default = [ "secp256k1", "ecdsa" ]
|
||||||
secp256k1 = [ "libsecp256k1" ]
|
secp256k1 = [ "libsecp256k1" ]
|
||||||
ecdsa = [ "p256" ]
|
ecdsa = [ "p256" ]
|
||||||
|
serde = ["multihash/serde-codec", "_serde"]
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
name = "peer_id"
|
name = "peer_id"
|
||||||
|
@ -35,6 +35,9 @@
|
|||||||
//! define how to upgrade each individual substream to use a protocol.
|
//! define how to upgrade each individual substream to use a protocol.
|
||||||
//! See the `upgrade` module.
|
//! See the `upgrade` module.
|
||||||
|
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
extern crate _serde as serde;
|
||||||
|
|
||||||
mod keys_proto {
|
mod keys_proto {
|
||||||
include!(concat!(env!("OUT_DIR"), "/keys_proto.rs"));
|
include!(concat!(env!("OUT_DIR"), "/keys_proto.rs"));
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,9 @@ use rand::Rng;
|
|||||||
use std::{convert::TryFrom, fmt, str::FromStr};
|
use std::{convert::TryFrom, fmt, str::FromStr};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
/// Public keys with byte-lengths smaller than `MAX_INLINE_KEY_LENGTH` will be
|
/// Public keys with byte-lengths smaller than `MAX_INLINE_KEY_LENGTH` will be
|
||||||
/// automatically used as the peer id using an identity multihash.
|
/// automatically used as the peer id using an identity multihash.
|
||||||
const MAX_INLINE_KEY_LENGTH: usize = 42;
|
const MAX_INLINE_KEY_LENGTH: usize = 42;
|
||||||
@ -164,6 +167,60 @@ impl From<PeerId> for Vec<u8> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
impl Serialize for PeerId {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: _serde::Serializer,
|
||||||
|
{
|
||||||
|
if serializer.is_human_readable() {
|
||||||
|
serializer.serialize_str(&self.to_base58())
|
||||||
|
} else {
|
||||||
|
serializer.serialize_bytes(&self.to_bytes()[..])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
impl<'de> Deserialize<'de> for PeerId {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
use serde::de::*;
|
||||||
|
|
||||||
|
struct PeerIdVisitor;
|
||||||
|
|
||||||
|
impl<'de> Visitor<'de> for PeerIdVisitor {
|
||||||
|
type Value = PeerId;
|
||||||
|
|
||||||
|
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "valid peer id")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
PeerId::from_bytes(v).map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
PeerId::from_str(v).map_err(|_| Error::invalid_value(Unexpected::Str(v), &self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if deserializer.is_human_readable() {
|
||||||
|
deserializer.deserialize_str(PeerIdVisitor)
|
||||||
|
} else {
|
||||||
|
deserializer.deserialize_bytes(PeerIdVisitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
#[derive(Debug, Error)]
|
||||||
pub enum ParseError {
|
pub enum ParseError {
|
||||||
#[error("base-58 decode error: {0}")]
|
#[error("base-58 decode error: {0}")]
|
||||||
|
52
core/tests/serde.rs
Normal file
52
core/tests/serde.rs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#![cfg(feature = "serde")]
|
||||||
|
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use libp2p_core::PeerId;
|
||||||
|
|
||||||
|
extern crate _serde as serde;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn serialize_peer_id_json() {
|
||||||
|
let peer_id = PeerId::from_str("12D3KooWRNw2pJC9748Fmq4WNV27HoSTcX3r37132FLkQMrbKAiC").unwrap();
|
||||||
|
let json = serde_json::to_string(&peer_id).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
json,
|
||||||
|
r#""12D3KooWRNw2pJC9748Fmq4WNV27HoSTcX3r37132FLkQMrbKAiC""#
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn serialize_peer_id_msgpack() {
|
||||||
|
let peer_id = PeerId::from_str("12D3KooWRNw2pJC9748Fmq4WNV27HoSTcX3r37132FLkQMrbKAiC").unwrap();
|
||||||
|
let buf = rmp_serde::to_vec(&peer_id).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
&buf[..],
|
||||||
|
&[
|
||||||
|
0xc4, 38, // msgpack buffer header
|
||||||
|
0x00, 0x24, 0x08, 0x01, 0x12, 0x20, 0xe7, 0x37, 0x0c, 0x66, 0xef, 0xec, 0x80, 0x00,
|
||||||
|
0xd5, 0x87, 0xfc, 0x41, 0x65, 0x92, 0x8e, 0xe0, 0x75, 0x5f, 0x94, 0x86, 0xcb, 0x5c,
|
||||||
|
0xf0, 0xf7, 0x80, 0xd8, 0xe0, 0x6c, 0x98, 0xce, 0x7d, 0xa9
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn deserialize_peer_id_json() {
|
||||||
|
let peer_id = PeerId::from_str("12D3KooWRNw2pJC9748Fmq4WNV27HoSTcX3r37132FLkQMrbKAiC").unwrap();
|
||||||
|
let json = r#""12D3KooWRNw2pJC9748Fmq4WNV27HoSTcX3r37132FLkQMrbKAiC""#;
|
||||||
|
assert_eq!(peer_id, serde_json::from_str(json).unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn deserialize_peer_id_msgpack() {
|
||||||
|
let peer_id = PeerId::from_str("12D3KooWRNw2pJC9748Fmq4WNV27HoSTcX3r37132FLkQMrbKAiC").unwrap();
|
||||||
|
let buf = &[
|
||||||
|
0xc4, 38, // msgpack buffer header
|
||||||
|
0x00, 0x24, 0x08, 0x01, 0x12, 0x20, 0xe7, 0x37, 0x0c, 0x66, 0xef, 0xec, 0x80, 0x00, 0xd5,
|
||||||
|
0x87, 0xfc, 0x41, 0x65, 0x92, 0x8e, 0xe0, 0x75, 0x5f, 0x94, 0x86, 0xcb, 0x5c, 0xf0, 0xf7,
|
||||||
|
0x80, 0xd8, 0xe0, 0x6c, 0x98, 0xce, 0x7d, 0xa9,
|
||||||
|
];
|
||||||
|
|
||||||
|
assert_eq!(peer_id, rmp_serde::from_read(&mut &buf[..]).unwrap());
|
||||||
|
}
|
@ -9,11 +9,14 @@
|
|||||||
- Improve bandwidth performance by tracking IWANTs and reducing duplicate sends
|
- Improve bandwidth performance by tracking IWANTs and reducing duplicate sends
|
||||||
(see [PR 2327]).
|
(see [PR 2327]).
|
||||||
|
|
||||||
|
- Implement `Serialize` and `Deserialize` for `MessageId` and `FastMessageId` (see [PR 2408])
|
||||||
|
|
||||||
- Fix `GossipsubConfigBuilder::build()` requiring `&self` to live for `'static` (see [PR 2409])
|
- Fix `GossipsubConfigBuilder::build()` requiring `&self` to live for `'static` (see [PR 2409])
|
||||||
|
|
||||||
[PR 2346]: https://github.com/libp2p/rust-libp2p/pull/2346
|
[PR 2346]: https://github.com/libp2p/rust-libp2p/pull/2346
|
||||||
[PR 2339]: https://github.com/libp2p/rust-libp2p/pull/2339
|
[PR 2339]: https://github.com/libp2p/rust-libp2p/pull/2339
|
||||||
[PR 2327]: https://github.com/libp2p/rust-libp2p/pull/2327
|
[PR 2327]: https://github.com/libp2p/rust-libp2p/pull/2327
|
||||||
|
[PR 2408]: https://github.com/libp2p/rust-libp2p/pull/2408
|
||||||
[PR 2409]: https://github.com/libp2p/rust-libp2p/pull/2409
|
[PR 2409]: https://github.com/libp2p/rust-libp2p/pull/2409
|
||||||
|
|
||||||
# 0.34.0 [2021-11-16]
|
# 0.34.0 [2021-11-16]
|
||||||
|
@ -30,6 +30,7 @@ regex = "1.4.0"
|
|||||||
futures-timer = "3.0.2"
|
futures-timer = "3.0.2"
|
||||||
pin-project = "1.0.8"
|
pin-project = "1.0.8"
|
||||||
instant = "0.1.11"
|
instant = "0.1.11"
|
||||||
|
serde = { version = "1", optional = true, features = ["derive"] }
|
||||||
# Metrics dependencies
|
# Metrics dependencies
|
||||||
open-metrics-client = "0.14.0"
|
open-metrics-client = "0.14.0"
|
||||||
|
|
||||||
|
@ -27,6 +27,9 @@ use prost::Message;
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
/// Validation kinds from the application for received messages.
|
/// Validation kinds from the application for received messages.
|
||||||
pub enum MessageAcceptance {
|
pub enum MessageAcceptance {
|
||||||
@ -42,6 +45,7 @@ pub enum MessageAcceptance {
|
|||||||
/// Macro for declaring message id types
|
/// Macro for declaring message id types
|
||||||
macro_rules! declare_message_id_type {
|
macro_rules! declare_message_id_type {
|
||||||
($name: ident, $name_string: expr) => {
|
($name: ident, $name_string: expr) => {
|
||||||
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
|
#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
|
||||||
pub struct $name(pub Vec<u8>);
|
pub struct $name(pub Vec<u8>);
|
||||||
|
|
||||||
|
@ -6,8 +6,11 @@
|
|||||||
|
|
||||||
- Derive `Clone` for `KademliaEvent` (see [PR 2411])
|
- Derive `Clone` for `KademliaEvent` (see [PR 2411])
|
||||||
|
|
||||||
|
- Derive `Serialize`, `Deserialize` for `store::record::Key` (see [PR 2408])
|
||||||
|
|
||||||
[PR 2339]: https://github.com/libp2p/rust-libp2p/pull/2339
|
[PR 2339]: https://github.com/libp2p/rust-libp2p/pull/2339
|
||||||
[PR 2411]: https://github.com/libp2p/rust-libp2p/pull/2411
|
[PR 2411]: https://github.com/libp2p/rust-libp2p/pull/2411
|
||||||
|
[PR 2408]: https://github.com/libp2p/rust-libp2p/pull/2408
|
||||||
|
|
||||||
# 0.33.0 [2021-11-16]
|
# 0.33.0 [2021-11-16]
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ unsigned-varint = { version = "0.7", features = ["asynchronous_codec"] }
|
|||||||
void = "1.0"
|
void = "1.0"
|
||||||
futures-timer = "3.0.2"
|
futures-timer = "3.0.2"
|
||||||
instant = "0.1.11"
|
instant = "0.1.11"
|
||||||
|
_serde = { package = "serde", version = "1.0", optional = true, features = ["derive"] }
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
@ -40,3 +41,6 @@ quickcheck = "0.9.0"
|
|||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
prost-build = "0.9"
|
prost-build = "0.9"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
serde = ["_serde", "bytes/serde"]
|
||||||
|
@ -24,6 +24,9 @@
|
|||||||
// be useful later for record store
|
// be useful later for record store
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
extern crate _serde as serde;
|
||||||
|
|
||||||
pub mod handler;
|
pub mod handler;
|
||||||
pub mod kbucket;
|
pub mod kbucket;
|
||||||
pub mod protocol;
|
pub mod protocol;
|
||||||
|
@ -25,10 +25,14 @@ pub mod store;
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use instant::Instant;
|
use instant::Instant;
|
||||||
use libp2p_core::{multihash::Multihash, Multiaddr, PeerId};
|
use libp2p_core::{multihash::Multihash, Multiaddr, PeerId};
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
|
|
||||||
/// The (opaque) key of a record.
|
/// The (opaque) key of a record.
|
||||||
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
|
#[cfg_attr(feature = "serde", serde(crate = "_serde"))]
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
pub struct Key(Bytes);
|
pub struct Key(Bytes);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user