pub struct Blob<const N: usize>(/* private fields */);
Expand description
A fixed-size byte array wrapper for safely handling binary data of known length.
Blob<N>
represents an immutable, fixed-size array of bytes that provides
safe access and manipulation. It serves as a foundation for many domain-specific
types in ZeWIF that need to represent fixed-length binary data, such as:
- Transaction IDs (32 bytes)
- Cryptographic keys (various lengths)
- Diversifier indices (11 bytes)
- Hashes and other cryptographic values
§Zcash Concept Relation
In Zcash, many protocol elements are represented as fixed-size binary values with
specific encodings. Blob<N>
provides a type-safe way to handle these values
and ensures they maintain their correct size throughout operations.
§Data Preservation
Blob<N>
preserves raw binary data exactly as it appears in wallet files,
ensuring that cryptographic material and identifiers maintain their exact
binary representation throughout the migration process.
§Examples
§Construction
// Create a blob with 32 bytes (common for transaction hashes)
let data = [0u8; 32];
let blob = Blob::new(data);
// Access data with index operations
assert_eq!(blob[0], 0);
// Convert to hex for display
let hex_string = hex::encode(blob.as_slice());
Implementations§
Source§impl<const N: usize> Blob<N>
impl<const N: usize> Blob<N>
Sourcepub fn new(data: [u8; N]) -> Self
pub fn new(data: [u8; N]) -> Self
Creates a new Blob
from a fixed-size byte array.
This is the primary constructor for Blob<N>
when you have an
exact-sized array available.
§Examples
let data = [1, 2, 3, 4];
let blob = Blob::new(data);
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the length of the blob in bytes.
This will always return the same value (N) for a given Blob<N>
type.
§Examples
let blob = Blob::<32>::default();
assert_eq!(blob.len(), 32);
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if the blob contains no bytes (N = 0).
Note: For most practical uses of Blob<N>
, this will always return false
as N is typically greater than 0.
§Examples
let blob = Blob::<32>::default();
assert!(!blob.is_empty());
Sourcepub fn to_vec(&self) -> Vec<u8> ⓘ
pub fn to_vec(&self) -> Vec<u8> ⓘ
Converts the blob to a Vec<u8>
, creating a copy of the data.
§Examples
let blob = Blob::<4>::new([1, 2, 3, 4]);
let vec = blob.to_vec();
assert_eq!(vec, vec![1, 2, 3, 4]);
Sourcepub fn as_slice(&self) -> &[u8] ⓘ
pub fn as_slice(&self) -> &[u8] ⓘ
Returns a reference to the underlying byte array as a slice.
This is useful when you need to pass the blob’s contents to functions that accept slices.
§Examples
let blob = Blob::<4>::new([1, 2, 3, 4]);
let slice = blob.as_slice();
assert_eq!(slice, &[1, 2, 3, 4]);
Sourcepub fn from_slice(data: &[u8]) -> Result<Self, TryFromSliceError>
pub fn from_slice(data: &[u8]) -> Result<Self, TryFromSliceError>
Creates a Blob
from a slice of bytes.
§Errors
Returns an error if the slice’s length doesn’t match the expected size N.
§Examples
let slice = &[1, 2, 3, 4];
let blob = Blob::<4>::from_slice(slice).unwrap();
assert_eq!(blob.as_slice(), slice);
// This would fail:
let result = Blob::<5>::from_slice(slice);
assert!(result.is_err());
Trait Implementations§
impl<const N: usize> Eq for Blob<N>
impl<const N: usize> StructuralPartialEq for Blob<N>
Auto Trait Implementations§
impl<const N: usize> Freeze for Blob<N>
impl<const N: usize> RefUnwindSafe for Blob<N>
impl<const N: usize> Send for Blob<N>
impl<const N: usize> Sync for Blob<N>
impl<const N: usize> Unpin for Blob<N>
impl<const N: usize> UnwindSafe for Blob<N>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CBORDecodable for T
impl<T> CBORDecodable for T
Source§impl<T> CBOREncodable for T
impl<T> CBOREncodable for T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> EnvelopeEncodable for T
impl<T> EnvelopeEncodable for T
Source§fn into_envelope(self) -> Envelope
fn into_envelope(self) -> Envelope
Converts the value into an envelope by using its Into<Envelope>
implementation.
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> ToHex for T
impl<T> ToHex for T
Source§fn encode_hex<U>(&self) -> Uwhere
U: FromIterator<char>,
fn encode_hex<U>(&self) -> Uwhere
U: FromIterator<char>,
self
into the result. Lower case
letters are used (e.g. f9b4ca
)Source§fn encode_hex_upper<U>(&self) -> Uwhere
U: FromIterator<char>,
fn encode_hex_upper<U>(&self) -> Uwhere
U: FromIterator<char>,
self
into the result. Upper case
letters are used (e.g. F9B4CA
)