From 1efc0847b5ad4898d8ffbef1d382525967c242cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 27 Apr 2022 10:18:55 +0100 Subject: [PATCH] Header deserialization --- validator-api/src/dkg/networking/message.rs | 66 ++++++++++++++++----- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/validator-api/src/dkg/networking/message.rs b/validator-api/src/dkg/networking/message.rs index 92e68f0438..195807147d 100644 --- a/validator-api/src/dkg/networking/message.rs +++ b/validator-api/src/dkg/networking/message.rs @@ -5,6 +5,22 @@ use crate::dkg::error::DkgError; use bytes::{BufMut, BytesMut}; use crypto::asymmetric::identity; use dkg::Dealing; +use std::io; + +pub enum OffchainDkgMessage { + NewDealing { + id: u64, + message: NewDealingMessage, + }, + RemoteDealingRequest { + id: u64, + message: RemoteDealingRequestMessage, + }, + RemoteDealingResponse { + id: u64, + message: RemoteDealingResponseMessage, + }, +} pub struct NewDealingMessage { epoch_id: u32, @@ -28,21 +44,6 @@ pub enum RemoteDealingResponseMessage { Unavailable, } -pub enum OffchainDkgMessage { - NewDealing { - id: u64, - message: NewDealingMessage, - }, - RemoteDealingRequest { - id: u64, - message: RemoteDealingRequestMessage, - }, - RemoteDealingResponse { - id: u64, - message: RemoteDealingResponseMessage, - }, -} - impl OffchainDkgMessage { fn frame(self) -> FramedOffchainDkgMessage { todo!() @@ -110,6 +111,7 @@ impl FramedOffchainDkgMessage { } } +#[derive(Debug, Copy, Clone, PartialEq)] pub(crate) struct Header { pub(crate) message_type: OffchainDkgMessageType, pub(crate) payload_length: u64, @@ -130,6 +132,38 @@ impl Header { } pub(crate) fn try_from_bytes(bytes: &[u8]) -> Result { - todo!() + if bytes.len() != Self::LEN { + return Err(DkgError::Networking(io::Error::new( + io::ErrorKind::InvalidData, + format!( + "OffchainDkgMessageType::Header: got {} bytes, expected: {}", + bytes.len(), + Self::LEN + ), + ))); + } + Ok(Header { + message_type: OffchainDkgMessageType::try_from(bytes[0])?, + payload_length: u64::from_be_bytes(bytes[1..9].try_into().unwrap()), + protocol_version: u32::from_be_bytes(bytes[9..].try_into().unwrap()), + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::dkg::networking::PROTOCOL_VERSION; + + #[test] + fn header_deserialization() { + let valid_header = Header { + message_type: OffchainDkgMessageType::NewDealing, + payload_length: 1234, + protocol_version: PROTOCOL_VERSION, + }; + + let bytes = valid_header.to_bytes(); + assert_eq!(valid_header, Header::try_from_bytes(&bytes).unwrap()) } }