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}