extended_primitives/
buffer.rs

1use crate::{Hash, Uint256, VarInt};
2use encodings::{FromHex, FromHexError, ToHex};
3use std::fmt;
4use std::ops;
5
6#[derive(thiserror::Error, Debug)]
7pub enum BufferError {
8    #[error("Read Out of Bounds")]
9    OutOfBounds,
10    #[error(transparent)]
11    InvalidString(#[from] std::string::FromUtf8Error),
12    #[error("Non-Minimal VarInt")]
13    NonMinimalVarInt,
14}
15
16pub type Result<T> = std::result::Result<T, BufferError>;
17
18//Our version of Buffer that is implemented in bio - > https://github.com/bcoin-org/bufio
19#[derive(Default, PartialEq, Clone, Eq)]
20pub struct Buffer {
21    data: Vec<u8>,
22    offset: usize,
23}
24
25impl Buffer {
26    pub fn new() -> Self {
27        Buffer::default()
28    }
29
30    //Accept anything that implements into buffer.
31    // pub fn new_with() -> Self {
32
33    // }
34
35    //Unsigned Integers - Little Endian
36    pub fn write_u8(&mut self, data: u8) {
37        self.data.extend_from_slice(&data.to_le_bytes());
38    }
39
40    pub fn write_u16(&mut self, data: u16) {
41        self.data.extend_from_slice(&data.to_le_bytes());
42    }
43
44    pub fn write_u32(&mut self, data: u32) {
45        self.data.extend_from_slice(&data.to_le_bytes());
46    }
47
48    pub fn write_u64(&mut self, data: u64) {
49        self.data.extend_from_slice(&data.to_le_bytes());
50    }
51
52    //TODO u128
53
54    pub fn write_u256(&mut self, data: Uint256) {
55        self.data.extend_from_slice(&data.to_le_bytes());
56    }
57
58    //Big Endian
59    pub fn write_u8_be(&mut self, data: u8) {
60        self.data.extend_from_slice(&data.to_be_bytes());
61    }
62
63    pub fn write_u16_be(&mut self, data: u16) {
64        self.data.extend_from_slice(&data.to_be_bytes());
65    }
66
67    pub fn write_u32_be(&mut self, data: u32) {
68        self.data.extend_from_slice(&data.to_be_bytes());
69    }
70
71    pub fn write_u64_be(&mut self, data: u64) {
72        self.data.extend_from_slice(&data.to_be_bytes());
73    }
74
75    //TODO u128, and u256
76
77    //Signed Integers
78    pub fn write_i8(&mut self, data: i8) {
79        self.data.extend_from_slice(&data.to_le_bytes());
80    }
81
82    pub fn write_i16(&mut self, data: i16) {
83        self.data.extend_from_slice(&data.to_le_bytes());
84    }
85
86    pub fn write_i32(&mut self, data: i32) {
87        self.data.extend_from_slice(&data.to_le_bytes());
88    }
89
90    pub fn write_i64(&mut self, data: i64) {
91        self.data.extend_from_slice(&data.to_le_bytes());
92    }
93
94    //Big Endian
95    pub fn write_i8_be(&mut self, data: i8) {
96        self.data.extend_from_slice(&data.to_be_bytes());
97    }
98
99    pub fn write_i16_be(&mut self, data: i16) {
100        self.data.extend_from_slice(&data.to_be_bytes());
101    }
102
103    pub fn write_i32_be(&mut self, data: i32) {
104        self.data.extend_from_slice(&data.to_be_bytes());
105    }
106
107    pub fn write_i64_be(&mut self, data: i64) {
108        self.data.extend_from_slice(&data.to_be_bytes());
109    }
110
111    pub fn write_bytes(&mut self, bytes: &[u8]) {
112        //TODO should we clone here or just pass in
113        self.data.extend_from_slice(bytes);
114    }
115
116    pub fn write_var_bytes(&mut self, bytes: &[u8]) {
117        self.write_varint(bytes.len());
118
119        if bytes.is_empty() {
120            return;
121        }
122
123        self.data.extend_from_slice(bytes);
124    }
125
126    pub fn write_str(&mut self, string: &str) {
127        self.data.extend_from_slice(string.as_bytes());
128    }
129
130    pub fn write_string(&mut self, string: String) {
131        self.data.extend_from_slice(string.as_bytes());
132    }
133
134    pub fn write_hash(&mut self, hash: Hash) {
135        self.data.extend(hash.to_array());
136    }
137
138    pub fn write_varint(&mut self, data: usize) {
139        if data < 0xFD {
140            self.write_u8(data as u8);
141            return;
142        }
143
144        if data < 0xFFFF {
145            self.write_u8(0xFD);
146            self.write_u16(data as u16);
147            return;
148        }
149
150        if data < 0xFFFFFFFF {
151            self.write_u8(0xFE);
152            self.write_u32(data as u32);
153            return;
154        }
155
156        self.write_u8(0xFF);
157        self.write_u64(data as u64);
158    }
159
160    pub fn fill(&mut self, value: u8, amount: usize) {
161        //See what's faster, this or resize_with/resize TODO
162        let fill_amount = vec![value; amount];
163        self.data.extend(fill_amount);
164    }
165
166    pub fn extend(&mut self, buffer: Buffer) {
167        self.data.extend_from_slice(&buffer);
168    }
169
170    pub fn extend_from_slice(&mut self, slice: &[u8]) {
171        self.data.extend_from_slice(slice);
172    }
173
174    ////Return Hex string of the buffer, Consumes the Buffer
175    pub fn into_hex(self) -> String {
176        self.data.to_hex()
177    }
178
179    //Check for length
180    pub fn check(&self, size: usize) -> Result<()> {
181        if self.offset + size > self.data.len() {
182            return Err(BufferError::OutOfBounds);
183        }
184        Ok(())
185    }
186
187    //These can probably all be macro'd out.
188    pub fn read_u8(&mut self) -> Result<u8> {
189        self.check(1)?;
190        let result = self.data[self.offset];
191
192        self.offset += 1;
193
194        Ok(result)
195    }
196
197    pub fn read_u16(&mut self) -> Result<u16> {
198        self.check(2)?;
199        let range = self.offset..self.offset + 2;
200
201        let mut buf = [0; 2];
202        buf.copy_from_slice(&self.data[range]);
203
204        let ret = u16::from_le_bytes(buf);
205
206        self.offset += 2;
207
208        Ok(ret)
209    }
210
211    pub fn read_u16_be(&mut self) -> Result<u16> {
212        self.check(2)?;
213        let range = self.offset..self.offset + 2;
214
215        let mut buf = [0; 2];
216        buf.copy_from_slice(&self.data[range]);
217
218        let ret = u16::from_be_bytes(buf);
219
220        self.offset += 2;
221
222        Ok(ret)
223    }
224
225    //TODO do we see any need for reading u24s, 48s, etc?
226
227    pub fn read_u32(&mut self) -> Result<u32> {
228        self.check(4)?;
229        let range = self.offset..self.offset + 4;
230
231        let mut buf = [0; 4];
232        buf.copy_from_slice(&self.data[range]);
233
234        let ret = u32::from_le_bytes(buf);
235
236        self.offset += 4;
237
238        Ok(ret)
239    }
240
241    pub fn read_u32_be(&mut self) -> Result<u32> {
242        self.check(4)?;
243        let range = self.offset..self.offset + 4;
244
245        let mut buf = [0; 4];
246        buf.copy_from_slice(&self.data[range]);
247
248        let ret = u32::from_be_bytes(buf);
249
250        self.offset += 4;
251
252        Ok(ret)
253    }
254
255    pub fn read_u64(&mut self) -> Result<u64> {
256        self.check(8)?;
257        let range = self.offset..self.offset + 8;
258
259        let mut buf = [0; 8];
260        buf.copy_from_slice(&self.data[range]);
261
262        let ret = u64::from_le_bytes(buf);
263
264        self.offset += 8;
265
266        Ok(ret)
267    }
268
269    pub fn read_u64_be(&mut self) -> Result<u64> {
270        self.check(8)?;
271        let range = self.offset..self.offset + 8;
272
273        let mut buf = [0; 8];
274        buf.copy_from_slice(&self.data[range]);
275
276        let ret = u64::from_be_bytes(buf);
277
278        self.offset += 8;
279
280        Ok(ret)
281    }
282
283    pub fn read_u256(&mut self) -> Result<Uint256> {
284        self.check(32)?;
285
286        let range = self.offset..self.offset + 32;
287        let ret = Uint256::from_bytes(&self.data[range]);
288
289        self.offset += 32;
290
291        Ok(ret)
292    }
293
294    pub fn read_varint(&mut self) -> Result<VarInt> {
295        let len = self.read_u8()?;
296
297        match len {
298            0xFF => {
299                let num = self.read_u64()?;
300                if num < 0x100000000 {
301                    Err(BufferError::NonMinimalVarInt)
302                } else {
303                    Ok(VarInt::from(num))
304                }
305            }
306            0xFE => {
307                let num = self.read_u32()?;
308                if num < 0x10000 {
309                    Err(BufferError::NonMinimalVarInt)
310                } else {
311                    Ok(VarInt::from(num))
312                }
313            }
314            0xFD => {
315                let num = self.read_u16()?;
316                if num < 0xFD {
317                    Err(BufferError::NonMinimalVarInt)
318                } else {
319                    Ok(VarInt::from(num))
320                }
321            }
322
323            len => Ok(VarInt::from(len)),
324        }
325    }
326
327    pub fn read_string(&mut self, size: usize) -> Result<String> {
328        self.check(size)?;
329
330        let range = self.offset..self.offset + size;
331        let ret = String::from_utf8(self.data[range].to_vec())?;
332
333        self.offset += size;
334
335        Ok(ret)
336    }
337
338    pub fn read_bytes(&mut self, size: usize) -> Result<Vec<u8>> {
339        self.check(size)?;
340
341        let range = self.offset..self.offset + size;
342        let ret = self.data[range].to_vec();
343
344        self.offset += size;
345
346        Ok(ret)
347    }
348
349    pub fn read_var_bytes(&mut self) -> Result<Vec<u8>> {
350        let length = self.read_varint()?;
351
352        //TODO make an as_usize for varint.
353        let size = length.as_u64() as usize;
354
355        let range = self.offset..self.offset + size;
356        let ret = self.data[range].to_vec();
357
358        self.offset += size;
359
360        Ok(ret)
361    }
362
363    pub fn read_hash(&mut self) -> Result<Hash> {
364        self.check(32)?;
365
366        let mut array = [0; 32];
367
368        let range = self.offset..self.offset + 32;
369        array.copy_from_slice(&self.data[range]);
370
371        let hash = Hash::from(array);
372
373        self.offset += 32;
374
375        Ok(hash)
376    }
377
378    //Essentially shifts the offset to offset += off
379    pub fn seek(&mut self, off: usize) -> Result<()> {
380        self.check(off)?;
381
382        self.offset += off;
383
384        Ok(())
385    }
386
387    pub fn to_bytes(&self) -> &[u8] {
388        &self.data
389    }
390
391    pub fn to_vec(&self) -> Vec<u8> {
392        self.data.clone()
393    }
394}
395
396impl From<Vec<u8>> for Buffer {
397    fn from(buf: Vec<u8>) -> Self {
398        Buffer {
399            data: buf,
400            offset: 0,
401        }
402    }
403}
404
405impl From<&[u8]> for Buffer {
406    fn from(buf: &[u8]) -> Self {
407        Buffer {
408            data: buf.to_vec(),
409            offset: 0,
410        }
411    }
412}
413
414//@todo commenting out for now. Not sure how we should implement this. FromStr technically should
415//return an error, but writing a string to a Buffer will never error out. Also it might add some
416//confusion as to whether we are creating the buffer from the raw string or from a hex string. So
417//it might just be in our interest to not have these funcitons period.
418//TODO review, seems inefficent
419//impl From<&str> for Buffer {
420//    fn from(buf: &str) -> Self {
421//        Buffer {
422//            data: buf.as_bytes().to_vec(),
423//            offset: 0,
424//        }
425//    }
426//}
427
428////TODO review, seems inefficent
429//impl From<String> for Buffer {
430//    fn from(buf: String) -> Self {
431//        Buffer {
432//            data: buf.as_bytes().to_vec(),
433//            offset: 0,
434//        }
435//    }
436//}
437
438//Allows us to grab specific bytes from the buffer e.g.
439//grab the merkle tree from the middle of the buffer.
440impl ops::Deref for Buffer {
441    type Target = Vec<u8>;
442
443    fn deref(&self) -> &Self::Target {
444        &self.data
445    }
446}
447
448//Allows us to grab specific bytes from the buffer e.g.
449//grab the merkle tree from the middle of the buffer.
450//Same as above, but allows us to grab those bytes and mutable, thus changing them without
451//having to allocate more mem.
452impl ops::DerefMut for Buffer {
453    fn deref_mut(&mut self) -> &mut Self::Target {
454        &mut self.data
455    }
456}
457
458//Allows Buffer to be used as a reference for a [u8] TODO double check this.
459//And thoroughly comment for everyone
460impl AsRef<[u8]> for Buffer {
461    fn as_ref(&self) -> &[u8] {
462        &self.data
463    }
464}
465
466//Allows Buffer to be used as a mut for a [u8] TODO double check this.
467//And thoroughly comment for everyone
468impl AsMut<[u8]> for Buffer {
469    fn as_mut(&mut self) -> &mut [u8] {
470        &mut self.data
471    }
472}
473
474impl FromHex for Buffer {
475    type Error = FromHexError;
476
477    fn from_hex<T: AsRef<[u8]>>(hex: T) -> std::result::Result<Self, Self::Error> {
478        Ok(Buffer::from(Vec::from_hex(hex)?))
479    }
480}
481
482impl ToHex for Buffer {
483    fn to_hex(&self) -> String {
484        self.data.to_hex()
485    }
486}
487
488impl fmt::Display for Buffer {
489    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
490        write!(
491            f,
492            "Offset: {}, Buffer: {})",
493            self.offset,
494            self.data.to_hex(),
495        )
496    }
497}
498
499impl fmt::Debug for Buffer {
500    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
501        write!(
502            f,
503            "Offset: {}, Buffer: {})",
504            self.offset,
505            self.data.to_hex(),
506        )
507    }
508}
509
510#[cfg(feature = "serialization")]
511impl serde::Serialize for Buffer {
512    fn serialize<S: serde::Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
513        if s.is_human_readable() {
514            s.serialize_str(&self.to_hex())
515        } else {
516            s.serialize_bytes(&self[..])
517        }
518    }
519}
520
521#[cfg(feature = "serialization")]
522impl<'de> serde::Deserialize<'de> for Buffer {
523    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> std::result::Result<Buffer, D::Error> {
524        if d.is_human_readable() {
525            struct HexVisitor;
526
527            impl<'de> serde::de::Visitor<'de> for HexVisitor {
528                type Value = Buffer;
529
530                fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
531                    formatter.write_str("an ASCII hex string")
532                }
533
534                fn visit_bytes<E>(self, v: &[u8]) -> std::result::Result<Self::Value, E>
535                where
536                    E: ::serde::de::Error,
537                {
538                    if let Ok(hex) = ::std::str::from_utf8(v) {
539                        Buffer::from_hex(hex).map_err(E::custom)
540                    } else {
541                        return Err(E::invalid_value(serde::de::Unexpected::Bytes(v), &self));
542                    }
543                }
544
545                fn visit_str<E>(self, v: &str) -> std::result::Result<Self::Value, E>
546                where
547                    E: ::serde::de::Error,
548                {
549                    Buffer::from_hex(v).map_err(E::custom)
550                }
551            }
552
553            d.deserialize_str(HexVisitor)
554        } else {
555            struct BytesVisitor;
556
557            impl<'de> ::serde::de::Visitor<'de> for BytesVisitor {
558                type Value = Buffer;
559
560                fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
561                    formatter.write_str("a bytestring")
562                }
563
564                fn visit_bytes<E>(self, v: &[u8]) -> std::result::Result<Self::Value, E>
565                where
566                    E: ::serde::de::Error,
567                {
568                    Ok(Buffer::from(v))
569                }
570            }
571
572            d.deserialize_bytes(BytesVisitor)
573        }
574    }
575}
576
577#[cfg(test)]
578mod tests {
579    use super::*;
580
581    #[test]
582    fn test_write_u32() {
583        let version: u32 = 123456789;
584
585        let mut buffer = Buffer::new();
586
587        buffer.write_u32(version);
588
589        assert_eq!(buffer, Buffer::from([21, 205, 91, 7].to_vec()));
590    }
591
592    // #[test]
593    // fn test_write_hash() {
594    //     let hash = Hash::from("bb42edce1895f9a969e81d7371ec113a0966e5d55035a84f87ca098e4f0a1a86");
595
596    //     let mut buffer = Buffer::new();
597
598    //     buffer.write_hash(hash);
599    // }
600
601    #[test]
602    fn test_to_hex() {
603        let version: u32 = 123456789;
604
605        let mut buffer = Buffer::new();
606
607        buffer.write_u32(version);
608
609        assert_eq!(buffer, Buffer::from([21, 205, 91, 7].to_vec()));
610
611        let hex = buffer.to_hex();
612
613        assert_eq!(hex, "15cd5b07")
614    }
615
616    #[test]
617    fn test_into_hex() {
618        let version: u32 = 123456789;
619
620        let mut buffer = Buffer::new();
621
622        buffer.write_u32(version);
623
624        assert_eq!(buffer, Buffer::from([21, 205, 91, 7].to_vec()));
625
626        let hex = buffer.into_hex();
627
628        assert_eq!(hex, "15cd5b07")
629    }
630
631    #[test]
632    fn test_from_hex() {
633        //@todo would really like to support this type of from/toHx.
634        let buffer = Buffer::from_hex("FF00").unwrap();
635
636        dbg!(&buffer);
637
638        assert_eq!(buffer, Buffer::from(vec![255, 0]));
639    }
640
641    #[cfg(feature = "serialization")]
642    #[test]
643    fn test_serde() {
644        use serde_test::{assert_tokens, Configure, Token};
645
646        let version: u32 = 123456789;
647
648        let mut buffer = Buffer::new();
649
650        buffer.write_u32(version);
651
652        static version_bytes: [u8; 4] = [21, 205, 91, 7];
653
654        let buffer_readable = buffer.clone();
655
656        assert_tokens(&buffer.compact(), &[Token::BorrowedBytes(&version_bytes)]);
657        assert_tokens(&buffer_readable.readable(), &[Token::Str("15cd5b07")]);
658    }
659}