|
1 | 1 | use crate::{
|
| 2 | + dag::Request as ReconstructionRequest, |
| 3 | + network::UnitMessage, |
2 | 4 | runway::{NewestUnitResponse, Salt},
|
3 |
| - units::{UncheckedSignedUnit, UnitCoord}, |
4 |
| - Data, Hasher, NodeIndex, Signature, UncheckedSigned, |
| 5 | + units::UncheckedSignedUnit, |
| 6 | + Data, Hasher, NodeIndex, Recipient, Signature, UncheckedSigned, |
5 | 7 | };
|
6 | 8 |
|
7 | 9 | mod responder;
|
| 10 | +mod task; |
8 | 11 |
|
9 | 12 | pub use responder::Responder;
|
| 13 | +pub use task::DisseminationTask; |
| 14 | + |
| 15 | +/// Some form of message with the intended recipients. |
| 16 | +#[derive(Eq, PartialEq, Debug, Clone)] |
| 17 | +pub struct Addressed<T> { |
| 18 | + message: T, |
| 19 | + recipients: Vec<Recipient>, |
| 20 | +} |
| 21 | + |
| 22 | +impl<T> Addressed<T> { |
| 23 | + /// Message with the given recipients. |
| 24 | + pub fn new(message: T, recipients: Vec<Recipient>) -> Self { |
| 25 | + Addressed { |
| 26 | + message, |
| 27 | + recipients, |
| 28 | + } |
| 29 | + } |
| 30 | + |
| 31 | + /// Message with the single specified recipient. |
| 32 | + pub fn addressed_to(message: T, node_id: NodeIndex) -> Self { |
| 33 | + Addressed::new(message, vec![Recipient::Node(node_id)]) |
| 34 | + } |
| 35 | + |
| 36 | + /// All the recipients of this message. |
| 37 | + pub fn recipients(&self) -> &Vec<Recipient> { |
| 38 | + &self.recipients |
| 39 | + } |
| 40 | + |
| 41 | + /// The associated message. |
| 42 | + pub fn message(&self) -> &T { |
| 43 | + &self.message |
| 44 | + } |
| 45 | + |
| 46 | + /// Convert the underlying message. Cannot be done through a `From` implementation due to it |
| 47 | + /// overriding the blanked identity `From` implementation. |
| 48 | + pub fn into<U: From<T>>(self) -> Addressed<U> { |
| 49 | + let Addressed { |
| 50 | + message, |
| 51 | + recipients, |
| 52 | + } = self; |
| 53 | + Addressed { |
| 54 | + message: message.into(), |
| 55 | + recipients, |
| 56 | + } |
| 57 | + } |
| 58 | +} |
10 | 59 |
|
11 | 60 | /// Possible requests for information from other nodes.
|
12 |
| -#[derive(Debug)] |
13 |
| -pub enum Request<H: Hasher> { |
14 |
| - Coord(UnitCoord), |
15 |
| - Parents(H::Hash), |
| 61 | +#[derive(Eq, PartialEq, Debug, Clone)] |
| 62 | +pub enum DisseminationRequest<H: Hasher> { |
| 63 | + /// A request for unit information in normal operation. |
| 64 | + Unit(ReconstructionRequest<H>), |
| 65 | + /// Request for what the specified node thinks about our newest unit. |
16 | 66 | NewestUnit(NodeIndex, Salt),
|
17 | 67 | }
|
18 | 68 |
|
| 69 | +impl<H: Hasher> From<ReconstructionRequest<H>> for DisseminationRequest<H> { |
| 70 | + fn from(request: ReconstructionRequest<H>) -> Self { |
| 71 | + DisseminationRequest::Unit(request) |
| 72 | + } |
| 73 | +} |
| 74 | + |
19 | 75 | /// Responses to requests.
|
20 |
| -#[derive(Debug)] |
21 |
| -pub enum Response<H: Hasher, D: Data, S: Signature> { |
| 76 | +#[derive(Eq, PartialEq, Debug, Clone)] |
| 77 | +pub enum DisseminationResponse<H: Hasher, D: Data, S: Signature> { |
| 78 | + /// Response to a coord request, just a single unit. |
22 | 79 | Coord(UncheckedSignedUnit<H, D, S>),
|
| 80 | + /// All the parents of the specified unit. |
23 | 81 | Parents(H::Hash, Vec<UncheckedSignedUnit<H, D, S>>),
|
| 82 | + /// The newest unit response for initial unit collection. |
24 | 83 | NewestUnit(UncheckedSigned<NewestUnitResponse<H, D, S>, S>),
|
25 | 84 | }
|
| 85 | + |
| 86 | +/// A message that has to be passed between committee members for consensus to work. |
| 87 | +#[derive(Eq, PartialEq, Debug, Clone)] |
| 88 | +pub enum DisseminationMessage<H: Hasher, D: Data, S: Signature> { |
| 89 | + /// Unit, either broadcast or in response to a coord request. |
| 90 | + Unit(UncheckedSignedUnit<H, D, S>), |
| 91 | + /// Request coming from the specified node for something. |
| 92 | + Request(NodeIndex, DisseminationRequest<H>), |
| 93 | + /// Response to a parent request. |
| 94 | + ParentsResponse(H::Hash, Vec<UncheckedSignedUnit<H, D, S>>), |
| 95 | + /// Response to initial unit collection. |
| 96 | + NewestUnitResponse(UncheckedSigned<NewestUnitResponse<H, D, S>, S>), |
| 97 | +} |
| 98 | + |
| 99 | +impl<H: Hasher, D: Data, S: Signature> From<UnitMessage<H, D, S>> |
| 100 | + for DisseminationMessage<H, D, S> |
| 101 | +{ |
| 102 | + fn from(message: UnitMessage<H, D, S>) -> Self { |
| 103 | + use DisseminationMessage::*; |
| 104 | + match message { |
| 105 | + UnitMessage::Unit(u) => Unit(u), |
| 106 | + UnitMessage::CoordRequest(node_id, coord) => { |
| 107 | + Request(node_id, ReconstructionRequest::Coord(coord).into()) |
| 108 | + } |
| 109 | + UnitMessage::ParentsRequest(node_id, hash) => { |
| 110 | + Request(node_id, ReconstructionRequest::ParentsOf(hash).into()) |
| 111 | + } |
| 112 | + UnitMessage::ParentsResponse(h, units) => ParentsResponse(h, units), |
| 113 | + UnitMessage::NewestRequest(node_id, salt) => { |
| 114 | + Request(node_id, DisseminationRequest::NewestUnit(node_id, salt)) |
| 115 | + } |
| 116 | + UnitMessage::NewestResponse(response) => NewestUnitResponse(response), |
| 117 | + } |
| 118 | + } |
| 119 | +} |
| 120 | + |
| 121 | +impl<H: Hasher, D: Data, S: Signature> From<DisseminationMessage<H, D, S>> |
| 122 | + for UnitMessage<H, D, S> |
| 123 | +{ |
| 124 | + fn from(message: DisseminationMessage<H, D, S>) -> Self { |
| 125 | + use DisseminationMessage::*; |
| 126 | + match message { |
| 127 | + Unit(u) => UnitMessage::Unit(u), |
| 128 | + Request(node_id, DisseminationRequest::Unit(ReconstructionRequest::Coord(coord))) => { |
| 129 | + UnitMessage::CoordRequest(node_id, coord) |
| 130 | + } |
| 131 | + Request( |
| 132 | + node_id, |
| 133 | + DisseminationRequest::Unit(ReconstructionRequest::ParentsOf(hash)), |
| 134 | + ) => UnitMessage::ParentsRequest(node_id, hash), |
| 135 | + ParentsResponse(h, units) => UnitMessage::ParentsResponse(h, units), |
| 136 | + Request(node_id, DisseminationRequest::NewestUnit(_, salt)) => { |
| 137 | + UnitMessage::NewestRequest(node_id, salt) |
| 138 | + } |
| 139 | + NewestUnitResponse(response) => UnitMessage::NewestResponse(response), |
| 140 | + } |
| 141 | + } |
| 142 | +} |
| 143 | + |
| 144 | +impl<H: Hasher, D: Data, S: Signature> From<DisseminationResponse<H, D, S>> |
| 145 | + for DisseminationMessage<H, D, S> |
| 146 | +{ |
| 147 | + fn from(message: DisseminationResponse<H, D, S>) -> Self { |
| 148 | + use DisseminationMessage::*; |
| 149 | + use DisseminationResponse::*; |
| 150 | + match message { |
| 151 | + Coord(u) => Unit(u), |
| 152 | + Parents(h, units) => ParentsResponse(h, units), |
| 153 | + NewestUnit(response) => NewestUnitResponse(response), |
| 154 | + } |
| 155 | + } |
| 156 | +} |
0 commit comments