From 90b228492c8a3ed6e8fbe3d89c27cf6d8432311c Mon Sep 17 00:00:00 2001 From: Santiago Carmuega Date: Tue, 3 Oct 2023 14:26:11 -0300 Subject: [PATCH] fix(network): fix bad codec for tx monitoring messages (#298) --- .../src/miniprotocols/txmonitor/codec.rs | 29 +++++++++++++++---- .../src/miniprotocols/txmonitor/protocol.rs | 6 +++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/pallas-network/src/miniprotocols/txmonitor/codec.rs b/pallas-network/src/miniprotocols/txmonitor/codec.rs index 4faccbf..15da33c 100644 --- a/pallas-network/src/miniprotocols/txmonitor/codec.rs +++ b/pallas-network/src/miniprotocols/txmonitor/codec.rs @@ -80,12 +80,13 @@ impl<'b> Decode<'b, ()> for Message { // find the specs 4 => Ok(Message::AwaitAcquire), 5 => Ok(Message::RequestNextTx), - 6 => match d.array()? { - Some(_) => { - let cbor: pallas_codec::utils::CborWrap = d.decode()?; - Ok(Message::ResponseNextTx(Some(cbor.unwrap()))) + 6 => match d.datatype()? { + pallas_codec::minicbor::data::Type::Array + | pallas_codec::minicbor::data::Type::ArrayIndef => { + let tx = d.decode()?; + Ok(Message::ResponseNextTx(Some(tx))) } - None => Ok(Message::ResponseNextTx(None)), + _ => Ok(Message::ResponseNextTx(None)), }, 7 => { let id = d.decode()?; @@ -112,3 +113,21 @@ impl<'b> Decode<'b, ()> for Message { } } } + +#[cfg(test)] +pub mod tests { + const EXAMPLE_RESPONSE_NEXT_TX_WITH_DATA: &str = "82068205d81859013184a5008282582003e4aea27ebacf5f50b10ac60cc84deba96569ce8a47fdf9199998d1fd16ec0601825820eebf8249544b7eefa7839510dfd58a7ed420f2254bd3bf632baea8cd0928b00102018182583901b98f57f569aba4cffc4d9c791f099374e9403ed5e2cb614eab25b78278b1312c2c271d260db425b8b9847ab142b395b4598d3c0b383aa696821a00924172a1581c09f2d4e4a5c3662f4c1e6a7d9600e9605279dbdcedb22d4507cb6e75a1435350461a0422bb35021a00029f3d031a063ec6470800a100818258208293ac2260e28a07657f77087d1d7ff5e3ced29ff4385abf60a9546e2bcbc04a5840d69ce3a8f9713513a9baf473c1be08fd17d1a85df2881dc107fb1f68ce02c8e7adcf1c91bce7fb58868908f7ac47310a8e97d95780beadcfd8493bebbb914d0df5f6"; + + #[test] + fn test_next_tx_response() { + let bytes = hex::decode(EXAMPLE_RESPONSE_NEXT_TX_WITH_DATA).unwrap(); + let msg: super::Message = pallas_codec::minicbor::decode(&bytes).unwrap(); + + if let super::Message::ResponseNextTx(Some((era, body))) = msg { + assert_eq!(era, 5); + assert_eq!(body.len(), 305); + } else { + unreachable!(); + } + } +} diff --git a/pallas-network/src/miniprotocols/txmonitor/protocol.rs b/pallas-network/src/miniprotocols/txmonitor/protocol.rs index 06c91bd..43a0ebf 100644 --- a/pallas-network/src/miniprotocols/txmonitor/protocol.rs +++ b/pallas-network/src/miniprotocols/txmonitor/protocol.rs @@ -1,6 +1,10 @@ +use pallas_codec::utils::TagWrap; + pub type Slot = u64; pub type TxId = String; -pub type Tx = Vec; +pub type Era = u8; +pub type TxBody = pallas_codec::utils::Bytes; +pub type Tx = (Era, TagWrap); #[derive(Debug, PartialEq, Eq, Clone)] pub enum State {