hotshot_types/traits/
network.rs1use std::hash::Hash;
12
13use serde::{Deserialize, Serialize};
14use thiserror::Error;
15
16use super::{node_implementation::NodeType, signature_key::SignatureKey};
17use crate::{data::ViewNumber, message::SequencingMessage};
18
19#[derive(Debug, Error)]
21pub enum NetworkError {
22 #[error("Multiple errors: {0:?}")]
24 Multiple(Vec<NetworkError>),
25
26 #[error("Configuration error: {0}")]
28 ConfigError(String),
29
30 #[error("Failed to send message: {0}")]
32 MessageSendError(String),
33
34 #[error("Failed to receive message: {0}")]
36 MessageReceiveError(String),
37
38 #[error("Unimplemented")]
40 Unimplemented,
41
42 #[error("Listen error: {0}")]
44 ListenError(String),
45
46 #[error("Channel send error: {0}")]
48 ChannelSendError(String),
49
50 #[error("Channel receive error: {0}")]
52 ChannelReceiveError(String),
53
54 #[error("Network has been shut down")]
56 ShutDown,
57
58 #[error("Failed to serialize: {0}")]
60 FailedToSerialize(String),
61
62 #[error("Failed to deserialize: {0}")]
64 FailedToDeserialize(String),
65
66 #[error("Timeout: {0}")]
68 Timeout(String),
69
70 #[error("The request was cancelled before it could be fulfilled")]
72 RequestCancelled,
73
74 #[error("This node does not have any peers yet")]
76 NoPeersYet,
77
78 #[error("Node lookup failed: {0}")]
80 LookupError(String),
81}
82
83pub trait Id: Eq + PartialEq + Hash {}
85
86pub trait ViewMessage<TYPES: NodeType> {
88 fn view_number(&self) -> ViewNumber;
90}
91
92#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)]
94#[serde(bound(deserialize = ""))]
95pub struct DataRequest<TYPES: NodeType> {
96 pub request: RequestKind<TYPES>,
98 pub view: ViewNumber,
100 pub signature: <TYPES::SignatureKey as SignatureKey>::PureAssembledSignatureType,
103}
104
105#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Hash)]
107pub enum RequestKind<TYPES: NodeType> {
108 Vid(ViewNumber, TYPES::SignatureKey),
110 DaProposal(ViewNumber),
112 Proposal(ViewNumber),
114}
115
116impl<TYPES: NodeType> std::fmt::Debug for RequestKind<TYPES> {
117 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
118 match self {
119 RequestKind::Vid(view, key) => write!(f, "Vid({view:?}, {key})"),
120 RequestKind::DaProposal(view) => write!(f, "DaProposal({view:?})"),
121 RequestKind::Proposal(view) => write!(f, "Proposal({view:?})"),
122 }
123 }
124}
125
126#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Hash)]
129#[serde(bound(deserialize = ""))]
130#[allow(clippy::large_enum_variant)]
131pub enum ResponseMessage<TYPES: NodeType> {
133 Found(SequencingMessage<TYPES>),
135 NotFound,
137 Denied,
139}
140
141#[derive(Debug)]
143pub enum NetworkChange<P: SignatureKey> {
144 NodeConnected(P),
146
147 NodeDisconnected(P),
149}