/ console / program / src / request / serialize.rs
serialize.rs
  1  // Copyright (c) 2025-2026 ACDC Network
  2  // This file is part of the alphavm library.
  3  //
  4  // Alpha Chain | Delta Chain Protocol
  5  // International Monetary Graphite.
  6  //
  7  // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com).
  8  // They built world-class ZK infrastructure. We installed the EASY button.
  9  // Their cryptography: elegant. Our modifications: bureaucracy-compatible.
 10  // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours.
 11  //
 12  // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0
 13  // All modifications and new work: CC0 1.0 Universal Public Domain Dedication.
 14  // No rights reserved. No permission required. No warranty. No refunds.
 15  //
 16  // https://creativecommons.org/publicdomain/zero/1.0/
 17  // SPDX-License-Identifier: CC0-1.0
 18  
 19  use super::*;
 20  
 21  use alphavm_utilities::DeserializeExt;
 22  
 23  impl<N: Network> Serialize for Request<N> {
 24      /// Serializes the request into string or bytes.
 25      fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
 26          match serializer.is_human_readable() {
 27              true => {
 28                  let mut transition = serializer.serialize_struct("Request", 11)?;
 29                  transition.serialize_field("signer", &self.signer)?;
 30                  transition.serialize_field("network", &self.network_id)?;
 31                  transition.serialize_field("program", &self.program_id)?;
 32                  transition.serialize_field("function", &self.function_name)?;
 33                  transition.serialize_field("input_ids", &self.input_ids)?;
 34                  transition.serialize_field("inputs", &self.inputs)?;
 35                  transition.serialize_field("signature", &self.signature)?;
 36                  transition.serialize_field("sk_tag", &self.sk_tag)?;
 37                  transition.serialize_field("tvk", &self.tvk)?;
 38                  transition.serialize_field("tcm", &self.tcm)?;
 39                  transition.serialize_field("scm", &self.scm)?;
 40                  transition.end()
 41              }
 42              false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
 43          }
 44      }
 45  }
 46  
 47  impl<'de, N: Network> Deserialize<'de> for Request<N> {
 48      /// Deserializes the request from a string or bytes.
 49      fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
 50          match deserializer.is_human_readable() {
 51              true => {
 52                  // Parse the request from a string into a value.
 53                  let mut request = serde_json::Value::deserialize(deserializer)?;
 54                  // Recover the request.
 55                  Ok(Self::from((
 56                      // Retrieve the signer.
 57                      DeserializeExt::take_from_value::<D>(&mut request, "signer")?,
 58                      // Retrieve the network ID.
 59                      DeserializeExt::take_from_value::<D>(&mut request, "network")?,
 60                      // Retrieve the program ID.
 61                      DeserializeExt::take_from_value::<D>(&mut request, "program")?,
 62                      // Retrieve the function name.
 63                      DeserializeExt::take_from_value::<D>(&mut request, "function")?,
 64                      // Retrieve the input IDs.
 65                      DeserializeExt::take_from_value::<D>(&mut request, "input_ids")?,
 66                      // Retrieve the inputs.
 67                      DeserializeExt::take_from_value::<D>(&mut request, "inputs")?,
 68                      // Retrieve the signature.
 69                      DeserializeExt::take_from_value::<D>(&mut request, "signature")?,
 70                      // Retrieve the `sk_tag`.
 71                      DeserializeExt::take_from_value::<D>(&mut request, "sk_tag")?,
 72                      // Retrieve the `tvk`.
 73                      DeserializeExt::take_from_value::<D>(&mut request, "tvk")?,
 74                      // Retrieve the `tcm`.
 75                      DeserializeExt::take_from_value::<D>(&mut request, "tcm")?,
 76                      // Retrieve the `scm`.
 77                      DeserializeExt::take_from_value::<D>(&mut request, "scm")?,
 78                  )))
 79              }
 80              false => FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "request"),
 81          }
 82      }
 83  }
 84  
 85  #[cfg(test)]
 86  mod tests {
 87      use super::*;
 88  
 89      #[test]
 90      fn test_serde_json() -> Result<()> {
 91          let mut rng = TestRng::default();
 92  
 93          for expected in test_helpers::sample_requests(&mut rng).into_iter() {
 94              // Serialize
 95              let expected_string = &expected.to_string();
 96              let candidate_string = serde_json::to_string(&expected)?;
 97  
 98              // Deserialize
 99              assert_eq!(expected, Request::from_str(expected_string)?);
100              assert_eq!(expected, serde_json::from_str(&candidate_string)?);
101          }
102          Ok(())
103      }
104  
105      #[test]
106      fn test_bincode() {
107          let mut rng = TestRng::default();
108  
109          for expected in test_helpers::sample_requests(&mut rng).into_iter() {
110              // Serialize
111              let expected_bytes = expected.to_bytes_le().unwrap();
112              let expected_bytes_with_size_encoding = bincode::serialize(&expected).unwrap();
113              assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
114  
115              // Deserialize
116              assert_eq!(expected, Request::read_le(&expected_bytes[..]).unwrap());
117              assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding).unwrap());
118          }
119      }
120  }