snarkvm_console_program/data/value/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Value<N> {
19 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21 let index = u8::read_le(&mut reader)?;
23 let entry = match index {
25 0 => Self::Plaintext(Plaintext::read_le(&mut reader)?),
26 1 => Self::Record(Record::read_le(&mut reader)?),
27 2 => Self::Future(Future::read_le(&mut reader)?),
28 3 => Self::DynamicRecord(DynamicRecord::read_le(&mut reader)?),
29 4 => Self::DynamicFuture(DynamicFuture::read_le(&mut reader)?),
30 5.. => return Err(error(format!("Failed to decode value variant {index}"))),
31 };
32 Ok(entry)
33 }
34}
35
36impl<N: Network> ToBytes for Value<N> {
37 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
39 match self {
40 Self::Plaintext(plaintext) => {
41 0u8.write_le(&mut writer)?;
42 plaintext.write_le(&mut writer)
43 }
44 Self::Record(record) => {
45 1u8.write_le(&mut writer)?;
46 record.write_le(&mut writer)
47 }
48 Self::Future(future) => {
49 2u8.write_le(&mut writer)?;
50 future.write_le(&mut writer)
51 }
52 Self::DynamicRecord(dynamic_record) => {
53 3u8.write_le(&mut writer)?;
54 dynamic_record.write_le(&mut writer)
55 }
56 Self::DynamicFuture(dynamic_future) => {
57 4u8.write_le(&mut writer)?;
58 dynamic_future.write_le(&mut writer)
59 }
60 }
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67 use crate::{Argument, Entry, Identifier, Literal, Owner, ProgramID};
68 use snarkvm_console_network::MainnetV0;
69 use snarkvm_console_types::{Group, U8, U64};
70 use snarkvm_utilities::{TestRng, Uniform};
71
72 type CurrentNetwork = MainnetV0;
73
74 #[test]
75 fn test_value_plaintext_bytes() {
76 let expected = Value::Plaintext(
78 Plaintext::<CurrentNetwork>::from_str(
79 "{ owner: aleo1d5hg2z3ma00382pngntdp68e74zv54jdxy249qhaujhks9c72yrs33ddah, token_amount: 100u64 }",
80 )
81 .unwrap(),
82 );
83
84 let expected_bytes = expected.to_bytes_le().unwrap();
86 assert_eq!(expected, Value::read_le(&expected_bytes[..]).unwrap());
87 }
88
89 #[test]
90 fn test_value_record_bytes() {
91 let expected = Value::Record(
93 Record::<CurrentNetwork, Plaintext<CurrentNetwork>>::from_str(
94 "{ owner: aleo1d5hg2z3ma00382pngntdp68e74zv54jdxy249qhaujhks9c72yrs33ddah.private, token_amount: 100u64.private, _nonce: 0group.public }",
95 )
96 .unwrap(),
97 );
98
99 let expected_bytes = expected.to_bytes_le().unwrap();
101 assert_eq!(expected, Value::read_le(&expected_bytes[..]).unwrap());
102 }
103
104 #[test]
105 fn test_value_future_bytes() {
106 let future = Future::<CurrentNetwork>::new(
108 ProgramID::from_str("test.aleo").unwrap(),
109 Identifier::from_str("foo").unwrap(),
110 vec![Argument::Plaintext(Plaintext::from_str("100u64").unwrap())],
111 );
112 let expected = Value::Future(future);
113
114 let expected_bytes = expected.to_bytes_le().unwrap();
116 assert_eq!(expected, Value::read_le(&expected_bytes[..]).unwrap());
117 }
118
119 #[test]
120 fn test_value_dynamic_record_bytes() {
121 let rng = &mut TestRng::default();
122
123 let data = indexmap::indexmap! {
125 Identifier::from_str("amount").unwrap() => Entry::Private(Plaintext::from(Literal::U64(U64::rand(rng)))),
126 };
127 let owner = Owner::Public(Address::rand(rng));
128 let record = Record::<CurrentNetwork, Plaintext<CurrentNetwork>>::from_plaintext(
129 owner,
130 data,
131 Group::rand(rng),
132 U8::new(0),
133 )
134 .unwrap();
135
136 let dynamic_record = DynamicRecord::from_record(&record).unwrap();
138 let expected = Value::DynamicRecord(dynamic_record);
139
140 let expected_bytes = expected.to_bytes_le().unwrap();
142 let candidate = Value::<CurrentNetwork>::read_le(&expected_bytes[..]).unwrap();
143
144 match (&expected, &candidate) {
146 (Value::DynamicRecord(e), Value::DynamicRecord(c)) => {
147 assert_eq!(e.owner(), c.owner());
148 assert_eq!(e.root(), c.root());
149 assert_eq!(e.nonce(), c.nonce());
150 assert_eq!(e.version(), c.version());
151 }
152 _ => panic!("Expected DynamicRecord value"),
153 }
154 }
155
156 #[test]
157 fn test_value_dynamic_future_bytes() {
158 let future = Future::<CurrentNetwork>::new(
160 ProgramID::from_str("test.aleo").unwrap(),
161 Identifier::from_str("foo").unwrap(),
162 vec![Argument::Plaintext(Plaintext::from_str("100u64").unwrap())],
163 );
164
165 let dynamic_future = DynamicFuture::from_future(&future).unwrap();
167 let expected = Value::DynamicFuture(dynamic_future);
168
169 let expected_bytes = expected.to_bytes_le().unwrap();
171 let candidate = Value::<CurrentNetwork>::read_le(&expected_bytes[..]).unwrap();
172
173 match (&expected, &candidate) {
175 (Value::DynamicFuture(e), Value::DynamicFuture(c)) => {
176 assert_eq!(e.program_name(), c.program_name());
177 assert_eq!(e.program_network(), c.program_network());
178 assert_eq!(e.function_name(), c.function_name());
179 assert_eq!(e.checksum(), c.checksum());
180 }
181 _ => panic!("Expected DynamicFuture value"),
182 }
183 }
184}