snarkvm_ledger_block/transaction/deployment/
bytes.rs1use super::*;
17
18impl<N: Network> FromBytes for Deployment<N> {
19 fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21 let version = match u8::read_le(&mut reader)? {
23 1 => DeploymentVersion::V1,
24 2 => DeploymentVersion::V2,
25 3 => DeploymentVersion::V3,
26 version => return Err(error(format!("Invalid deployment version: {version}"))),
27 };
28
29 let edition = u16::read_le(&mut reader)?;
31 let program = Program::read_le(&mut reader)?;
33
34 let num_entries = u16::read_le(&mut reader)?;
36 let max_entries = N::MAX_FUNCTIONS + N::MAX_RECORDS;
38 if num_entries as usize > max_entries {
39 return Err(error(format!(
40 "Deployment (from 'read_le') has too many entries ({num_entries} > {max_entries})"
41 )));
42 }
43 let mut verifying_keys = Vec::with_capacity(num_entries as usize);
45 for _ in 0..num_entries {
46 let identifier = Identifier::<N>::read_le(&mut reader)?;
48 let verifying_key = VerifyingKey::<N>::read_le(&mut reader)?;
50 let certificate = Certificate::<N>::read_le(&mut reader)?;
52 verifying_keys.push((identifier, (verifying_key, certificate)));
54 }
55
56 let program_checksum = match version {
58 DeploymentVersion::V1 => None,
59 DeploymentVersion::V2 | DeploymentVersion::V3 => {
60 let bytes: [u8; 32] = FromBytes::read_le(&mut reader)?;
62 let checksum = bytes.map(U8::new);
63 if checksum != program.to_checksum() {
65 return Err(error(format!(
66 "Invalid checksum in the deployment: expected [{}], got [{}]",
67 program.to_checksum().iter().join(", "),
68 checksum.iter().join(", ")
69 )));
70 }
71 Some(checksum)
72 }
73 };
74 let program_owner = match version {
77 DeploymentVersion::V1 | DeploymentVersion::V3 => None,
78 DeploymentVersion::V2 => {
79 let owner = Address::<N>::read_le(&mut reader)?;
81 Some(owner)
82 }
83 };
84
85 Self::new(edition, program, verifying_keys, program_checksum, program_owner)
87 .map_err(|err| error(format!("{err}")))
88 }
89}
90
91impl<N: Network> ToBytes for Deployment<N> {
92 fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
94 let version = self.version().map_err(error)?;
97 (version as u8).write_le(&mut writer)?;
99 self.edition.write_le(&mut writer)?;
101 self.program.write_le(&mut writer)?;
103 (u16::try_from(self.verifying_keys.len()).map_err(|e| error(e.to_string()))?).write_le(&mut writer)?;
105 for (name, (verifying_key, certificate)) in &self.verifying_keys {
107 name.write_le(&mut writer)?;
109 verifying_key.write_le(&mut writer)?;
111 certificate.write_le(&mut writer)?;
113 }
114 if matches!(version, DeploymentVersion::V2 | DeploymentVersion::V3) {
117 for byte in &self.program_checksum.unwrap() {
119 byte.write_le(&mut writer)?;
120 }
121 }
122 if matches!(version, DeploymentVersion::V2) {
125 self.program_owner.unwrap().write_le(&mut writer)?;
126 }
127 Ok(())
128 }
129}
130
131#[cfg(test)]
132mod tests {
133 use super::*;
134
135 #[test]
136 fn test_bytes() -> Result<()> {
137 let rng = &mut TestRng::default();
138
139 for expected in [
141 test_helpers::sample_deployment_v1(Uniform::rand(rng), rng),
142 test_helpers::sample_deployment_v2_without_translation_keys(Uniform::rand(rng), rng),
143 test_helpers::sample_deployment_v2_with_translation_keys(Uniform::rand(rng), rng),
144 test_helpers::sample_deployment_v3(Uniform::rand(rng), rng),
145 ] {
146 let expected_bytes = expected.to_bytes_le()?;
148 assert_eq!(expected, Deployment::read_le(&expected_bytes[..])?);
149 }
150
151 Ok(())
152 }
153}