pallas_network/miniprotocols/localtxsubmission/
codec.rs1use pallas_codec::minicbor::data::IanaTag;
2use pallas_codec::minicbor::{decode, encode, Decode, Decoder, Encode, Encoder};
3
4use crate::miniprotocols::localtxsubmission::{EraTx, Message, RejectReason};
5
6impl<Tx, Reject> Encode<()> for Message<Tx, Reject>
7where
8 Tx: Encode<()>,
9 Reject: Encode<()>,
10{
11 fn encode<W: encode::Write>(
12 &self,
13 e: &mut Encoder<W>,
14 _ctx: &mut (),
15 ) -> Result<(), encode::Error<W::Error>> {
16 match self {
17 Message::SubmitTx(tx) => {
18 e.array(2)?.u16(0)?;
19 e.encode(tx)?;
20 Ok(())
21 }
22 Message::AcceptTx => {
23 e.array(1)?.u16(1)?;
24 Ok(())
25 }
26 Message::RejectTx(rejection) => {
27 e.array(2)?.u16(2)?;
28 e.encode(rejection)?;
29 Ok(())
30 }
31 Message::Done => {
32 e.array(1)?.u16(3)?;
33 Ok(())
34 }
35 }
36 }
37}
38
39impl<'b, Tx: Decode<'b, ()>, Reject: Decode<'b, ()>> Decode<'b, ()> for Message<Tx, Reject> {
40 fn decode(d: &mut Decoder<'b>, _ctx: &mut ()) -> Result<Self, decode::Error> {
41 if d.array().is_err() {
42 let rejection = d.decode()?;
45
46 d.set_position(d.input().len());
49
50 return Ok(Message::RejectTx(rejection));
51 }
52
53 let label = d.u16()?;
54
55 match label {
56 0 => {
57 let tx = d.decode()?;
58 Ok(Message::SubmitTx(tx))
59 }
60 1 => Ok(Message::AcceptTx),
61 2 => {
62 let rejection = d.decode()?;
63
64 d.set_position(d.input().len());
67
68 Ok(Message::RejectTx(rejection))
69 }
70 3 => Ok(Message::Done),
71 _ => Err(decode::Error::message("can't decode Message")),
72 }
73 }
74}
75
76impl<'b> Decode<'b, ()> for EraTx {
77 fn decode(d: &mut Decoder<'b>, _ctx: &mut ()) -> Result<Self, decode::Error> {
78 d.array()?;
79 let era = d.u16()?;
80 let tag = d.tag()?;
81 if tag != IanaTag::Cbor.tag() {
82 return Err(decode::Error::message("Expected encoded CBOR data item"));
83 }
84 Ok(EraTx(era, d.bytes()?.to_vec()))
85 }
86}
87
88impl Encode<()> for EraTx {
89 fn encode<W: encode::Write>(
90 &self,
91 e: &mut Encoder<W>,
92 _ctx: &mut (),
93 ) -> Result<(), encode::Error<W::Error>> {
94 e.array(2)?;
95 e.u16(self.0)?;
96 e.tag(IanaTag::Cbor)?;
97 e.bytes(&self.1)?;
98 Ok(())
99 }
100}
101
102impl<'b> Decode<'b, ()> for RejectReason {
103 fn decode(d: &mut Decoder<'b>, _ctx: &mut ()) -> Result<Self, decode::Error> {
104 let remainder = d.input().to_vec();
105 Ok(RejectReason(remainder))
106 }
107}
108
109impl Encode<()> for RejectReason {
110 fn encode<W: encode::Write>(
111 &self,
112 e: &mut Encoder<W>,
113 _ctx: &mut (),
114 ) -> Result<(), encode::Error<W::Error>> {
115 e.writer_mut()
116 .write_all(&self.0)
117 .map_err(encode::Error::write)?;
118 Ok(())
119 }
120}
121
122#[cfg(test)]
123mod tests {
124 use pallas_codec::{minicbor, Fragment};
125
126 use crate::miniprotocols::localtxsubmission::{EraTx, Message, RejectReason};
127 use crate::multiplexer::Error;
128
129 #[test]
130 fn decode_reject_message() {
131 let mut bytes = hex::decode(RAW_REJECT_RESPONSE).unwrap();
132 let msg_res = try_decode_message::<Message<EraTx, RejectReason>>(&mut bytes);
133 assert!(msg_res.is_ok())
134 }
135
136 fn try_decode_message<M>(buffer: &mut Vec<u8>) -> Result<Option<M>, Error>
137 where
138 M: Fragment,
139 {
140 let mut decoder = minicbor::Decoder::new(buffer);
141 let maybe_msg = decoder.decode();
142
143 match maybe_msg {
144 Ok(msg) => {
145 let pos = decoder.position();
146 buffer.drain(0..pos);
147 Ok(Some(msg))
148 }
149 Err(err) if err.is_end_of_input() => Ok(None),
150 Err(err) => Err(Error::Decoding(err.to_string())),
151 }
152 }
153
154 #[test]
155 fn decode_reject_string_message() {
156 let mut bytes = hex::decode(RAW_REJECT_REPONSE_ERROR_STRING).unwrap();
157 let msg_res = try_decode_message::<Message<EraTx, RejectReason>>(&mut bytes);
158 println!("result {:?}", msg_res);
159 assert!(msg_res.is_ok())
160 }
161
162 const RAW_REJECT_RESPONSE: &str =
163 "82028182059f820082018200820a81581c3b890fb5449baedf5342a48ee9c9ec6acbc995641be92ad21f08c686\
164 8200820183038158202628ce6ff8cc7ff0922072d930e4a693c17f991748dedece0be64819a2f9ef7782582031d\
165 54ce8d7e8cb262fc891282f44e9d24c3902dc38fac63fd469e8bf3006376b5820750852fdaf0f2dd724291ce007\
166 b8e76d74bcf28076ed0c494cd90c0cfe1c9ca582008201820782000000018200820183048158201a547638b4cf4\
167 a3cec386e2f898ac6bc987fadd04277e1d3c8dab5c505a5674e8158201457e4107607f83a80c3c4ffeb70910c2b\
168 a3a35cf1699a2a7375f50fcc54a931820082028201830500821a00636185a2581c6f1a1f0c7ccf632cc9ff4b796\
169 87ed13ffe5b624cce288b364ebdce50a144414749581b000000032a9f8800581c795ecedb09821cb922c13060c8\
170 f6377c3344fa7692551e865d86ac5da158205399c766fb7c494cddb2f7ae53cc01285474388757bc05bd575c14a\
171 713a432a901820082028201820085825820497fe6401e25733c073c01164c7f2a1a05de8c95e36580f9d1b05123\
172 70040def028258207911ba2b7d91ac56b05ea351282589fe30f4717a707a1b9defaf282afe5ba44200825820791\
173 1ba2b7d91ac56b05ea351282589fe30f4717a707a1b9defaf282afe5ba44201825820869bcb6f35e6b7912c25e5\
174 cb33fb9906b097980a83f2b8ef40b51c4ef52eccd402825820efc267ad2c15c34a117535eecc877241ed836eb3e\
175 643ec90de21ca1b12fd79c20282008202820181148200820283023a000f0f6d1a004944ce820082028201830d3a\
176 000f0f6d1a00106253820082028201830182811a02409e10811a024138c01a0255e528ff";
177
178 const RAW_REJECT_REPONSE_ERROR_STRING: &str =
179 "6867475972786f4141794e6847514d734151455a412b675a416a734141526b4436426c65635151424751506f47\
180 4341614141484b64686b6f3677515a576467595a426c5a3242686b47566e594747515a576467595a426c5a32426\
181 86b47566e59474751595a42686b47566e594747515a5446455949426f4141717a364743415a7456454547674144\
182 5978555a4166384141526f4141567731474341614141655864526b3239415143476741432f35516141416271654\
183 26a63414145424751506f47572f324241496141414f3943426f414130374647443442476741514c67385a4d536f\
184 42476741444c6f415a4161554247674143326e675a412b675a7a775942476741424f6a515949426d6f385267674\
185 751506f47434161414145367241455a34554d454751506f43686f414177495a474a77424767414441686b596e41\
186 456141414d6766426b423251456141414d7741426b422f77455a7a504d5949426e395142676747662f564743415\
187 a5742345949426c4173786767476741424b74385949426f4141762b5547674147366e67593341414241526f4141\
188 512b534753326e4141455a3672735949426f4141762b5547674147366e67593341414241526f4141762b5547674\
189 147366e67593341414241526f4145624973476741462f64344141686f414446424f4758635342426f4148577232\
190 47674142516c73454767414544475941424141614141465071786767476741444932455a4179774241526d67336\
191 86767476741445058595949426c353942676747582b344743415a7156305949426c3939786767475a5771474341\
192 6141694f737a416f61413354326b786c4b48776f61416c466568426d417377714347674149466c41614364577a5\
193 1466b452f466b452b514541414449794d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d69496c4d7a\
194 41554d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d6a49794d6c4d7a41774d3\
195 3447041424142435a47526b706d59475a6d3464544d774d7a4e773575744d4451774e5144306741425341414649\
196 414a494141564d774a444e77356d425341555947674469514151715a6753475a455a75764e30356763414247366\
197 3774f414154413041454d44514167564d774a444e77356d59475245536d5a675941416941454a6d41475a754141\
198 435341434d44674146494141424e494151564d774a444e784a75744d4451774e5146674168557a416b4142457a4\
199 d7949694d33456d62677a4e77526d34497a4174414f4144414341424d33414762676a4d433041344152494e4150\
200 4d3342414241416d626741426b67416a413041654d4451423033576d426f417362725441304162457a496a4d6a4\
201 131496c4d7a41794142464b41715a6d42775a75764d446b4145414d556f69594152676441416d366b4145414933\
202 5747426f5a4742735947786762474273594777414a6761674b473634774e4147464d794d774d77415253695a475\
203 26b706d424d5a75504e31786762474275414562726a41324d44634145544e783575754d44594149335847427341\
204 435947344535676241416d426d41344a6d5a6d52455247526b5a754a4d33416d6267544170414e4e316f414a6d3\
205 44d7a6345414b4149414759464943616d5a676347526b706d42575a75504e317867646d4234414562726a41374d\
206 44774145544e783575754d447341493358474232414359486746686764674443627141425241424e31435141426\
207 75a674f6d3630774d77465141546461594759444a75744d444d4268544d774d5449794d6c4d774a544e78357575\
208 4d4455774e67416a646359477067624141695a75504e317867616742473634774e5141544132416d4d445541457\
209 74d6747784d33426d6267674154646159475143356d344533576d426b4175627254417941594541457a63435a67\
210 54414647426941305a6754414347426941304c47426d4145594651414a75714d4334774c77475464575a4742635\
211 94635675941416d4261594677414a675841416d59453575744d43734163416f33566d5267566d425959466f414a\
212 67564742574143594659414a6d4249627254416f414641484d7949794d6a4a544d774b7a49794d6c4d7a41754d3\
213 3447041424142435a47526b706d59474a6d34644941414149556f435a75764e30344168756e41424d4451414977\
214 4b7741546455414f4a6b5a47536d5a67596d626830674167416853674a6d3638335467434736634145774e41416\
215 a417241424e3151413567596742474251414362716741524143466a49794d6a4979557a4d43387a634f6b414141\
216 454a6b5a47526b706d59475a6d346449414141495449794d6a4a544d774e7a4e77365141514151734a6d3656494\
217 1414145774f67416a417841424e3151414a676141416978676241424742614143627167415441774142457a644b\
218 6b414542555947514152675567416d366f4145774c4441744d43344145774b7a417441464e315a6b5a47536d5a6\
219 75747626830674167416859564d7a41734d33486d3634774c51415142684d4330774c6a41764148466a41764143\
220 4d43594145335641416d526756474259414359464a675667426d3634774a77437a416e414b4d77496a646159457\
221 741494168675441416d424b414359456f434275734d434941493357474243414559454a675167416d4243594434\
222 4252675067416d4138414359446f414a674f41416d41324143594451414a674d67416d417741435944414168674\
223 c6741696b7773536d5a67466741696b41414a6d59434a6d3638774454415341424e3149417875744d425577456a\
224 6457594370674a414170414145526d59434941514149415970514d33537041414759414a757041434d774154645\
225 341454151726f45695141694d6a4d774241417a6463594277414a75754d413477447741544150414249694d7a4d\
226 4151414a4941416a4d7a414641435341416461627177415141794d4149335567416b52455a674645536d5a67446\
227 74169414b4b6d5a67476d62727a414a4d4134414541595441454d424577446741524d414977447741514156567a\
228 3658726756584f6b536d5a67436d626941416b67414259544d414d41494145774153496c4d7a41464d334467424\
229 a41414359417741496d59415a6d3445414a49414977427741534d6a4143497a414341434142497741694d774167\
230 416741566330726f56644552674247366f4146566338474432486d6632486d665145442f32486d6657427950377\
231 9303042345a5a53547a68596162482b3653316176373668545570616c644439705748524546425245482f32486d\
232 66574279694c7235587846304c3437704c363870616e5568337443312f32484c7a313042425436456b544546425\
233 245466651555242583035475650385a412b5562414256704b5a4c365955776241574e466546324b414142594848\
234 6b6743687a624c72495933354279415a653538786c3365776836586b464d693035332b4b2f59655a3959484b303\
235 465644c505031447a4441647969454d6e77445879736a4d4769693351475346574e62722f476773764b4d416141\
236 58764a4d502f59655a3842414145412f3968356e3968356e352f59655a2f59655a2f59655a39594942364f54504\
237 845657a426d5249524448705765462b4d69394961367935426b564665434675786155714d522f77442f32486d66\
238 32486d66324871665742776d474f6c4d32775a354c7757756d78374869774978394c66304956736254505575593\
239 04c652f39683667502b68514b4641476774734d63445965352f59655a2f59";
240}