massa_protocol_exports/
peer_id.rs1use 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 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 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}