threshold_bls/serialize/
mod.rs1use 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 fn serialize_to_contract_form(&self) -> Result<Vec<u8>, BLSError>;
12 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}