use super::*;
impl<A: Aleo> ToBits for Record<A, Plaintext<A>> {
type Boolean = Boolean<A>;
fn write_bits_le(&self, vec: &mut Vec<Self::Boolean>) {
vec.push(self.owner.is_private());
match &self.owner {
Owner::Public(public) => public.write_bits_le(vec),
Owner::Private(Plaintext::Literal(Literal::Address(address), ..)) => address.write_bits_le(vec),
_ => A::halt("Internal error: plaintext to_bits_le corrupted in record owner"),
};
let mut data_bits_le = vec![];
for (identifier, entry) in &self.data {
identifier.write_bits_le(&mut data_bits_le);
entry.write_bits_le(&mut data_bits_le);
}
if data_bits_le.len() >= (1 << 31) {
A::halt("Record data exceeds (1 << 31) bits")
}
vec.extend_from_slice(&U32::constant(console::U32::new(data_bits_le.len() as u32)).to_bits_le()[..31]);
vec.push(self.is_hiding());
vec.extend_from_slice(&data_bits_le);
self.nonce.write_bits_le(vec);
self.version.write_bits_le(vec);
}
fn write_bits_be(&self, vec: &mut Vec<Self::Boolean>) {
vec.push(self.owner.is_private());
match &self.owner {
Owner::Public(public) => public.write_bits_be(vec),
Owner::Private(Plaintext::Literal(Literal::Address(address), ..)) => address.write_bits_be(vec),
_ => A::halt("Internal error: plaintext to_bits_be corrupted in record owner"),
};
let mut data_bits_be = vec![];
for (identifier, entry) in &self.data {
identifier.write_bits_be(&mut data_bits_be);
entry.write_bits_be(&mut data_bits_be);
}
if data_bits_be.len() >= (1 << 31) {
A::halt("Record data exceeds (1 << 31) bits")
}
vec.push(self.is_hiding());
vec.extend_from_slice(&U32::constant(console::U32::new(data_bits_be.len() as u32)).to_bits_be()[1..]);
vec.extend_from_slice(&data_bits_be);
self.nonce.write_bits_be(vec);
self.version.write_bits_be(vec);
}
}
impl<A: Aleo> ToBits for Record<A, Ciphertext<A>> {
type Boolean = Boolean<A>;
fn write_bits_le(&self, vec: &mut Vec<Self::Boolean>) {
vec.push(self.owner.is_private());
match &self.owner {
Owner::Public(public) => public.write_bits_le(vec),
Owner::Private(ciphertext) => {
match ciphertext.len() == 1 {
true => ciphertext[0].write_bits_le(vec),
false => A::halt("Internal error: ciphertext to_bits_le corrupted in record owner"),
}
}
};
let mut data_bits_le = vec![];
for (identifier, entry) in &self.data {
identifier.write_bits_le(&mut data_bits_le);
entry.write_bits_le(&mut data_bits_le);
}
if data_bits_le.len() >= (1 << 31) {
A::halt("Record data exceeds (1 << 31) bits")
}
vec.extend_from_slice(&U32::constant(console::U32::new(data_bits_le.len() as u32)).to_bits_le()[..31]);
vec.push(self.is_hiding());
vec.extend_from_slice(&data_bits_le);
self.nonce.write_bits_le(vec);
self.version.write_bits_le(vec);
}
fn write_bits_be(&self, vec: &mut Vec<Self::Boolean>) {
vec.push(self.owner.is_private());
match &self.owner {
Owner::Public(public) => public.write_bits_be(vec),
Owner::Private(ciphertext) => {
match ciphertext.len() == 1 {
true => ciphertext[0].write_bits_be(vec),
false => A::halt("Internal error: ciphertext to_bits_be corrupted in record owner"),
}
}
};
let mut data_bits_be = vec![];
for (identifier, entry) in &self.data {
identifier.write_bits_be(&mut data_bits_be);
entry.write_bits_be(&mut data_bits_be);
}
if data_bits_be.len() >= (1 << 31) {
A::halt("Record data exceeds (1 << 31) bits")
}
vec.push(self.is_hiding());
vec.extend_from_slice(&U32::constant(console::U32::new(data_bits_be.len() as u32)).to_bits_be()[1..]);
vec.extend_from_slice(&data_bits_be);
self.nonce.write_bits_be(vec);
self.version.write_bits_be(vec);
}
}