From d9c6df101abb1bbf2cd5cec6b22d2e674d8d401b Mon Sep 17 00:00:00 2001 From: Mikhail Volkhov Date: Mon, 4 Dec 2023 15:41:53 +0000 Subject: [PATCH 1/6] Update proof-systems & snarkyjs --- src/lib/crypto/proof-systems | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/crypto/proof-systems b/src/lib/crypto/proof-systems index ec105db4ebb..ce547934f57 160000 --- a/src/lib/crypto/proof-systems +++ b/src/lib/crypto/proof-systems @@ -1 +1 @@ -Subproject commit ec105db4ebbb6dac397000bc07c5d2427cda96b9 +Subproject commit ce547934f57f6c3245b9a1e59ed2dc9a9ee60c6d From d5c487a20afb5ebbf19666351f3ac7c1c5872d54 Mon Sep 17 00:00:00 2001 From: Mikhail Volkhov Date: Mon, 4 Dec 2023 16:04:14 +0000 Subject: [PATCH 2/6] Remove shifting functionality --- docs/specs/types_and_structures/common.md | 7 ++- .../kimchi_backend/common/plonk_dlog_proof.ml | 5 +- .../crypto/kimchi_backend/common/poly_comm.ml | 48 ++++++------------- .../pasta/basic/kimchi_pasta_basic.ml | 12 ++--- .../kimchi_bindings/stubs/kimchi_types.ml | 3 +- .../stubs/src/pasta_fp_plonk_proof.rs | 13 ++--- .../src/pasta_fp_plonk_verifier_index.rs | 6 +-- .../stubs/src/pasta_fq_plonk_proof.rs | 8 +--- .../src/pasta_fq_plonk_verifier_index.rs | 6 +-- .../crypto/kimchi_bindings/stubs/src/srs.rs | 4 +- src/lib/pickles/common.ml | 4 +- src/lib/pickles/proof_cache.ml | 2 +- .../pickles/side_loaded_verification_key.ml | 4 +- src/lib/pickles/step_main_inputs.ml | 2 +- src/lib/pickles/step_verifier.ml | 14 ++---- src/lib/pickles/util.ml | 8 +--- src/lib/pickles/verification_key.ml | 7 +-- src/lib/pickles/wrap_main_inputs.ml | 2 +- src/lib/pickles/wrap_verifier.ml | 9 ++-- src/lib/pickles_types/pcs_batch.ml | 4 +- src/lib/pickles_types/plonk_types.ml | 5 +- src/lib/pickles_types/plonk_types.mli | 3 +- 22 files changed, 57 insertions(+), 119 deletions(-) diff --git a/docs/specs/types_and_structures/common.md b/docs/specs/types_and_structures/common.md index 6e3e7be1556..55a829078e6 100644 --- a/docs/specs/types_and_structures/common.md +++ b/docs/specs/types_and_structures/common.md @@ -39,10 +39,9 @@ Variable length vector of type `T` ### `PolyComm` -| Field | Type | Description | -| ----------- | ----------- | ----------- | -| `unshifted` | `Vector` | | -| `shifted` | `Option` | | +| Field | Type | Description | +| ------- | ----------- | ----------- | +| `elems` | `Vector` | | ### `CamlPlonkDomain` diff --git a/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml b/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml index 3c4cf6b8886..1baa8c3e4a6 100644 --- a/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml +++ b/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml @@ -484,10 +484,7 @@ module Make (Inputs : Inputs_intf) = struct Array.of_list_map chal_polys ~f:(fun { Challenge_polynomial.commitment = x, y; challenges } -> { Kimchi_types.chals = challenges - ; comm = - { Kimchi_types.shifted = None - ; unshifted = [| Kimchi_types.Finite (x, y) |] - } + ; comm = { elems = [| Kimchi_types.Finite (x, y) |] } } ) } diff --git a/src/lib/crypto/kimchi_backend/common/poly_comm.ml b/src/lib/crypto/kimchi_backend/common/poly_comm.ml index c394040811f..fa6e23a6c93 100644 --- a/src/lib/crypto/kimchi_backend/common/poly_comm.ml +++ b/src/lib/crypto/kimchi_backend/common/poly_comm.ml @@ -29,9 +29,7 @@ module type Inputs_intf = sig val make : Curve.Affine.Backend.t array -> Curve.Affine.Backend.t option -> t - val shifted : t -> Curve.Affine.Backend.t option - - val unshifted : t -> Curve.Affine.Backend.t array + val elems : t -> Curve.Affine.Backend.t array end end @@ -70,13 +68,12 @@ module Make (Inputs : Inputs_intf) = struct | Finite (x, y) -> Finite (x, y) + (* TODO @volhovm remove *) let with_degree_bound_to_backend (commitment : (Base_field.t * Base_field.t) Pickles_types.Or_infinity.t Pickles_types.Plonk_types.Poly_comm.With_degree_bound.t ) : Backend.t = - Backend.make - (Array.map ~f:or_infinity_to_backend commitment.unshifted) - (Some (or_infinity_to_backend commitment.shifted)) + Backend.make (Array.map ~f:or_infinity_to_backend commitment.elems) let without_degree_bound_to_backend (commitment : @@ -94,21 +91,10 @@ module Make (Inputs : Inputs_intf) = struct | `Without_degree_bound t -> without_degree_bound_to_backend t - let of_backend' (t : Backend.t) = - ( Backend.unshifted t - , Option.map (Backend.shifted t) ~f:Curve.Affine.of_backend ) + let of_backend' (t : Backend.t) = Backend.elems t - let of_backend_with_degree_bound (t : Backend.t) : t = - let open Pickles_types.Plonk_types.Poly_comm in - match Backend.shifted t with - | None -> - assert false - | Some shifted -> - let shifted = or_infinity_of_backend shifted in - let unshifted = - Backend.unshifted t |> Array.map ~f:or_infinity_of_backend - in - `With_degree_bound { unshifted; shifted } + (* TODO @volhovm remove *) + let of_backend_with_degree_bound (t : Backend.t) : t = assert false (* type 'a t = @@ -122,17 +108,13 @@ module Make (Inputs : Inputs_intf) = struct let of_backend_without_degree_bound (t : Backend.t) = let open Pickles_types.Plonk_types.Poly_comm in - let unshifted = Backend.unshifted t in - match Backend.shifted t with - | None -> - `Without_degree_bound - (Array.map unshifted ~f:(function - | Infinity -> - failwith - "Pickles cannot handle point at infinity. Commitments must \ - be representable in affine coordinates" - | Finite (x, y) -> - (x, y) ) ) - | _ -> - assert false + let elems = Backend.elems t in + `Without_degree_bound + (Array.map elems ~f:(function + | Infinity -> + failwith + "Pickles cannot handle point at infinity. Commitments must be \ + representable in affine coordinates" + | Finite (x, y) -> + (x, y) ) ) end diff --git a/src/lib/crypto/kimchi_backend/pasta/basic/kimchi_pasta_basic.ml b/src/lib/crypto/kimchi_backend/pasta/basic/kimchi_pasta_basic.ml index 245a7c0ad83..9cdf1940223 100644 --- a/src/lib/crypto/kimchi_backend/pasta/basic/kimchi_pasta_basic.ml +++ b/src/lib/crypto/kimchi_backend/pasta/basic/kimchi_pasta_basic.ml @@ -121,13 +121,11 @@ module Fq_poly_comm = Kimchi_backend_common.Poly_comm.Make (struct module Backend = struct type t = Curve.Affine.Backend.t Kimchi_types.poly_comm - let shifted ({ shifted; _ } : t) = shifted - - let unshifted ({ unshifted; _ } : t) = unshifted + let elems ({ elems; _ } : t) = elems let make : Curve.Affine.Backend.t array -> Curve.Affine.Backend.t option -> t = - fun unshifted shifted : t -> { shifted; unshifted } + fun elems : t -> { elems } end end) @@ -138,13 +136,11 @@ module Fp_poly_comm = Kimchi_backend_common.Poly_comm.Make (struct module Backend = struct type t = Curve.Affine.Backend.t Kimchi_types.poly_comm - let shifted ({ shifted; _ } : t) = shifted - - let unshifted ({ unshifted; _ } : t) = unshifted + let elems ({ elems; _ } : t) = elems let make : Curve.Affine.Backend.t array -> Curve.Affine.Backend.t option -> t = - fun unshifted shifted : t -> { shifted; unshifted } + fun elems : t -> { elems } end end) diff --git a/src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml b/src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml index 6bec0f01f84..bea0be0b01e 100644 --- a/src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml +++ b/src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml @@ -83,8 +83,7 @@ type nonrec 'caml_f proof_evaluations = ; foreign_field_mul_lookup_selector : 'caml_f array point_evaluations option } -type nonrec 'caml_g poly_comm = - { unshifted : 'caml_g array; shifted : 'caml_g option } +type nonrec 'caml_g poly_comm = { elems : 'caml_g array } type nonrec ('caml_g, 'caml_f) recursion_challenge = { chals : 'caml_f array; comm : 'caml_g poly_comm } diff --git a/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_proof.rs b/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_proof.rs index 321dd7e85c9..1c6f00408b0 100644 --- a/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_proof.rs +++ b/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_proof.rs @@ -62,10 +62,7 @@ pub fn caml_pasta_fp_plonk_proof_create( .iter() .map(Into::::into) .collect(); - let comm = PolyComm:: { - unshifted: vec![sg], - shifted: None, - }; + let comm = PolyComm:: { elems: vec![sg] }; RecursionChallenge { chals, comm } }) .collect() @@ -130,10 +127,7 @@ pub fn caml_pasta_fp_plonk_proof_create_and_verify( .iter() .map(Into::::into) .collect(); - let comm = PolyComm:: { - unshifted: vec![sg], - shifted: None, - }; + let comm = PolyComm:: { elems: vec![sg] }; RecursionChallenge { chals, comm } }) .collect() @@ -975,8 +969,7 @@ pub fn caml_pasta_fp_plonk_proof_dummy() -> CamlProofWithPublic PolyComm { let g = Vesta::prime_subgroup_generator(); PolyComm { - shifted: Some(g), - unshifted: vec![g, g, g], + elems: vec![g, g, g], } } diff --git a/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_verifier_index.rs b/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_verifier_index.rs index b4cde02c17a..e50f7362a93 100644 --- a/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_verifier_index.rs +++ b/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_verifier_index.rs @@ -111,8 +111,7 @@ impl From for VerifierIndex> { domain, @@ -244,8 +243,7 @@ pub fn caml_pasta_fp_plonk_verifier_index_dummy() -> CamlPastaFpPlonkVerifierInd fn comm() -> CamlPolyComm { let g: CamlGVesta = Vesta::prime_subgroup_generator().into(); CamlPolyComm { - shifted: Some(g), - unshifted: vec![g, g, g], + elems: vec![g, g, g], } } fn vec_comm(num: usize) -> Vec> { diff --git a/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_proof.rs b/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_proof.rs index b54071f636d..a82b6677c07 100644 --- a/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_proof.rs +++ b/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_proof.rs @@ -57,10 +57,7 @@ pub fn caml_pasta_fq_plonk_proof_create( .iter() .map(Into::::into) .collect(); - let comm = PolyComm:: { - unshifted: vec![sg], - shifted: None, - }; + let comm = PolyComm:: { elems: vec![sg] }; RecursionChallenge { chals, comm } }) .collect() @@ -161,8 +158,7 @@ pub fn caml_pasta_fq_plonk_proof_dummy() -> CamlProofWithPublic PolyComm { let g = Pallas::prime_subgroup_generator(); PolyComm { - shifted: Some(g), - unshifted: vec![g, g, g], + elems: vec![g, g, g], } } diff --git a/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_verifier_index.rs b/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_verifier_index.rs index ab05d84c0c2..2443ae1054c 100644 --- a/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_verifier_index.rs +++ b/src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_verifier_index.rs @@ -110,8 +110,7 @@ impl From for VerifierIndex> { domain, @@ -243,8 +242,7 @@ pub fn caml_pasta_fq_plonk_verifier_index_dummy() -> CamlPastaFqPlonkVerifierInd fn comm() -> CamlPolyComm { let g: CamlGPallas = Pallas::prime_subgroup_generator().into(); CamlPolyComm { - shifted: Some(g), - unshifted: vec![g, g, g], + elems: vec![g, g, g], } } fn vec_comm(num: usize) -> Vec> { diff --git a/src/lib/crypto/kimchi_bindings/stubs/src/srs.rs b/src/lib/crypto/kimchi_bindings/stubs/src/srs.rs index a141f12efdf..32bb14faadc 100644 --- a/src/lib/crypto/kimchi_bindings/stubs/src/srs.rs +++ b/src/lib/crypto/kimchi_bindings/stubs/src/srs.rs @@ -122,7 +122,7 @@ macro_rules! impl_srs { let evals = evals.into_iter().map(Into::into).collect(); let p = Evaluations::<$F>::from_vec_and_domain(evals, x_domain).interpolate(); - Ok(srs.commit_non_hiding(&p, 1, None).into()) + Ok(srs.commit_non_hiding(&p, 1).into()) } #[ocaml_gen::func] @@ -135,7 +135,7 @@ macro_rules! impl_srs { let coeffs = b_poly_coefficients(&chals); let p = DensePolynomial::<$F>::from_coefficients_vec(coeffs); - Ok(srs.commit_non_hiding(&p, 1, None).into()) + Ok(srs.commit_non_hiding(&p, 1).into()) } #[ocaml_gen::func] diff --git a/src/lib/pickles/common.ml b/src/lib/pickles/common.ml index c4149ed19ab..9dc9be295c5 100644 --- a/src/lib/pickles/common.ml +++ b/src/lib/pickles/common.ml @@ -167,7 +167,7 @@ module Ipa = struct (Backend.Tock.Keypair.load_urs ()) (Pickles_types.Vector.to_array (compute_challenges chals)) in - comm.unshifted.(0) |> finite_exn + comm.elems.(0) |> finite_exn end module Step = struct @@ -186,7 +186,7 @@ module Ipa = struct (Backend.Tick.Keypair.load_urs ()) (Pickles_types.Vector.to_array (compute_challenges chals)) in - comm.unshifted.(0) |> finite_exn + comm.elems.(0) |> finite_exn let accumulator_check comm_chals = let chals = diff --git a/src/lib/pickles/proof_cache.ml b/src/lib/pickles/proof_cache.ml index 56784778e0f..1f1edb4ad2c 100644 --- a/src/lib/pickles/proof_cache.ml +++ b/src/lib/pickles/proof_cache.ml @@ -84,7 +84,7 @@ module Json = struct [@@deriving to_yojson] type 'caml_g poly_comm = 'caml_g Kimchi_types.poly_comm = - { unshifted : 'caml_g array; shifted : 'caml_g option } + { elems : 'caml_g array } [@@deriving to_yojson] type lookup_patterns = Kimchi_types.lookup_patterns = diff --git a/src/lib/pickles/side_loaded_verification_key.ml b/src/lib/pickles/side_loaded_verification_key.ml index df697d54471..ed831122e03 100644 --- a/src/lib/pickles/side_loaded_verification_key.ml +++ b/src/lib/pickles/side_loaded_verification_key.ml @@ -207,9 +207,7 @@ module Stable = struct ; srs ; evals = (let g (x, y) = - { Kimchi_types.unshifted = [| Kimchi_types.Finite (x, y) |] - ; shifted = None - } + { Kimchi_types.elems = [| Kimchi_types.Finite (x, y) |] } in { sigma_comm = Array.map ~f:g (Vector.to_array c.sigma_comm) ; coefficients_comm = diff --git a/src/lib/pickles/step_main_inputs.ml b/src/lib/pickles/step_main_inputs.ml index 2b6d012cdf3..beb9dcf44de 100644 --- a/src/lib/pickles/step_main_inputs.ml +++ b/src/lib/pickles/step_main_inputs.ml @@ -98,7 +98,7 @@ end (Kimchi_bindings.Protocol.SRS.Fq.lagrange_commitment (Backend.Tock.Keypair.load_urs ()) domain_size i ) - .unshifted + .elems in assert (Array.length v = 1) ; v.(0) |> Common.finite_exn ) ) ) diff --git a/src/lib/pickles/step_verifier.ml b/src/lib/pickles/step_verifier.ml index 7dba6f595e0..34a1fcbc837 100644 --- a/src/lib/pickles/step_verifier.ml +++ b/src/lib/pickles/step_verifier.ml @@ -244,10 +244,8 @@ struct ~reduce_without_degree_bound:Array.to_list ~reduce_with_degree_bound:(fun { Plonk_types.Poly_comm .With_degree_bound - .unshifted - ; shifted - } -> - Array.to_list unshifted @ [ shifted ] ) + .elems + } -> Array.to_list elems @ [] ) ~scale_and_add:(fun ~(acc : [ `Maybe_finite of Boolean.var * Inner_curve.t @@ -287,11 +285,9 @@ struct (Vector.map with_degree_bound ~f: (let open Plonk_types.Poly_comm.With_degree_bound in - fun { shifted; unshifted } -> + fun { elems } -> let f x = `Maybe_finite x in - { unshifted = Array.map ~f unshifted - ; shifted = f shifted - }) ) ) + { elems = Array.map ~f elems }) ) ) |> function `Finite x -> x | `Maybe_finite _ -> assert false in let lr_prod, challenges = bullet_reduce sponge lr in @@ -347,7 +343,7 @@ struct let lagrange_commitment ~domain srs i = let d = Int.pow 2 (Domain.log2_size domain) in match[@warning "-4"] - (Kimchi_bindings.Protocol.SRS.Fq.lagrange_commitment srs d i).unshifted + (Kimchi_bindings.Protocol.SRS.Fq.lagrange_commitment srs d i).elems with | [| Finite g |] -> Inner_curve.Constant.of_affine g diff --git a/src/lib/pickles/util.ml b/src/lib/pickles/util.ml index 40b8022919b..2895b2891db 100644 --- a/src/lib/pickles/util.ml +++ b/src/lib/pickles/util.ml @@ -25,16 +25,12 @@ let rec absorb : ~f:(Fn.compose (List.iter ~f:absorb_field) g1_to_field_elements) t | Type.With_degree_bound -> - let Pickles_types.Plonk_types.Poly_comm.With_degree_bound. - { unshifted; shifted } = - t - in + let Pickles_types.Plonk_types.Poly_comm.With_degree_bound.{ elems } = t in let absorb x = absorb ~absorb_field ~absorb_scalar ~g1_to_field_elements ~mask_g1_opt Type.PC (mask_g1_opt x) in - Array.iter unshifted ~f:absorb ; - absorb shifted + Array.iter elems ~f:absorb | ty1 :: ty2 -> let absorb t = absorb t ~absorb_field ~absorb_scalar ~g1_to_field_elements ~mask_g1_opt diff --git a/src/lib/pickles/verification_key.ml b/src/lib/pickles/verification_key.ml index af1cab84c57..0c0a122ba73 100644 --- a/src/lib/pickles/verification_key.ml +++ b/src/lib/pickles/verification_key.ml @@ -93,8 +93,7 @@ module Verifier_index_json = struct | Finite of ('f * 'f) [@@deriving yojson] - type 'g polycomm = 'g Kimchi_types.poly_comm = - { unshifted : 'g array; shifted : 'g option } + type 'g polycomm = 'g Kimchi_types.poly_comm = { elems : 'g array } [@@deriving yojson] let to_yojson fp fq = @@ -175,9 +174,7 @@ module Stable = struct ; srs ; evals = (let g (x, y) = - { Kimchi_types.unshifted = [| Kimchi_types.Finite (x, y) |] - ; shifted = None - } + { Kimchi_types.elems = [| Kimchi_types.Finite (x, y) |] } in { sigma_comm = Array.map ~f:g (Vector.to_array c.sigma_comm) ; coefficients_comm = diff --git a/src/lib/pickles/wrap_main_inputs.ml b/src/lib/pickles/wrap_main_inputs.ml index e3831fd6d64..f14f9818171 100644 --- a/src/lib/pickles/wrap_main_inputs.ml +++ b/src/lib/pickles/wrap_main_inputs.ml @@ -93,7 +93,7 @@ let%test_unit "sponge" = (Kimchi_bindings.Protocol.SRS.Fp.lagrange_commitment (Backend.Tick.Keypair.load_urs ()) domain_size i ) - .unshifted.(0) + .elems.(0) |> Common.finite_exn ) ) let _domain = Import.Domain.Pow_2_roots_of_unity 7 diff --git a/src/lib/pickles/wrap_verifier.ml b/src/lib/pickles/wrap_verifier.ml index 2120c7ef7ce..c4d4af6f799 100644 --- a/src/lib/pickles/wrap_verifier.ml +++ b/src/lib/pickles/wrap_verifier.ml @@ -318,8 +318,7 @@ struct Vector.map domains ~f:(fun d -> let d = Int.pow 2 (Domain.log2_size d.h) in let chunks = - (Kimchi_bindings.Protocol.SRS.Fp.lagrange_commitment srs d i) - .unshifted + (Kimchi_bindings.Protocol.SRS.Fp.lagrange_commitment srs d i).elems in Array.map chunks ~f:(function | Finite g -> @@ -342,8 +341,7 @@ struct Vector.map domains ~f:(fun d -> let d = Int.pow 2 (Domain.log2_size d.h) in let chunks = - (Kimchi_bindings.Protocol.SRS.Fp.lagrange_commitment srs d i) - .unshifted + (Kimchi_bindings.Protocol.SRS.Fp.lagrange_commitment srs d i).elems in Array.map chunks ~f:(function | Finite g -> @@ -375,8 +373,7 @@ struct let base_and_correction (h : Domain.t) = let d = Int.pow 2 (Domain.log2_size h) in let chunks = - (Kimchi_bindings.Protocol.SRS.Fp.lagrange_commitment srs d i) - .unshifted + (Kimchi_bindings.Protocol.SRS.Fp.lagrange_commitment srs d i).elems in Array.map chunks ~f:(function | Finite g -> diff --git a/src/lib/pickles_types/pcs_batch.ml b/src/lib/pickles_types/pcs_batch.ml index e115635c46e..ff7650f400f 100644 --- a/src/lib/pickles_types/pcs_batch.ml +++ b/src/lib/pickles_types/pcs_batch.ml @@ -31,8 +31,8 @@ let combine_commitments _t ~scale ~add ~xi (type n) | init :: without_degree_bound -> let polys = Vector.to_list without_degree_bound - @ List.concat_map (Vector.to_list with_degree_bound) - ~f:(fun (unshifted, shifted) -> [ unshifted; shifted ]) + @ List.concat_map (Vector.to_list with_degree_bound) ~f:(fun elems -> + [ elems ] ) in List.fold_left polys ~init ~f:(fun acc p -> add p (scale acc xi)) diff --git a/src/lib/pickles_types/plonk_types.ml b/src/lib/pickles_types/plonk_types.ml index 8b20e4594c2..4a4ec7364d8 100644 --- a/src/lib/pickles_types/plonk_types.ml +++ b/src/lib/pickles_types/plonk_types.ml @@ -1289,10 +1289,7 @@ module Poly_comm = struct [%%versioned module Stable = struct module V1 = struct - type 'g_opt t = - { unshifted : 'g_opt Bounded_types.ArrayN16.Stable.V1.t - ; shifted : 'g_opt - } + type 'g_opt t = { elems : 'g_opt Bounded_types.ArrayN16.Stable.V1.t } [@@deriving sexp, compare, yojson, hlist, hash, equal] end end] diff --git a/src/lib/pickles_types/plonk_types.mli b/src/lib/pickles_types/plonk_types.mli index 46ae684cca5..27148e6ea1f 100644 --- a/src/lib/pickles_types/plonk_types.mli +++ b/src/lib/pickles_types/plonk_types.mli @@ -104,8 +104,7 @@ module Poly_comm : sig end module With_degree_bound : sig - type 'a t = - { unshifted : 'a Bounded_types.ArrayN16.Stable.V1.t; shifted : 'a } + type 'a t = { elems : 'a Bounded_types.ArrayN16.Stable.V1.t } end end From 0878f29a5f5e0e9e4ddba3749da0f17a2dc33308 Mon Sep 17 00:00:00 2001 From: Mikhail Volkhov Date: Fri, 8 Dec 2023 15:02:24 +0000 Subject: [PATCH 3/6] Removing shifts WIP --- .../common/dlog_plonk_based_keypair.ml | 4 -- .../kimchi_backend/common/plonk_dlog_proof.ml | 2 - .../crypto/kimchi_backend/common/poly_comm.ml | 26 ++---------- .../pasta/basic/kimchi_pasta_basic.ml | 8 +--- .../kimchi_bindings/stubs/kimchi_types.ml | 2 +- src/lib/pickles/common.ml | 2 +- src/lib/pickles/step_verifier.ml | 17 ++------ src/lib/pickles/type.mli | 4 -- src/lib/pickles/util.ml | 7 ---- src/lib/pickles/wrap_verifier.ml | 19 ++++----- src/lib/pickles_types/pcs_batch.ml | 39 ++++++------------ src/lib/pickles_types/pcs_batch.mli | 9 +---- src/lib/pickles_types/plonk_types.ml | 40 +------------------ src/lib/pickles_types/plonk_types.mli | 4 -- 14 files changed, 34 insertions(+), 149 deletions(-) diff --git a/src/lib/crypto/kimchi_backend/common/dlog_plonk_based_keypair.ml b/src/lib/crypto/kimchi_backend/common/dlog_plonk_based_keypair.ml index 84d79803e2c..e4623f1a7ea 100644 --- a/src/lib/crypto/kimchi_backend/common/dlog_plonk_based_keypair.ml +++ b/src/lib/crypto/kimchi_backend/common/dlog_plonk_based_keypair.ml @@ -207,8 +207,6 @@ module Make (Inputs : Inputs_intf) = struct match Inputs.Poly_comm.of_backend_without_degree_bound c with | `Without_degree_bound x -> x.(0) - | `With_degree_bound _ -> - assert false in { sigma_comm = Pickles_types.Vector.init Pickles_types.Plonk_types.Permuts.n @@ -232,8 +230,6 @@ module Make (Inputs : Inputs_intf) = struct match Inputs.Poly_comm.of_backend_without_degree_bound c with | `Without_degree_bound x -> x - | `With_degree_bound _ -> - assert false in let lookup f = let open Option.Let_syntax in diff --git a/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml b/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml index 1baa8c3e4a6..d3aa9f2fdcd 100644 --- a/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml +++ b/src/lib/crypto/kimchi_backend/common/plonk_dlog_proof.ml @@ -66,8 +66,6 @@ module type Inputs_intf = sig type t = Curve.Affine.Backend.t Kimchi_types.poly_comm end - val of_backend_with_degree_bound : Backend.t -> t - val of_backend_without_degree_bound : Backend.t -> t val to_backend : t -> Backend.t diff --git a/src/lib/crypto/kimchi_backend/common/poly_comm.ml b/src/lib/crypto/kimchi_backend/common/poly_comm.ml index fa6e23a6c93..579ad326cfc 100644 --- a/src/lib/crypto/kimchi_backend/common/poly_comm.ml +++ b/src/lib/crypto/kimchi_backend/common/poly_comm.ml @@ -26,18 +26,14 @@ module type Inputs_intf = sig module Backend : sig type t - val make : - Curve.Affine.Backend.t array -> Curve.Affine.Backend.t option -> t + val make : Curve.Affine.Backend.t array -> t val elems : t -> Curve.Affine.Backend.t array end end type 'a t = - [ `With_degree_bound of - ('a * 'a) Pickles_types.Or_infinity.t - Pickles_types.Plonk_types.Poly_comm.With_degree_bound.t - | `Without_degree_bound of + [ `Without_degree_bound of ('a * 'a) Pickles_types.Plonk_types.Poly_comm.Without_degree_bound.t ] module Make (Inputs : Inputs_intf) = struct @@ -68,13 +64,6 @@ module Make (Inputs : Inputs_intf) = struct | Finite (x, y) -> Finite (x, y) - (* TODO @volhovm remove *) - let with_degree_bound_to_backend - (commitment : - (Base_field.t * Base_field.t) Pickles_types.Or_infinity.t - Pickles_types.Plonk_types.Poly_comm.With_degree_bound.t ) : Backend.t = - Backend.make (Array.map ~f:or_infinity_to_backend commitment.elems) - let without_degree_bound_to_backend (commitment : (Base_field.t * Base_field.t) @@ -82,20 +71,12 @@ module Make (Inputs : Inputs_intf) = struct = Backend.make (Array.map ~f:(fun x -> Kimchi_types.Finite (fst x, snd x)) commitment) - None let to_backend (t : t) : Backend.t = - match t with - | `With_degree_bound t -> - with_degree_bound_to_backend t - | `Without_degree_bound t -> - without_degree_bound_to_backend t + match t with `Without_degree_bound t -> without_degree_bound_to_backend t let of_backend' (t : Backend.t) = Backend.elems t - (* TODO @volhovm remove *) - let of_backend_with_degree_bound (t : Backend.t) : t = assert false - (* type 'a t = [ `With_degree_bound of @@ -106,6 +87,7 @@ module Make (Inputs : Inputs_intf) = struct ] *) + (* TODO @volhovm Is this even used? It's not part of of_backend' *) let of_backend_without_degree_bound (t : Backend.t) = let open Pickles_types.Plonk_types.Poly_comm in let elems = Backend.elems t in diff --git a/src/lib/crypto/kimchi_backend/pasta/basic/kimchi_pasta_basic.ml b/src/lib/crypto/kimchi_backend/pasta/basic/kimchi_pasta_basic.ml index 9cdf1940223..c37dda35183 100644 --- a/src/lib/crypto/kimchi_backend/pasta/basic/kimchi_pasta_basic.ml +++ b/src/lib/crypto/kimchi_backend/pasta/basic/kimchi_pasta_basic.ml @@ -123,9 +123,7 @@ module Fq_poly_comm = Kimchi_backend_common.Poly_comm.Make (struct let elems ({ elems; _ } : t) = elems - let make : - Curve.Affine.Backend.t array -> Curve.Affine.Backend.t option -> t = - fun elems : t -> { elems } + let make : Curve.Affine.Backend.t array -> t = fun elems : t -> { elems } end end) @@ -138,9 +136,7 @@ module Fp_poly_comm = Kimchi_backend_common.Poly_comm.Make (struct let elems ({ elems; _ } : t) = elems - let make : - Curve.Affine.Backend.t array -> Curve.Affine.Backend.t option -> t = - fun elems : t -> { elems } + let make : Curve.Affine.Backend.t array -> t = fun elems : t -> { elems } end end) diff --git a/src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml b/src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml index bea0be0b01e..6a04cd6b846 100644 --- a/src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml +++ b/src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml @@ -83,7 +83,7 @@ type nonrec 'caml_f proof_evaluations = ; foreign_field_mul_lookup_selector : 'caml_f array point_evaluations option } -type nonrec 'caml_g poly_comm = { elems : 'caml_g array } +type nonrec 'caml_g poly_comm = { elems : 'caml_g array } [@@boxed] type nonrec ('caml_g, 'caml_f) recursion_challenge = { chals : 'caml_f array; comm : 'caml_g poly_comm } diff --git a/src/lib/pickles/common.ml b/src/lib/pickles/common.ml index 9dc9be295c5..a9742399152 100644 --- a/src/lib/pickles/common.ml +++ b/src/lib/pickles/common.ml @@ -56,7 +56,7 @@ let hash_messages_for_next_step_proof ~app_state let dlog_pcs_batch (type nat proofs_verified total) ((without_degree_bound, _pi) : total Nat.t * (proofs_verified, nat, total) Nat.Adds.t ) = - Pcs_batch.create ~without_degree_bound ~with_degree_bound:[] + Pcs_batch.create ~without_degree_bound let when_profiling profiling default = match Option.map (Sys.getenv_opt "PICKLES_PROFILING") ~f:String.lowercase with diff --git a/src/lib/pickles/step_verifier.ml b/src/lib/pickles/step_verifier.ml index 34a1fcbc837..03979d5ceb8 100644 --- a/src/lib/pickles/step_verifier.ml +++ b/src/lib/pickles/step_verifier.ml @@ -220,8 +220,7 @@ struct let check_bulletproof ~pcs_batch ~(sponge : Sponge.t) ~xi ~(* Corresponds to y in figure 7 of WTS *) (* sum_i r^i sum_j xi^j f_j(beta_i) *) - (advice : _ Bulletproof.Advice.t) - ~polynomials:(without_degree_bound, with_degree_bound) + (advice : _ Bulletproof.Advice.t) ~polynomials:without_degree_bound ~opening: ({ lr; delta; z_1; z_2; challenge_polynomial_commitment } : (Inner_curve.t, Other_field.t Shifted_value.Type2.t) Bulletproof.t ) = @@ -242,10 +241,6 @@ struct with_label "combined_polynomial" (fun () -> Pcs_batch.combine_split_commitments pcs_batch ~reduce_without_degree_bound:Array.to_list - ~reduce_with_degree_bound:(fun { Plonk_types.Poly_comm - .With_degree_bound - .elems - } -> Array.to_list elems @ [] ) ~scale_and_add:(fun ~(acc : [ `Maybe_finite of Boolean.var * Inner_curve.t @@ -281,13 +276,7 @@ struct | `Maybe_finite x -> Some (`Maybe_finite x) ) (Vector.map without_degree_bound - ~f:(Array.map ~f:(fun x -> `Finite x)) ) - (Vector.map with_degree_bound - ~f: - (let open Plonk_types.Poly_comm.With_degree_bound in - fun { elems } -> - let f x = `Maybe_finite x in - { elems = Array.map ~f elems }) ) ) + ~f:(Array.map ~f:(fun x -> `Finite x)) ) ) |> function `Finite x -> x | `Maybe_finite _ -> assert false in let lr_prod, challenges = bullet_reduce sponge lr in @@ -594,7 +583,7 @@ struct (Wrap_hack.Padded_length.add num_commitments_without_degree_bound ) ) ~sponge:sponge_before_evaluations ~xi ~advice ~opening - ~polynomials:(without_degree_bound, []) ) + ~polynomials:without_degree_bound ) in let joint_combiner = None in assert_eq_deferred_values diff --git a/src/lib/pickles/type.mli b/src/lib/pickles/type.mli index fa97dc8fcdc..648704e47b0 100644 --- a/src/lib/pickles/type.mli +++ b/src/lib/pickles/type.mli @@ -6,10 +6,6 @@ type (_, _) t = : ( 'g1 Pickles_types.Plonk_types.Poly_comm.Without_degree_bound.t , < g1 : 'g1 ; .. > ) t (** Polynomials *) - | With_degree_bound - : ( 'g1_opt Pickles_types.Plonk_types.Poly_comm.With_degree_bound.t - , < g1_opt : 'g1_opt ; .. > ) - t (** Polynomial *) | Field : ('field, < base_field : 'field ; .. >) t (** Field element *) | ( :: ) : ('a, 'e) t * ('b, 'e) t -> ('a * 'b, 'e) t (** Concatenate two elements of this type as a list *) diff --git a/src/lib/pickles/util.ml b/src/lib/pickles/util.ml index 2895b2891db..f59e27f5f92 100644 --- a/src/lib/pickles/util.ml +++ b/src/lib/pickles/util.ml @@ -24,13 +24,6 @@ let rec absorb : Array.iter ~f:(Fn.compose (List.iter ~f:absorb_field) g1_to_field_elements) t - | Type.With_degree_bound -> - let Pickles_types.Plonk_types.Poly_comm.With_degree_bound.{ elems } = t in - let absorb x = - absorb ~absorb_field ~absorb_scalar ~g1_to_field_elements ~mask_g1_opt - Type.PC (mask_g1_opt x) - in - Array.iter elems ~f:absorb | ty1 :: ty2 -> let absorb t = absorb t ~absorb_field ~absorb_scalar ~g1_to_field_elements ~mask_g1_opt diff --git a/src/lib/pickles/wrap_verifier.ml b/src/lib/pickles/wrap_verifier.ml index c4d4af6f799..ca55c114abc 100644 --- a/src/lib/pickles/wrap_verifier.ml +++ b/src/lib/pickles/wrap_verifier.ml @@ -468,7 +468,7 @@ struct type t = { point : Inner_curve.t; non_zero : Boolean.var } end - let combine batch ~xi without_bound with_bound = + let combine batch ~xi without_bound = let reduce_point p = let point = ref (Point.underlying p.(Array.length p - 1)) in for i = Array.length p - 2 downto 0 do @@ -478,7 +478,6 @@ struct in let { Curve_opt.non_zero; point } = Pcs_batch.combine_split_commitments batch - ~reduce_with_degree_bound:(fun _ -> assert false) ~reduce_without_degree_bound:(fun x -> [ x ]) ~scale_and_add:(fun ~(acc : Curve_opt.t) ~xi (p : (Point.t array, Boolean.var) Opt.t) -> @@ -533,7 +532,7 @@ struct { non_zero = Boolean.(true_ &&& true_) ; point = reduce_point p } ) - without_bound with_bound + without_bound in Boolean.Assert.is_true non_zero ; point @@ -545,8 +544,7 @@ struct ~(xi : Scalar_challenge.t) ~(advice : Other_field.Packed.t Shifted_value.Type1.t - Types.Step.Bulletproof.Advice.t ) - ~polynomials:(without_degree_bound, with_degree_bound) + Types.Step.Bulletproof.Advice.t ) ~polynomials:without_degree_bound ~openings_proof: ({ lr; delta; z_1; z_2; challenge_polynomial_commitment } : ( Inner_curve.t @@ -567,8 +565,8 @@ struct let open Inner_curve in let combined_polynomial (* Corresponds to xi in figure 7 of WTS *) = Split_commitments.combine pcs_batch ~xi without_degree_bound - with_degree_bound in + let scale_fast = scale_fast ~num_bits:Other_field.Packed.Constant.size_in_bits in @@ -1332,11 +1330,10 @@ struct (Max_proofs_verified.add num_commitments_without_degree_bound) ) ~sponge:sponge_before_evaluations ~xi ~advice ~openings_proof ~polynomials: - ( Vector.map without_degree_bound - ~f: - (Pickles_types.Opt.map - ~f:(Array.map ~f:(fun x -> `Finite x)) ) - , [] ) + (Vector.map without_degree_bound + ~f: + (Pickles_types.Opt.map + ~f:(Array.map ~f:(fun x -> `Finite x)) ) ) in assert_eq_plonk { alpha = plonk.alpha diff --git a/src/lib/pickles_types/pcs_batch.ml b/src/lib/pickles_types/pcs_batch.ml index ff7650f400f..88f0e0379a2 100644 --- a/src/lib/pickles_types/pcs_batch.ml +++ b/src/lib/pickles_types/pcs_batch.ml @@ -1,9 +1,7 @@ open Core_kernel -type ('a, 'n, 'm) t = - { without_degree_bound : 'n Nat.t; with_degree_bound : ('a, 'm) Vector.t } - -let map t ~f = { t with with_degree_bound = Vector.map t.with_degree_bound ~f } +(* @volhovm remove type params 'a and 'm *) +type ('a, 'n, 'm) t = { without_degree_bound : 'n Nat.t } let num_bits n = Int.floor_log2 n + 1 @@ -20,33 +18,23 @@ let pow ~one ~mul x n = in go one (k - 1) -let create ~without_degree_bound ~with_degree_bound = - { without_degree_bound; with_degree_bound } +let create ~without_degree_bound = { without_degree_bound } let combine_commitments _t ~scale ~add ~xi (type n) - (without_degree_bound : (_, n) Vector.t) with_degree_bound = + (without_degree_bound : (_, n) Vector.t) = match without_degree_bound with | [] -> failwith "combine_commitments: empty list" | init :: without_degree_bound -> - let polys = - Vector.to_list without_degree_bound - @ List.concat_map (Vector.to_list with_degree_bound) ~f:(fun elems -> - [ elems ] ) - in + let polys = Vector.to_list without_degree_bound in List.fold_left polys ~init ~f:(fun acc p -> add p (scale acc xi)) +(* TODO @volhovm should be removed/simplified? *) let combine_evaluations' (type a n m) - ({ without_degree_bound = _; with_degree_bound } : (a, n Nat.s, m) t) - ~shifted_pow ~mul ~add ~one:_ ~evaluation_point ~xi - (init :: evals0 : (_, n Nat.s) Vector.t) (evals1 : (_, m) Vector.t) = - let evals = - Vector.to_list evals0 - @ List.concat - (Vector.to_list - (Vector.map2 with_degree_bound evals1 ~f:(fun deg fx -> - [ fx; mul (shifted_pow deg evaluation_point) fx ] ) ) ) - in + ({ without_degree_bound = _ } : (a, n Nat.s, m) t) ~shifted_pow ~mul ~add + ~one:_ ~evaluation_point ~xi (init :: evals0 : (_, n Nat.s) Vector.t) + (evals1 : (_, m) Vector.t) = + let evals = Vector.to_list evals0 in List.fold_left evals ~init ~f:(fun acc fx -> add fx (mul acc xi)) let[@warning "-45"] combine_evaluations' (type n) (t : (_, n, _) t) ~shifted_pow @@ -66,15 +54,12 @@ let combine_evaluations (type f) t ~crs_max_degree ~(mul : f -> f -> f) ~add ~mul ~add ~one ~evaluation_point ~xi let combine_split_commitments _t ~scale_and_add ~init:i ~xi - ~reduce_without_degree_bound ~reduce_with_degree_bound (type n) - (without_degree_bound : (_, n) Vector.t) with_degree_bound = + ~reduce_without_degree_bound (type n) + (without_degree_bound : (_, n) Vector.t) = let flat = List.concat_map (Vector.to_list without_degree_bound) ~f:reduce_without_degree_bound - @ List.concat_map - (Vector.to_list with_degree_bound) - ~f:reduce_with_degree_bound in let rec go = function | [] -> diff --git a/src/lib/pickles_types/pcs_batch.mli b/src/lib/pickles_types/pcs_batch.mli index dee36ea90b4..d6b7db869e9 100644 --- a/src/lib/pickles_types/pcs_batch.mli +++ b/src/lib/pickles_types/pcs_batch.mli @@ -2,16 +2,11 @@ type ('a, 'n, 'm) t -val map : ('a, 'n, 'm) t -> f:('a -> 'b) -> ('b, 'n, 'm) t - val pow : one:'f -> mul:('f -> 'f -> 'f) -> 'f -> int -> 'f val num_bits : int -> int -val create : - without_degree_bound:'n Nat.t - -> with_degree_bound:('a, 'm) Vector.t - -> ('a, 'n, 'm) t +val create : without_degree_bound:'n Nat.t -> ('a, 'n, 'm) t val combine_commitments : (int, 'n, 'm) t @@ -52,9 +47,7 @@ val combine_split_commitments : -> init:('g -> 'g_acc option) -> xi:'f -> reduce_without_degree_bound:('without_degree_bound -> 'g list) - -> reduce_with_degree_bound:('with_degree_bound -> 'g list) -> ('without_degree_bound, 'n) Vector.t - -> ('with_degree_bound, 'm) Vector.t -> 'g_acc val combine_split_evaluations : diff --git a/src/lib/pickles_types/plonk_types.ml b/src/lib/pickles_types/plonk_types.ml index 4a4ec7364d8..048570e5c37 100644 --- a/src/lib/pickles_types/plonk_types.ml +++ b/src/lib/pickles_types/plonk_types.ml @@ -1285,37 +1285,6 @@ module Openings = struct end module Poly_comm = struct - module With_degree_bound = struct - [%%versioned - module Stable = struct - module V1 = struct - type 'g_opt t = { elems : 'g_opt Bounded_types.ArrayN16.Stable.V1.t } - [@@deriving sexp, compare, yojson, hlist, hash, equal] - end - end] - - let padded_array_typ0 = padded_array_typ - - let typ (type f g g_var bool_var) - (g : (g_var, g, f) Snarky_backendless.Typ.t) ~length - ~dummy_group_element - ~(bool : (bool_var, bool, f) Snarky_backendless.Typ.t) : - ((bool_var * g_var) t, g Or_infinity.t t, f) Snarky_backendless.Typ.t = - let open Snarky_backendless.Typ in - let g_inf = - transport (tuple2 bool g) - ~there:(function - | Or_infinity.Infinity -> - (false, dummy_group_element) - | Finite x -> - (true, x) ) - ~back:(fun (b, x) -> if b then Infinity else Finite x) - in - let arr = padded_array_typ0 ~length ~dummy:Or_infinity.Infinity g_inf in - of_hlistable [ arr; g_inf ] ~var_to_hlist:to_hlist ~var_of_hlist:of_hlist - ~value_to_hlist:to_hlist ~value_of_hlist:of_hlist - end - module Without_degree_bound = struct [%%versioned module Stable = struct @@ -1430,17 +1399,12 @@ module Messages = struct (module Impl : Snarky_backendless.Snark_intf.Run with type field = f) g ({ runtime_tables; uses_lookups; lookups_per_row_4; _ } : Opt.Flag.t Features.Full.t ) ~dummy - ~(commitment_lengths : (((int, n) Vector.t as 'v), int, int) Poly.t) ~bool - = + ~(commitment_lengths : (((int, n) Vector.t as 'v), int, int) Poly.t) + ~_bool = let open Snarky_backendless.Typ in let { Poly.w = w_lens; z; t } = commitment_lengths in let array ~length elt = padded_array_typ ~dummy ~length elt in let wo n = array ~length:(Vector.reduce_exn n ~f:Int.max) g in - let _w n = - With_degree_bound.typ g - ~length:(Vector.reduce_exn n ~f:Int.max) - ~dummy_group_element:dummy ~bool - in let lookup = Lookup.opt_typ Impl.Boolean.typ ~uses_lookup:uses_lookups ~lookups_per_row_4 ~runtime_tables ~dummy:[| dummy |] diff --git a/src/lib/pickles_types/plonk_types.mli b/src/lib/pickles_types/plonk_types.mli index 27148e6ea1f..9d32a6d8163 100644 --- a/src/lib/pickles_types/plonk_types.mli +++ b/src/lib/pickles_types/plonk_types.mli @@ -102,10 +102,6 @@ module Poly_comm : sig module Without_degree_bound : sig type 'a t = 'a Bounded_types.ArrayN16.Stable.V1.t end - - module With_degree_bound : sig - type 'a t = { elems : 'a Bounded_types.ArrayN16.Stable.V1.t } - end end (** The number of wires in the proving system *) From a1798d094105d6100cd66b13afddfe6926ae8ffd Mon Sep 17 00:00:00 2001 From: Mikhail Volkhov Date: Sat, 27 Jan 2024 18:26:42 +0000 Subject: [PATCH 4/6] WIP Remove shifting from kimchi_bindings/wasm --- .../kimchi_bindings/wasm/src/plonk_proof.rs | 6 +-- .../wasm/src/plonk_verifier_index.rs | 3 +- .../kimchi_bindings/wasm/src/poly_comm.rs | 39 ++++++++----------- .../crypto/kimchi_bindings/wasm/src/srs.rs | 4 +- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/src/lib/crypto/kimchi_bindings/wasm/src/plonk_proof.rs b/src/lib/crypto/kimchi_bindings/wasm/src/plonk_proof.rs index d035816288d..6ce6724b9ad 100644 --- a/src/lib/crypto/kimchi_bindings/wasm/src/plonk_proof.rs +++ b/src/lib/crypto/kimchi_bindings/wasm/src/plonk_proof.rs @@ -685,8 +685,7 @@ macro_rules! impl_proof { .map(|a| a.clone().into()) .collect(); let comm = PolyComm::<$G> { - unshifted: vec![sg], - shifted: None, + elems: vec![sg], }; RecursionChallenge { chals, comm } }) @@ -785,8 +784,7 @@ macro_rules! impl_proof { fn comm() -> PolyComm<$G> { let g = $G::prime_subgroup_generator(); PolyComm { - shifted: Some(g), - unshifted: vec![g, g, g], + elems: vec![g, g, g], } } diff --git a/src/lib/crypto/kimchi_bindings/wasm/src/plonk_verifier_index.rs b/src/lib/crypto/kimchi_bindings/wasm/src/plonk_verifier_index.rs index 21d663ba7f3..fd4b5050efa 100644 --- a/src/lib/crypto/kimchi_bindings/wasm/src/plonk_verifier_index.rs +++ b/src/lib/crypto/kimchi_bindings/wasm/src/plonk_verifier_index.rs @@ -956,8 +956,7 @@ macro_rules! impl_verification_key { fn comm() -> $WasmPolyComm { let g: $WasmG = $G::prime_subgroup_generator().into(); $WasmPolyComm { - shifted: None, - unshifted: vec![g].into(), + elems: vec![g].into(), } } fn vec_comm(num: usize) -> WasmVector<$WasmPolyComm> { diff --git a/src/lib/crypto/kimchi_bindings/wasm/src/poly_comm.rs b/src/lib/crypto/kimchi_bindings/wasm/src/poly_comm.rs index 3338c0f23f3..94f8daef6fe 100644 --- a/src/lib/crypto/kimchi_bindings/wasm/src/poly_comm.rs +++ b/src/lib/crypto/kimchi_bindings/wasm/src/poly_comm.rs @@ -19,8 +19,7 @@ macro_rules! impl_poly_comm { #[derive(Clone)] pub struct [] { #[wasm_bindgen(skip)] - pub unshifted: WasmVector<$WasmG>, - pub shifted: Option<$WasmG>, + pub elems: WasmVector<$WasmG>, } type WasmPolyComm = []; @@ -28,50 +27,47 @@ macro_rules! impl_poly_comm { #[wasm_bindgen] impl [] { #[wasm_bindgen(constructor)] - pub fn new(unshifted: WasmVector<$WasmG>, shifted: Option<$WasmG>) -> Self { - WasmPolyComm { unshifted, shifted } + pub fn new(elems: WasmVector<$WasmG>) -> Self { + WasmPolyComm { elems } } #[wasm_bindgen(getter)] - pub fn unshifted(&self) -> WasmVector<$WasmG> { - self.unshifted.clone() + pub fn elems(&self) -> WasmVector<$WasmG> { + self.elems.clone() } #[wasm_bindgen(setter)] - pub fn set_unshifted(&mut self, x: WasmVector<$WasmG>) { - self.unshifted = x + pub fn set_elems(&mut self, x: WasmVector<$WasmG>) { + self.elems = x } } impl From> for WasmPolyComm { fn from(x: PolyComm<$G>) -> Self { - let PolyComm {unshifted, shifted} = x; - let unshifted: Vec<$WasmG> = - unshifted.into_iter().map(|x| x.into()).collect(); + let PolyComm {elems} = x; + let elems: Vec<$WasmG> = + elems.into_iter().map(|x| x.into()).collect(); WasmPolyComm { - unshifted: unshifted.into(), - shifted: shifted.map(|x| x.into()), + elems: elems.into(), } } } impl From<&PolyComm<$G>> for WasmPolyComm { fn from(x: &PolyComm<$G>) -> Self { - let unshifted: Vec<$WasmG> = - x.unshifted.iter().map(|x| x.into()).collect(); + let elems: Vec<$WasmG> = + x.elems.iter().map(|x| x.into()).collect(); WasmPolyComm { - unshifted: unshifted.into(), - shifted: x.shifted.map(|x| x.into()), + elems: elems.into(), } } } impl From for PolyComm<$G> { fn from(x: WasmPolyComm) -> Self { - let WasmPolyComm {unshifted, shifted} = x; + let WasmPolyComm {elems} = x; PolyComm { - unshifted: (*unshifted).iter().map(|x| { (*x).into() }).collect(), - shifted: shifted.map(|x| x.into()), + elems: (*elems).iter().map(|x| { (*x).into() }).collect(), } } } @@ -79,8 +75,7 @@ macro_rules! impl_poly_comm { impl From<&WasmPolyComm> for PolyComm<$G> { fn from(x: &WasmPolyComm) -> Self { PolyComm { - unshifted: x.unshifted.iter().map(|x| { (*x).into() }).collect(), - shifted: x.shifted.map(|x| x.into()), + elems: x.elems.iter().map(|x| { (*x).into() }).collect(), } } } diff --git a/src/lib/crypto/kimchi_bindings/wasm/src/srs.rs b/src/lib/crypto/kimchi_bindings/wasm/src/srs.rs index 4e7699bc765..2e8bf8be9ac 100644 --- a/src/lib/crypto/kimchi_bindings/wasm/src/srs.rs +++ b/src/lib/crypto/kimchi_bindings/wasm/src/srs.rs @@ -159,7 +159,7 @@ macro_rules! impl_srs { let evals = evals.into_iter().map(Into::into).collect(); let p = Evaluations::<$F>::from_vec_and_domain(evals, x_domain).interpolate(); - Ok(srs.commit_non_hiding(&p, 1, None).into()) + Ok(srs.commit_non_hiding(&p, 1).into()) } #[wasm_bindgen] @@ -171,7 +171,7 @@ macro_rules! impl_srs { let chals: Vec<$F> = chals.into_iter().map(Into::into).collect(); let coeffs = b_poly_coefficients(&chals); let p = DensePolynomial::<$F>::from_coefficients_vec(coeffs); - srs.commit_non_hiding(&p, 1, None) + srs.commit_non_hiding(&p, 1) }); Ok(result.into()) } From dc2762a6a45bedc4e6b63cfb6d166c530cdb4c4e Mon Sep 17 00:00:00 2001 From: Mikhail Volkhov Date: Sat, 27 Jan 2024 21:05:26 +0000 Subject: [PATCH 5/6] Remove shifting from pcs_batch and plonk_types --- src/lib/pickles/wrap_main.ml | 3 +-- src/lib/pickles/wrap_proof.ml | 2 +- src/lib/pickles_types/pcs_batch.ml | 22 ++++++++-------------- src/lib/pickles_types/pcs_batch.mli | 15 ++++----------- src/lib/pickles_types/plonk_types.ml | 3 +-- src/lib/pickles_types/plonk_types.mli | 1 - 6 files changed, 15 insertions(+), 31 deletions(-) diff --git a/src/lib/pickles/wrap_main.ml b/src/lib/pickles/wrap_main.ml index 967a4eafaf1..f73c59d3f7b 100644 --- a/src/lib/pickles/wrap_main.ml +++ b/src/lib/pickles/wrap_main.ml @@ -390,8 +390,7 @@ let wrap_main exists (Plonk_types.Messages.typ (module Impl) - Inner_curve.typ ~bool:Boolean.typ feature_flags - ~dummy:Inner_curve.Params.one + Inner_curve.typ feature_flags ~dummy:Inner_curve.Params.one ~commitment_lengths: (Commitment_lengths.default ~num_chunks) ) ~request:(fun () -> Req.Messages) ) diff --git a/src/lib/pickles/wrap_proof.ml b/src/lib/pickles/wrap_proof.ml index 890b46fb693..efa0fe1ef95 100644 --- a/src/lib/pickles/wrap_proof.ml +++ b/src/lib/pickles/wrap_proof.ml @@ -36,7 +36,7 @@ let typ : (Checked.t, Constant.t) Typ.t = ~value_to_hlist:Constant.to_hlist ~value_of_hlist:Constant.of_hlist [ Plonk_types.Messages.typ (module Impl) - Inner_curve.typ Plonk_types.Features.Full.none ~bool:Boolean.typ + Inner_curve.typ Plonk_types.Features.Full.none ~dummy:Inner_curve.Params.one ~commitment_lengths:(Commitment_lengths.default ~num_chunks:1) ; Types.Step.Bulletproof.typ ~length:(Nat.to_int Tock.Rounds.n) diff --git a/src/lib/pickles_types/pcs_batch.ml b/src/lib/pickles_types/pcs_batch.ml index 88f0e0379a2..1843e4c6766 100644 --- a/src/lib/pickles_types/pcs_batch.ml +++ b/src/lib/pickles_types/pcs_batch.ml @@ -29,29 +29,23 @@ let combine_commitments _t ~scale ~add ~xi (type n) let polys = Vector.to_list without_degree_bound in List.fold_left polys ~init ~f:(fun acc p -> add p (scale acc xi)) -(* TODO @volhovm should be removed/simplified? *) let combine_evaluations' (type a n m) - ({ without_degree_bound = _ } : (a, n Nat.s, m) t) ~shifted_pow ~mul ~add - ~one:_ ~evaluation_point ~xi (init :: evals0 : (_, n Nat.s) Vector.t) - (evals1 : (_, m) Vector.t) = + ({ without_degree_bound = _ } : (a, n Nat.s, m) t) ~(mul : 'f -> 'f -> 'f) + ~add ~one:_ ~xi (init :: evals0 : ('f, n Nat.s) Vector.t) = let evals = Vector.to_list evals0 in List.fold_left evals ~init ~f:(fun acc fx -> add fx (mul acc xi)) -let[@warning "-45"] combine_evaluations' (type n) (t : (_, n, _) t) ~shifted_pow - ~mul ~add ~one ~evaluation_point ~xi (evals0 : (_, n) Vector.t) evals1 = +let[@warning "-45"] combine_evaluations' (type n) (t : (_, n, _) t) ~mul ~add + ~one ~(xi : 'f) (evals0 : ('f, n) Vector.t) = match evals0 with | Vector.[] -> failwith "Empty evals0" | _ :: _ -> - combine_evaluations' t ~shifted_pow ~mul ~add ~one ~evaluation_point ~xi - evals0 evals1 + combine_evaluations' t ~mul ~add ~one ~xi evals0 -let combine_evaluations (type f) t ~crs_max_degree ~(mul : f -> f -> f) ~add - ~one ~evaluation_point ~xi evals0 evals1 = - let pow = pow ~one ~mul in - combine_evaluations' t evals0 evals1 - ~shifted_pow:(fun deg x -> pow x (crs_max_degree - deg)) - ~mul ~add ~one ~evaluation_point ~xi +(* TODO @volhovm should be removed/simplified? *) +let combine_evaluations (type f) t ~(mul : f -> f -> f) ~add ~one ~xi evals0 = + combine_evaluations' t evals0 ~mul ~add ~one ~xi let combine_split_commitments _t ~scale_and_add ~init:i ~xi ~reduce_without_degree_bound (type n) diff --git a/src/lib/pickles_types/pcs_batch.mli b/src/lib/pickles_types/pcs_batch.mli index d6b7db869e9..5c5beca0642 100644 --- a/src/lib/pickles_types/pcs_batch.mli +++ b/src/lib/pickles_types/pcs_batch.mli @@ -14,31 +14,24 @@ val combine_commitments : -> add:('g -> 'g -> 'g) -> xi:'f -> ('g, 'n) Vector.t - -> ('g * 'g, 'm) Vector.t -> 'g -val combine_evaluations : - (int, 'n, 'm) t - -> crs_max_degree:int +val combine_evaluations' : + ('a, 'n, 'm) t -> mul:('f -> 'f -> 'f) -> add:('f -> 'f -> 'f) -> one:'f - -> evaluation_point:'f -> xi:'f -> ('f, 'n) Vector.t - -> ('f, 'm) Vector.t -> 'f -val combine_evaluations' : - ('a, 'n, 'm) t - -> shifted_pow:('a -> 'f -> 'f) +val combine_evaluations : + (int, 'n, 'm) t -> mul:('f -> 'f -> 'f) -> add:('f -> 'f -> 'f) -> one:'f - -> evaluation_point:'f -> xi:'f -> ('f, 'n) Vector.t - -> ('f, 'm) Vector.t -> 'f val combine_split_commitments : diff --git a/src/lib/pickles_types/plonk_types.ml b/src/lib/pickles_types/plonk_types.ml index 048570e5c37..e45a29da872 100644 --- a/src/lib/pickles_types/plonk_types.ml +++ b/src/lib/pickles_types/plonk_types.ml @@ -1399,8 +1399,7 @@ module Messages = struct (module Impl : Snarky_backendless.Snark_intf.Run with type field = f) g ({ runtime_tables; uses_lookups; lookups_per_row_4; _ } : Opt.Flag.t Features.Full.t ) ~dummy - ~(commitment_lengths : (((int, n) Vector.t as 'v), int, int) Poly.t) - ~_bool = + ~(commitment_lengths : (((int, n) Vector.t as 'v), int, int) Poly.t) = let open Snarky_backendless.Typ in let { Poly.w = w_lens; z; t } = commitment_lengths in let array ~length elt = padded_array_typ ~dummy ~length elt in diff --git a/src/lib/pickles_types/plonk_types.mli b/src/lib/pickles_types/plonk_types.mli index 9d32a6d8163..95567fd8376 100644 --- a/src/lib/pickles_types/plonk_types.mli +++ b/src/lib/pickles_types/plonk_types.mli @@ -200,7 +200,6 @@ module Messages : sig -> Opt.Flag.t Features.Full.t -> dummy:'b -> commitment_lengths:((int, 'n) Vector.vec, int, int) Poly.t - -> bool:('c, bool, 'f) Snarky_backendless.Typ.t -> ( ( 'a , 'f Snarky_backendless.Cvar.t Snarky_backendless.Boolean.t ) In_circuit.t From 636a3c89e6afe3b554412540820968066933877b Mon Sep 17 00:00:00 2001 From: Mikhail Volkhov Date: Sat, 27 Jan 2024 21:17:43 +0000 Subject: [PATCH 6/6] Remove shifts from bindings js test --- src/lib/crypto/kimchi_bindings/js/test/bindings_js_test.ml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lib/crypto/kimchi_bindings/js/test/bindings_js_test.ml b/src/lib/crypto/kimchi_bindings/js/test/bindings_js_test.ml index 5a7148337a1..46072bb4cea 100644 --- a/src/lib/crypto/kimchi_bindings/js/test/bindings_js_test.ml +++ b/src/lib/crypto/kimchi_bindings/js/test/bindings_js_test.ml @@ -600,8 +600,7 @@ let _ = end ) let eq_poly_comm ~field_equal (x : _ poly_comm) (y : _ poly_comm) = - Array.for_all2 (eq_affine ~field_equal) x.unshifted y.unshifted - && Option.equal (eq_affine ~field_equal) x.shifted y.shifted + Array.for_all2 (eq_affine ~field_equal) x.elems y.elems module Backend = Kimchi_backend.Pasta.Pallas_based_plonk @@ -700,7 +699,7 @@ let _ = let inputs2 = Array.init 64 Pasta_fp.of_int in let affines = Array.init 16 (fun i -> - try lcomm1.unshifted.(i) + try lcomm1.elems.(i) with _ -> Pasta_vesta.random () |> Pasta_vesta.to_affine ) in let res = batch_accumulator_check second affines inputs2 in @@ -732,7 +731,7 @@ let _ = let inputs2 = Array.init 64 Pasta_fq.of_int in let affines = Array.init 16 (fun i -> - try lcomm1.unshifted.(i) + try lcomm1.elems.(i) with _ -> Pasta_pallas.random () |> Pasta_pallas.to_affine ) in let res = batch_accumulator_check second affines inputs2 in