use super::*;
impl<N: Network> FromBytes for DynamicRecord<N> {
fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
let version = u8::read_le(&mut reader)?;
if version != 1 {
return Err(error("Invalid dynamic record version"));
}
let owner = Address::read_le(&mut reader)?;
let root = Field::read_le(&mut reader)?;
let nonce = Group::read_le(&mut reader)?;
let version = U8::read_le(&mut reader)?;
Ok(Self::new_unchecked(owner, root, nonce, version, None))
}
}
impl<N: Network> ToBytes for DynamicRecord<N> {
fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
1u8.write_le(&mut writer)?;
self.owner.write_le(&mut writer)?;
self.root.write_le(&mut writer)?;
self.nonce.write_le(&mut writer)?;
self.version.write_le(&mut writer)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{Entry, Identifier, Literal, Owner, Plaintext, Record};
use snarkvm_console_network::MainnetV0;
use snarkvm_console_types::U64;
use snarkvm_utilities::{TestRng, Uniform};
use core::str::FromStr;
type CurrentNetwork = MainnetV0;
fn check_bytes(record: &Record<CurrentNetwork, Plaintext<CurrentNetwork>>) {
let expected = DynamicRecord::from_record(record).unwrap();
let expected_bytes = expected.to_bytes_le().unwrap();
let candidate = DynamicRecord::<CurrentNetwork>::read_le(&expected_bytes[..]).unwrap();
assert_eq!(expected.owner(), candidate.owner());
assert_eq!(expected.root(), candidate.root());
assert_eq!(expected.nonce(), candidate.nonce());
assert_eq!(expected.version(), candidate.version());
}
#[test]
fn test_bytes() {
let rng = &mut TestRng::default();
let data = indexmap::indexmap! {
Identifier::from_str("amount").unwrap() => Entry::Private(Plaintext::from(Literal::U64(U64::rand(rng)))),
};
let owner = Owner::Public(Address::rand(rng));
let record = Record::<CurrentNetwork, Plaintext<CurrentNetwork>>::from_plaintext(
owner,
data,
Group::rand(rng),
U8::new(0),
)
.unwrap();
check_bytes(&record);
let owner = Owner::Public(Address::rand(rng));
let record = Record::<CurrentNetwork, Plaintext<CurrentNetwork>>::from_plaintext(
owner,
indexmap::IndexMap::new(),
Group::rand(rng),
U8::new(0),
)
.unwrap();
check_bytes(&record);
let data = indexmap::indexmap! {
Identifier::from_str("a").unwrap() => Entry::Private(Plaintext::from(Literal::U64(U64::rand(rng)))),
Identifier::from_str("b").unwrap() => Entry::Public(Plaintext::from(Literal::U64(U64::rand(rng)))),
Identifier::from_str("c").unwrap() => Entry::Constant(Plaintext::from(Literal::U64(U64::rand(rng)))),
};
let owner = Owner::Private(Plaintext::from(Literal::Address(Address::rand(rng))));
let record = Record::<CurrentNetwork, Plaintext<CurrentNetwork>>::from_plaintext(
owner,
data,
Group::rand(rng),
U8::new(0),
)
.unwrap();
check_bytes(&record);
}
}