pallas_network/miniprotocols/localtxsubmission/
codec.rs

1use 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            // if the first element isn't an array, it's a plutus error
43            // the node sends string data
44            let rejection = d.decode()?;
45
46            // skip this data via setting the decoder position, because it doesn't recognize
47            // it with rejection decode
48            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                // skip this data via setting the decoder position, because it doesn't recognize
65                // it with rejection decode
66                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}