threshold_bls/serialize/
mod.rs

1use crate::curve::{bn254, BLSError};
2use crate::group::{Point, Scalar};
3use ark_ec::{AffineCurve, ModelParameters, ProjectiveCurve};
4use ark_ff::Field;
5use ark_ff::PrimeField;
6use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
7use ethers_core::utils::hex;
8
9pub trait ContractSerialize: Sized {
10    /// Serialize the group element into a byte vector.
11    fn serialize_to_contract_form(&self) -> Result<Vec<u8>, BLSError>;
12    /// Deserialize the group element from a byte vector.
13    fn deserialize_from_contract_form(bytes: &[u8]) -> Result<Self, BLSError>;
14}
15
16impl ContractSerialize for bn254::G1 {
17    fn serialize_to_contract_form(&self) -> Result<Vec<u8>, BLSError> {
18        let mut xbytes = vec![];
19        self.0.into_affine().serialize(&mut xbytes).unwrap();
20
21        xbytes.reverse();
22
23        Ok(xbytes)
24    }
25
26    fn deserialize_from_contract_form(bytes: &[u8]) -> Result<Self, BLSError> {
27        let mut ele_bytes = bytes.to_vec();
28        ele_bytes.reverse();
29
30        let affine = ark_bn254::G1Affine::deserialize(&mut &ele_bytes[..])
31            .map_err(|_| BLSError::ContractSerializationError)?;
32
33        Ok(bn254::G1(affine.into_projective()))
34    }
35}
36
37impl ContractSerialize for bn254::G2 {
38    fn serialize_to_contract_form(&self) -> Result<Vec<u8>, BLSError> {
39        let mut xbytes = vec![];
40        self.0.into_affine().x.serialize(&mut xbytes).unwrap();
41
42        let mut x1 = xbytes[..32].to_vec();
43        let mut x2 = xbytes[32..].to_vec();
44
45        x1.reverse();
46        x2.reverse();
47
48        let mut ybytes = vec![];
49        self.0.into_affine().y.serialize(&mut ybytes).unwrap();
50
51        let mut y1 = ybytes[..32].to_vec();
52        let mut y2 = ybytes[32..].to_vec();
53
54        y1.reverse();
55        y2.reverse();
56
57        let bytes = [&x1[..], &x2[..], &y1[..], &y2[..]].concat();
58
59        Ok(bytes)
60    }
61
62    fn deserialize_from_contract_form(bytes: &[u8]) -> Result<Self, BLSError> {
63        let mut x1 = bytes[..32].to_vec();
64        let mut x2 = bytes[32..64].to_vec();
65
66        let f_y1 =
67            <<ark_bn254::g2::Parameters as ModelParameters>::BaseField as Field>::BasePrimeField::from_be_bytes_mod_order(
68                &bytes[64..96],
69            );
70
71        let f_y2 =
72            <<ark_bn254::g2::Parameters as ModelParameters>::BaseField as Field>::BasePrimeField::from_be_bytes_mod_order(
73                &bytes[96..],
74            );
75
76        let f_y =
77            <ark_bn254::g2::Parameters as ModelParameters>::BaseField::from_base_prime_field_elems(
78                &[f_y1, f_y2],
79            )
80            .ok_or(BLSError::NotValidPoint)?;
81
82        if f_y > -f_y {
83            x2[0] |= 1 << 7;
84        }
85
86        x1.reverse();
87        x2.reverse();
88
89        let bytes = [&x1[..], &x2[..]].concat();
90
91        let affine = ark_bn254::G2Affine::deserialize(&mut &bytes[..])
92            .map_err(|_| BLSError::ContractSerializationError)?;
93
94        Ok(bn254::G2(affine.into_projective()))
95    }
96}
97
98pub fn scalar_to_hex<S: Scalar>(s: &S) -> String {
99    let bytes = bincode::serialize(s).unwrap();
100    format!("0x{}", hex::encode(bytes))
101}
102
103pub fn point_to_hex<P: Point>(p: &P) -> String {
104    let bytes = bincode::serialize(p).unwrap();
105    format!("0x{}", hex::encode(bytes))
106}
107
108#[cfg(test)]
109pub mod tests {
110    use crate::{group::Element, serialize::ContractSerialize};
111    use rand::thread_rng;
112
113    #[test]
114    fn test_serialize_bn254_g1_element() {
115        use crate::curve::bn254::G1;
116
117        for _ in 0..10 {
118            let g1 = G1::rand(&mut thread_rng());
119
120            let g1_bytes = g1.serialize_to_contract_form().unwrap();
121
122            let g1_deserialized = G1::deserialize_from_contract_form(&g1_bytes).unwrap();
123
124            assert_eq!(g1, g1_deserialized);
125        }
126    }
127
128    #[test]
129    fn test_serialize_bn254_g2_element() {
130        use crate::curve::bn254::G2;
131
132        for _ in 0..10 {
133            let g2 = G2::rand(&mut thread_rng());
134
135            let g2_bytes = g2.serialize_to_contract_form().unwrap();
136
137            let g2_deserialized = G2::deserialize_from_contract_form(&g2_bytes).unwrap();
138
139            assert_eq!(g2, g2_deserialized);
140        }
141    }
142}