use bitcoin::p2p::message::NetworkMessage;
use bitcoin::p2p::message_network::VersionMessage;
#[derive(Debug)]
pub enum Update {
Version(VersionMessage),
Verack,
SendAddrV2,
WtxidRelay,
Other,
}
impl From<&NetworkMessage> for Update {
fn from(value: &NetworkMessage) -> Self {
match value {
NetworkMessage::Version(v) => Self::Version(v.clone()),
NetworkMessage::Verack => Self::Verack,
NetworkMessage::SendAddrV2 => Self::SendAddrV2,
NetworkMessage::WtxidRelay => Self::WtxidRelay,
_ => Self::Other,
}
}
}
#[derive(Debug)]
pub enum Event<'a> {
Wait,
SendVerack,
Violation,
Done {
version: &'a VersionMessage,
wants_addr_v2: bool,
wtxid_relay: bool,
},
}
#[derive(Debug, Default)]
pub struct Handshake {
their_version: Option<VersionMessage>,
their_verack: bool,
wants_addr_v2: bool,
wtxid_relay: bool,
}
impl Handshake {
pub fn update(&mut self, update: Update) -> Event {
match (self, update) {
(
Self {
their_version: their_version @ None,
their_verack: false,
..
},
Update::Version(v),
) => {
*their_version = Some(v);
Event::SendVerack
}
(
Self {
their_version: Some(_),
their_verack: false,
wants_addr_v2: wants_addr_v2 @ false,
..
},
Update::SendAddrV2,
) => {
*wants_addr_v2 = true;
Event::Wait
}
(
Self {
their_version: Some(_),
their_verack: false,
wtxid_relay: wtxid_relay @ false,
..
},
Update::WtxidRelay,
) => {
*wtxid_relay = true;
Event::Wait
}
(
Self {
their_version: Some(v),
their_verack: their_verack @ false,
wants_addr_v2,
wtxid_relay,
},
Update::Verack,
) => {
*their_verack = true;
Event::Done {
version: v,
wants_addr_v2: *wants_addr_v2,
wtxid_relay: *wtxid_relay,
}
}
_ => Event::Violation,
}
}
}