1use crate::dag::{Dag, DagLike, InternalSharing};
9use crate::jet::Jet;
10use crate::merkle::cmr::Cmr;
11use crate::node::{
12 ConstructNode, CoreConstructible, DisconnectConstructible, JetConstructible,
13 WitnessConstructible,
14};
15use crate::types;
16use crate::value::Word;
17use crate::{BitIter, FailEntropy};
18use std::collections::HashSet;
19use std::sync::Arc;
20use std::{cmp, error, fmt};
21
22use super::bititer::{u2, DecodeNaturalError};
23
24type ArcNode<J> = Arc<ConstructNode<J>>;
25
26#[non_exhaustive]
28#[derive(Debug)]
29pub enum Error {
30 BitIter(crate::BitIterCloseError),
32 BothChildrenHidden,
34 EndOfStream,
36 HiddenNode,
38 InvalidJet,
40 Natural(DecodeNaturalError),
42 NotInCanonicalOrder,
44 SharingNotMaximal,
46 Type(crate::types::Error),
48}
49
50impl From<crate::EarlyEndOfStreamError> for Error {
51 fn from(_: crate::EarlyEndOfStreamError) -> Error {
52 Error::EndOfStream
53 }
54}
55
56impl From<crate::BitIterCloseError> for Error {
57 fn from(e: crate::BitIterCloseError) -> Error {
58 Error::BitIter(e)
59 }
60}
61
62impl From<DecodeNaturalError> for Error {
63 fn from(e: DecodeNaturalError) -> Error {
64 Error::Natural(e)
65 }
66}
67
68impl From<crate::types::Error> for Error {
69 fn from(e: crate::types::Error) -> Error {
70 Error::Type(e)
71 }
72}
73
74impl fmt::Display for Error {
75 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
76 match self {
77 Error::BitIter(ref e) => fmt::Display::fmt(e, f),
78 Error::BothChildrenHidden => f.write_str("both children of a case node are hidden"),
79 Error::EndOfStream => f.write_str("bitstream ended early"),
80 Error::HiddenNode => write!(f, "hidden node occurred outside of a case combinator"),
81 Error::InvalidJet => write!(f, "unrecognized jet"),
82 Error::Natural(ref e) => e.fmt(f),
83 Error::NotInCanonicalOrder => f.write_str("program not in canonical order"),
84 Error::SharingNotMaximal => f.write_str("Decoded programs must have maximal sharing"),
85 Error::Type(ref e) => fmt::Display::fmt(e, f),
86 }
87 }
88}
89
90impl error::Error for Error {
91 fn source(&self) -> Option<&(dyn error::Error + 'static)> {
92 match *self {
93 Error::BitIter(ref e) => Some(e),
94 Error::BothChildrenHidden => None,
95 Error::EndOfStream => None,
96 Error::HiddenNode => None,
97 Error::InvalidJet => None,
98 Error::Natural(ref e) => Some(e),
99 Error::NotInCanonicalOrder => None,
100 Error::SharingNotMaximal => None,
101 Error::Type(ref e) => Some(e),
102 }
103 }
104}
105
106#[derive(Debug)]
107enum DecodeNode<J: Jet> {
108 Iden,
109 Unit,
110 InjL(usize),
111 InjR(usize),
112 Take(usize),
113 Drop(usize),
114 Comp(usize, usize),
115 Case(usize, usize),
116 Pair(usize, usize),
117 Disconnect1(usize),
118 Disconnect(usize, usize),
119 Witness,
120 Fail(FailEntropy),
121 Hidden(Cmr),
122 Jet(J),
123 Word(Word),
124}
125
126impl<J: Jet> DagLike for (usize, &'_ [DecodeNode<J>]) {
127 type Node = DecodeNode<J>;
128
129 fn data(&self) -> &DecodeNode<J> {
130 &self.1[self.0]
131 }
132
133 fn as_dag_node(&self) -> Dag<Self> {
134 let nodes = &self.1;
135 match self.1[self.0] {
136 DecodeNode::Iden
137 | DecodeNode::Unit
138 | DecodeNode::Fail(..)
139 | DecodeNode::Hidden(..)
140 | DecodeNode::Jet(..)
141 | DecodeNode::Word(..) => Dag::Nullary,
142 DecodeNode::InjL(i)
143 | DecodeNode::InjR(i)
144 | DecodeNode::Take(i)
145 | DecodeNode::Drop(i)
146 | DecodeNode::Disconnect1(i) => Dag::Unary((i, nodes)),
147 DecodeNode::Comp(li, ri)
148 | DecodeNode::Case(li, ri)
149 | DecodeNode::Pair(li, ri)
150 | DecodeNode::Disconnect(li, ri) => Dag::Binary((li, nodes), (ri, nodes)),
151 DecodeNode::Witness => Dag::Nullary,
152 }
153 }
154}
155
156pub fn decode_expression<I: Iterator<Item = u8>, J: Jet>(
157 bits: &mut BitIter<I>,
158) -> Result<ArcNode<J>, Error> {
159 enum Converted<J: Jet> {
160 Node(ArcNode<J>),
161 Hidden(Cmr),
162 }
163 use Converted::{Hidden, Node};
164 impl<J: Jet> Converted<J> {
165 fn get(&self) -> Result<&ArcNode<J>, Error> {
166 match self {
167 Node(arc) => Ok(arc),
168 Hidden(_) => Err(Error::HiddenNode),
169 }
170 }
171 }
172
173 let len = bits.read_natural::<usize>(None)?;
174 assert_ne!(len, 0, "impossible to encode 0 in Simplicity");
175
176 let inference_context = types::Context::new();
177 let mut nodes = Vec::with_capacity(cmp::min(len, 10_000));
178 for _ in 0..len {
179 let new_node = decode_node(bits, nodes.len())?;
180 nodes.push(new_node);
181 }
182
183 let mut hidden_set = HashSet::<Cmr>::new();
185 let mut converted = Vec::<Converted<J>>::with_capacity(len);
187 for data in (nodes.len() - 1, &nodes[..]).post_order_iter::<InternalSharing>() {
188 if data.index != data.node.0 {
190 return Err(Error::NotInCanonicalOrder);
191 }
192
193 let new = match nodes[data.node.0] {
194 DecodeNode::Unit => Node(ArcNode::unit(&inference_context)),
195 DecodeNode::Iden => Node(ArcNode::iden(&inference_context)),
196 DecodeNode::InjL(i) => Node(ArcNode::injl(converted[i].get()?)),
197 DecodeNode::InjR(i) => Node(ArcNode::injr(converted[i].get()?)),
198 DecodeNode::Take(i) => Node(ArcNode::take(converted[i].get()?)),
199 DecodeNode::Drop(i) => Node(ArcNode::drop_(converted[i].get()?)),
200 DecodeNode::Comp(i, j) => {
201 Node(ArcNode::comp(converted[i].get()?, converted[j].get()?)?)
202 }
203 DecodeNode::Case(i, j) => {
204 match (&converted[i], &converted[j]) {
207 (Node(left), Node(right)) => Node(ArcNode::case(left, right)?),
208 (Node(left), Hidden(cmr)) => Node(ArcNode::assertl(left, *cmr)?),
209 (Hidden(cmr), Node(right)) => Node(ArcNode::assertr(*cmr, right)?),
210 (Hidden(_), Hidden(_)) => return Err(Error::BothChildrenHidden),
211 }
212 }
213 DecodeNode::Pair(i, j) => {
214 Node(ArcNode::pair(converted[i].get()?, converted[j].get()?)?)
215 }
216 DecodeNode::Disconnect1(i) => Node(ArcNode::disconnect(converted[i].get()?, &None)?),
217 DecodeNode::Disconnect(i, j) => Node(ArcNode::disconnect(
218 converted[i].get()?,
219 &Some(Arc::clone(converted[j].get()?)),
220 )?),
221 DecodeNode::Witness => Node(ArcNode::witness(&inference_context, None)),
222 DecodeNode::Fail(entropy) => Node(ArcNode::fail(&inference_context, entropy)),
223 DecodeNode::Hidden(cmr) => {
224 if !hidden_set.insert(cmr) {
225 return Err(Error::SharingNotMaximal);
226 }
227 Hidden(cmr)
228 }
229 DecodeNode::Jet(j) => Node(ArcNode::jet(&inference_context, j)),
230 DecodeNode::Word(ref w) => {
231 Node(ArcNode::const_word(&inference_context, w.shallow_clone()))
232 }
233 };
234 converted.push(new);
235 }
236
237 converted[len - 1].get().map(Arc::clone)
238}
239
240fn decode_node<I: Iterator<Item = u8>, J: Jet>(
243 bits: &mut BitIter<I>,
244 index: usize,
245) -> Result<DecodeNode<J>, Error> {
246 if bits.read_bit()? {
248 if bits.read_bit()? {
250 J::decode(bits).map(|jet| DecodeNode::Jet(jet))
251 } else {
252 let n = bits.read_natural(Some(32))?;
253 let word = Word::from_bits(bits, n - 1)?;
254 Ok(DecodeNode::Word(word))
255 }
256 } else {
257 match bits.read_u2()? {
259 u2::_0 => {
260 let subcode = bits.read_u2()?;
261 let i_abs = index - bits.read_natural(Some(index))?;
262 let j_abs = index - bits.read_natural(Some(index))?;
263
264 match subcode {
266 u2::_0 => Ok(DecodeNode::Comp(i_abs, j_abs)),
267 u2::_1 => Ok(DecodeNode::Case(i_abs, j_abs)),
268 u2::_2 => Ok(DecodeNode::Pair(i_abs, j_abs)),
269 u2::_3 => Ok(DecodeNode::Disconnect(i_abs, j_abs)),
270 }
271 }
272 u2::_1 => {
273 let subcode = bits.read_u2()?;
274 let i_abs = index - bits.read_natural(Some(index))?;
275 match subcode {
277 u2::_0 => Ok(DecodeNode::InjL(i_abs)),
278 u2::_1 => Ok(DecodeNode::InjR(i_abs)),
279 u2::_2 => Ok(DecodeNode::Take(i_abs)),
280 u2::_3 => Ok(DecodeNode::Drop(i_abs)),
281 }
282 }
283 u2::_2 => {
284 match bits.read_u2()? {
286 u2::_0 => Ok(DecodeNode::Iden),
287 u2::_1 => Ok(DecodeNode::Unit),
288 u2::_2 => Ok(DecodeNode::Fail(bits.read_fail_entropy()?)),
289 u2::_3 => {
290 let i_abs = index - bits.read_natural(Some(index))?;
291 Ok(DecodeNode::Disconnect1(i_abs))
292 }
293 }
294 }
295 u2::_3 => {
296 if bits.read_bit()? {
298 Ok(DecodeNode::Witness)
299 } else {
300 Ok(DecodeNode::Hidden(bits.read_cmr()?))
301 }
302 }
303 }
304 }
305}
306
307#[cfg(test)]
308mod tests {
309 use super::*;
310 use crate::encode;
311 use crate::jet::Core;
312 use crate::node::{CommitNode, RedeemNode};
313 use crate::BitWriter;
314
315 #[test]
316 fn root_unit_to_unit() {
317 let justjet = [0x6d, 0xb8, 0x80];
319 let mut iter = BitIter::from(&justjet[..]);
321 decode_expression::<_, Core>(&mut iter).unwrap();
322 let iter = BitIter::from(&justjet[..]);
324 CommitNode::<Core>::decode(iter).unwrap_err();
325 let iter = BitIter::from(&justjet[..]);
327 RedeemNode::<Core>::decode(iter, BitIter::from(&[][..])).unwrap_err();
328 }
329
330 #[test]
331 fn decode_fixed_natural() {
332 let tries: Vec<(usize, usize, &[u8])> = vec![
333 (1, 1, &[0b00000000]),
334 (2, 3, &[0b10000000]),
335 (3, 3, &[0b10100000]),
336 (4, 6, &[0b11_000000]),
337 (5, 6, &[0b11_000100]),
338 (6, 6, &[0b11_001000]),
339 (7, 6, &[0b11_001100]),
340 (8, 7, &[0b110_10000]),
341 (15, 7, &[0b110_11110]),
342 (16, 11, &[0b11100000, 0b00000000]),
343 (31, 11, &[0b11100001, 0b11100000]),
345 (32, 12, &[0b11100010, 0b00000000]),
347 (32768, 23, &[0b11101111, 0b00000000, 0b00000000]),
349 (65535, 23, &[0b11101111, 0b11111111, 0b11111110]),
350 (65536, 28, &[0b11110000, 0b00000000, 0b00000000, 0b00000000]),
351 (
352 u32::MAX as usize - 1, 43,
354 &[
355 0b11110000, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11000000,
356 ],
357 ),
358 (
359 u32::MAX as usize, 43,
361 &[
362 0b11110000, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11100000,
363 ],
364 ),
365 ];
366
367 for (natural, len, bitvec) in tries {
368 let mut iter = BitIter::new(bitvec.iter().copied());
369
370 let mut truncated = BitIter::new(bitvec.iter().copied().take(bitvec.len() - 1));
372 assert_eq!(
373 truncated.read_natural::<usize>(None),
374 Err(DecodeNaturalError::EndOfStream(
375 crate::EarlyEndOfStreamError
376 )),
377 );
378
379 assert_eq!(iter.clone().read_natural(None), Ok(natural),);
381 assert_eq!(iter.clone().read_natural::<u64>(None), Ok(natural as u64),);
382
383 assert_eq!(iter.clone().read_natural(Some(natural)), Ok(natural),);
384 assert_eq!(iter.clone().read_natural(Some(natural + 1)), Ok(natural),);
385 assert_eq!(
386 iter.clone().read_natural(Some(natural - 1)),
387 Err(DecodeNaturalError::BadIndex {
388 got: natural,
389 max: natural - 1
390 }),
391 );
392 assert_eq!(
393 iter.clone().read_natural(Some(0u64)),
394 Err(DecodeNaturalError::BadIndex {
395 got: natural,
396 max: 0
397 }),
398 );
399
400 if let Ok(natural) = u16::try_from(natural) {
402 assert_eq!(iter.read_natural::<u16>(None), Ok(natural),);
403 } else {
404 assert_eq!(
405 iter.read_natural::<u16>(None),
406 Err(DecodeNaturalError::Overflow),
407 );
408 }
409 let mut sink = Vec::<u8>::new();
411
412 let mut w = BitWriter::from(&mut sink);
413 encode::encode_natural(natural, &mut w).expect("encoding to vector");
414 w.flush_all().expect("flushing");
415 assert_eq!(w.n_total_written(), len);
416
417 assert_eq!(sink, bitvec);
418 }
419
420 let iter = BitIter::new(
424 [
425 0b11110001, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000,
426 ]
427 .into_iter(),
428 );
429 assert_eq!(
430 iter.clone().read_natural::<usize>(None),
431 Err(DecodeNaturalError::Overflow),
432 );
433 assert_eq!(
434 iter.clone().read_natural::<u16>(None),
435 Err(DecodeNaturalError::Overflow),
436 );
437 assert_eq!(
438 iter.clone().read_natural::<i32>(None),
439 Err(DecodeNaturalError::Overflow),
440 );
441 assert_eq!(
442 iter.clone().read_natural::<u32>(None),
443 Err(DecodeNaturalError::Overflow),
444 );
445 assert_eq!(
446 iter.clone().read_natural::<u64>(None),
447 Err(DecodeNaturalError::Overflow),
448 );
449 assert_eq!(
450 iter.clone().read_natural(Some(0u8)),
451 Err(DecodeNaturalError::Overflow),
452 );
453 assert_eq!(
454 iter.clone().read_natural(Some(0i32)),
455 Err(DecodeNaturalError::Overflow),
456 );
457 assert_eq!(
458 iter.clone().read_natural(Some(0u32)),
459 Err(DecodeNaturalError::Overflow),
460 );
461 }
462}