snarkvm_console_program/data/record/
bytes.rs1use super::*;
17
18impl<N: Network, Private: Visibility> FromBytes for Record<N, Private> {
19 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21 let owner = Owner::read_le(&mut reader)?;
23 let num_entries = u8::read_le(&mut reader)?;
25 let mut data = IndexMap::with_capacity(num_entries as usize);
27 for _ in 0..num_entries {
28 let identifier = Identifier::<N>::read_le(&mut reader)?;
30 let num_bytes = u16::read_le(&mut reader)?;
32 let mut bytes = Vec::new();
34 (&mut reader).take(num_bytes as u64).read_to_end(&mut bytes)?;
35 let entry = Entry::read_le(&mut bytes.as_slice())?;
37 data.insert(identifier, entry);
39 }
40 let nonce = Group::read_le(&mut reader)?;
42
43 let reserved = [Identifier::from_str("owner").map_err(|e| error(e.to_string()))?];
45 if has_duplicates(data.keys().chain(reserved.iter())) {
47 return Err(error("Duplicate entry type found in record"));
48 }
49 if data.len() > N::MAX_DATA_ENTRIES {
51 return Err(error("Failed to parse record: too many entries"));
52 }
53
54 Ok(Self { owner, data, nonce })
55 }
56}
57
58impl<N: Network, Private: Visibility> ToBytes for Record<N, Private> {
59 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
61 self.owner.write_le(&mut writer)?;
63 u8::try_from(self.data.len()).or_halt_with::<N>("Record length exceeds u8::MAX").write_le(&mut writer)?;
65 for (entry_name, entry_value) in &self.data {
67 entry_name.write_le(&mut writer)?;
69 let bytes = entry_value.to_bytes_le().map_err(|e| error(e.to_string()))?;
71 u16::try_from(bytes.len())
73 .or_halt_with::<N>("Record entry exceeds u16::MAX bytes")
74 .write_le(&mut writer)?;
75 bytes.write_le(&mut writer)?;
77 }
78 self.nonce.write_le(&mut writer)
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86 use snarkvm_console_network::MainnetV0;
87
88 type CurrentNetwork = MainnetV0;
89
90 #[test]
91 fn test_bytes() -> Result<()> {
92 let expected = Record::<CurrentNetwork, Plaintext<CurrentNetwork>>::from_str(
94 "{ owner: aleo1d5hg2z3ma00382pngntdp68e74zv54jdxy249qhaujhks9c72yrs33ddah.private, token_amount: 100u64.private, _nonce: 0group.public }",
95 )?;
96
97 let expected_bytes = expected.to_bytes_le()?;
99 assert_eq!(expected, Record::read_le(&expected_bytes[..])?);
100 Ok(())
101 }
102}