massa_protocol_exports/
peer_id.rs

1use std::{fmt::Display, hash::Hash, str::FromStr};
2
3use massa_hash::Hash as MassaHash;
4use massa_serialization::{Deserializer, Serializer};
5use massa_signature::{KeyPair, PublicKey, PublicKeyDeserializer, Signature};
6use peernet::peer_id::PeerId as PeernetPeerId;
7
8use crate::ProtocolError;
9
10#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Copy)]
11pub struct PeerId {
12    public_key: PublicKey,
13}
14
15impl PeerId {
16    pub fn from_public_key(public_key: PublicKey) -> Self {
17        Self { public_key }
18    }
19
20    pub fn get_public_key(&self) -> PublicKey {
21        self.public_key
22    }
23
24    pub fn verify_signature(
25        &self,
26        hash: &MassaHash,
27        signature: &Signature,
28    ) -> Result<(), ProtocolError> {
29        self.public_key
30            .verify_signature(hash, signature)
31            .map_err(|err| ProtocolError::GeneralProtocolError(err.to_string()))
32    }
33}
34
35impl FromStr for PeerId {
36    type Err = ProtocolError;
37
38    fn from_str(s: &str) -> Result<Self, Self::Err> {
39        let public_key = PublicKey::from_str(s)
40            .map_err(|err| ProtocolError::GeneralProtocolError(err.to_string()))?;
41        Ok(Self { public_key })
42    }
43}
44
45impl Display for PeerId {
46    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47        self.public_key.fmt(f)
48    }
49}
50
51impl PeernetPeerId for PeerId {
52    fn generate() -> Self {
53        Self {
54            public_key: KeyPair::generate(0).unwrap().get_public_key(),
55        }
56    }
57}
58
59#[derive(Default, Clone)]
60pub struct PeerIdSerializer {}
61
62impl PeerIdSerializer {
63    pub fn new() -> Self {
64        Self {}
65    }
66}
67
68impl Serializer<PeerId> for PeerIdSerializer {
69    fn serialize(
70        &self,
71        value: &PeerId,
72        buffer: &mut Vec<u8>,
73    ) -> Result<(), massa_serialization::SerializeError> {
74        buffer.extend_from_slice(&value.public_key.to_bytes());
75        Ok(())
76    }
77}
78
79#[derive(Default, Clone)]
80pub struct PeerIdDeserializer {
81    public_key_deserializer: PublicKeyDeserializer,
82}
83
84impl PeerIdDeserializer {
85    pub fn new() -> Self {
86        PeerIdDeserializer {
87            public_key_deserializer: PublicKeyDeserializer::new(),
88        }
89    }
90}
91
92impl Deserializer<PeerId> for PeerIdDeserializer {
93    fn deserialize<'a, E: nom::error::ParseError<&'a [u8]> + nom::error::ContextError<&'a [u8]>>(
94        &self,
95        buffer: &'a [u8],
96    ) -> nom::IResult<&'a [u8], PeerId, E> {
97        self.public_key_deserializer
98            .deserialize(buffer)
99            .map(|(buffer, public_key)| (buffer, PeerId { public_key }))
100    }
101}
102
103impl ::serde::Serialize for PeerId {
104    /// `::serde::Serialize` trait for `PeerId`
105    ///
106    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
107        s.collect_str(&self.to_string())
108    }
109}
110
111impl<'de> ::serde::Deserialize<'de> for PeerId {
112    /// `::serde::Deserialize` trait for `PeerId`
113    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<PeerId, D::Error> {
114        struct Base58CheckVisitor;
115
116        impl<'de> ::serde::de::Visitor<'de> for Base58CheckVisitor {
117            type Value = PeerId;
118
119            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
120                formatter.write_str("an ASCII base58check string")
121            }
122
123            fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
124            where
125                E: ::serde::de::Error,
126            {
127                if let Ok(v_str) = std::str::from_utf8(v) {
128                    PeerId::from_str(v_str).map_err(E::custom)
129                } else {
130                    Err(E::invalid_value(::serde::de::Unexpected::Bytes(v), &self))
131                }
132            }
133
134            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
135            where
136                E: ::serde::de::Error,
137            {
138                PeerId::from_str(v).map_err(E::custom)
139            }
140        }
141        d.deserialize_str(Base58CheckVisitor)
142    }
143}