mithril_stm/
parameters.rs1use serde::{Deserialize, Serialize};
2
3use crate::error::RegisterError;
4
5#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
13pub struct Parameters {
14 pub m: u64,
16 pub k: u64,
18 pub phi_f: f64,
20}
21
22impl Parameters {
23 pub fn to_bytes(&self) -> [u8; 24] {
29 let mut out = [0; 24];
30 out[..8].copy_from_slice(&self.m.to_be_bytes());
31 out[8..16].copy_from_slice(&self.k.to_be_bytes());
32 out[16..].copy_from_slice(&self.phi_f.to_be_bytes());
33 out
34 }
35
36 pub fn from_bytes(bytes: &[u8]) -> Result<Self, RegisterError> {
40 let mut u64_bytes = [0u8; 8];
41 u64_bytes.copy_from_slice(bytes.get(..8).ok_or(RegisterError::SerializationError)?);
42 let m = u64::from_be_bytes(u64_bytes);
43 u64_bytes.copy_from_slice(bytes.get(8..16).ok_or(RegisterError::SerializationError)?);
44 let k = u64::from_be_bytes(u64_bytes);
45 u64_bytes.copy_from_slice(bytes.get(16..24).ok_or(RegisterError::SerializationError)?);
46 let phi_f = f64::from_be_bytes(u64_bytes);
47
48 Ok(Self { m, k, phi_f })
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55
56 mod golden {
57 use super::*;
58
59 const GOLDEN_JSON: &str = r#"
60 {
61 "m": 20973,
62 "k": 2422,
63 "phi_f": 0.2
64 }
65 "#;
66
67 fn golden_value() -> Parameters {
68 Parameters {
69 m: 20973,
70 k: 2422,
71 phi_f: 0.2,
72 }
73 }
74
75 #[test]
76 fn golden_conversions() {
77 let value = serde_json::from_str(GOLDEN_JSON)
78 .expect("This JSON deserialization should not fail");
79 assert_eq!(golden_value(), value);
80
81 let serialized =
82 serde_json::to_string(&value).expect("This JSON serialization should not fail");
83 let golden_serialized = serde_json::to_string(&golden_value())
84 .expect("This JSON serialization should not fail");
85 assert_eq!(golden_serialized, serialized);
86 }
87 }
88}