zebra_chain/serialization/display_order.rs
1//! Trait for converting types to their byte representation for display or RPC use.
2///
3/// This trait provides methods to access and construct types from their
4/// internal serialized byte order (typically little-endian) as well as their
5/// big-endian byte order used for display and RPC.
6///
7/// Zebra displays transaction and block hashes in big-endian byte-order,
8/// following the u256 convention set by Bitcoin and zcashd.
9pub trait BytesInDisplayOrder<
10    const SHOULD_REVERSE_BYTES_IN_DISPLAY_ORDER: bool = false,
11    const BYTE_LEN: usize = 32,
12>: Sized
13{
14    /// Returns the bytes in the internal serialized order.
15    fn bytes_in_serialized_order(&self) -> [u8; BYTE_LEN];
16
17    /// Creates an instance from bytes in the internal serialized order.
18    fn from_bytes_in_serialized_order(bytes: [u8; BYTE_LEN]) -> Self;
19
20    /// Return the bytes in big-endian byte-order suitable for printing out byte by byte.
21    fn bytes_in_display_order(&self) -> [u8; BYTE_LEN] {
22        let mut reversed_bytes = self.bytes_in_serialized_order();
23        if SHOULD_REVERSE_BYTES_IN_DISPLAY_ORDER {
24            reversed_bytes.reverse();
25        }
26        reversed_bytes
27    }
28
29    /// Convert bytes in big-endian byte-order into big-endian display order.
30    fn from_bytes_in_display_order(bytes_in_display_order: &[u8; BYTE_LEN]) -> Self {
31        let mut internal_byte_order = *bytes_in_display_order;
32        if SHOULD_REVERSE_BYTES_IN_DISPLAY_ORDER {
33            internal_byte_order.reverse();
34        }
35        Self::from_bytes_in_serialized_order(internal_byte_order)
36    }
37}