Browse Source

chore(core): stop using deprecated serialization from sigma-proofs

Michele Orru 2 weeks ago
parent
commit
f98e7faba7
1 changed files with 44 additions and 16 deletions
  1. 44 16
      sigma-compiler-core/src/codegen.rs

+ 44 - 16
sigma-compiler-core/src/codegen.rs

@@ -369,14 +369,17 @@ impl CodeGen {
             let sent_instance_code = {
                 let chunks = self.sent_instance.fields.iter().map(|sf| match sf {
                     StructField::Point(id) => quote! {
-                        #proof_var.extend(sigma_proofs::serialization::serialize_elements(
-                            std::slice::from_ref(&#codegen_instance_var.#id)
-                        ));
+                        #proof_var.extend_from_slice(
+                            <Point as group::GroupEncoding>::to_bytes(&#codegen_instance_var.#id)
+                                .as_ref()
+                        );
                     },
                     StructField::VecPoint(id) => quote! {
-                        #proof_var.extend(sigma_proofs::serialization::serialize_elements(
-                            &#codegen_instance_var.#id
-                        ));
+                        for point in &#codegen_instance_var.#id {
+                            #proof_var.extend_from_slice(
+                                <Point as group::GroupEncoding>::to_bytes(point).as_ref()
+                            );
+                        }
                     },
                     _ => quote! {},
                 });
@@ -462,18 +465,43 @@ impl CodeGen {
 
                 let chunks = self.sent_instance.fields.iter().map(|sf| match sf {
                     StructField::Point(id) => quote! {
-                        let #id: Point = sigma_proofs::serialization::deserialize_elements(
-                                &#proof_var[#offset_var..],
-                                1,
-                            ).ok_or(SigmaError::VerificationFailure)?[0];
-                        #offset_var += #element_len_var;
+                        let #id: Point = {
+                            let end = #offset_var + #element_len_var;
+                            if #proof_var.len() < end {
+                                return Err(SigmaError::VerificationFailure);
+                            }
+                            let mut repr = <Point as group::GroupEncoding>::Repr::default();
+                            repr.as_mut()
+                                .copy_from_slice(&#proof_var[#offset_var..end]);
+                            #offset_var = end;
+                            Option::<Point>::from(
+                                <Point as group::GroupEncoding>::from_bytes(&repr)
+                            )
+                            .ok_or(SigmaError::VerificationFailure)?
+                        };
                     },
                     StructField::VecPoint(id) => quote! {
-                        #id = sigma_proofs::serialization::deserialize_elements(
-                                &#proof_var[#offset_var..],
-                                #id.len(),
-                            ).ok_or(SigmaError::VerificationFailure)?;
-                        #offset_var += #element_len_var * #id.len();
+                        {
+                            let expected_len = #id.len();
+                            let mut points = Vec::with_capacity(expected_len);
+                            for _ in 0..expected_len {
+                                let end = #offset_var + #element_len_var;
+                                if #proof_var.len() < end {
+                                    return Err(SigmaError::VerificationFailure);
+                                }
+                                let mut repr =
+                                    <Point as group::GroupEncoding>::Repr::default();
+                                repr.as_mut()
+                                    .copy_from_slice(&#proof_var[#offset_var..end]);
+                                #offset_var = end;
+                                let point = Option::<Point>::from(
+                                    <Point as group::GroupEncoding>::from_bytes(&repr)
+                                )
+                                .ok_or(SigmaError::VerificationFailure)?;
+                                points.push(point);
+                            }
+                            #id = points;
+                        }
                     },
                     _ => quote! {},
                 });