|
| 1 | +//! Lambdaworks does not have a zkey reader by default, but we can add a converter from Arkworks perhaps. |
| 2 | +//! |
| 3 | +//! |
| 4 | +//! ## ArkWorks |
| 5 | +//! |
| 6 | +//! ```rs |
| 7 | +//! pub struct ProvingKey<E: Pairing> { |
| 8 | +//! /// The underlying verification key. |
| 9 | +//! pub vk: VerifyingKey<E>, |
| 10 | +//! /// The element `beta * G` in `E::G1`. |
| 11 | +//! pub beta_g1: E::G1Affine, |
| 12 | +//! /// The element `delta * G` in `E::G1`. |
| 13 | +//! pub delta_g1: E::G1Affine, |
| 14 | +//! /// The elements `a_i * G` in `E::G1`. |
| 15 | +//! pub a_query: Vec<E::G1Affine>, |
| 16 | +//! /// The elements `b_i * G` in `E::G1`. |
| 17 | +//! pub b_g1_query: Vec<E::G1Affine>, |
| 18 | +//! /// The elements `b_i * H` in `E::G2`. |
| 19 | +//! pub b_g2_query: Vec<E::G2Affine>, |
| 20 | +//! /// The elements `h_i * G` in `E::G1`. |
| 21 | +//! pub h_query: Vec<E::G1Affine>, |
| 22 | +//! /// The elements `l_i * G` in `E::G1`. |
| 23 | +//! pub l_query: Vec<E::G1Affine>, |
| 24 | +//!} |
| 25 | +//! ``` |
| 26 | +//! |
| 27 | +//! ## LambdaWorks |
| 28 | +//! |
| 29 | +//! ```rs |
| 30 | +//! pub struct ProvingKey { |
| 31 | +//! pub alpha_g1: G1Point, |
| 32 | +//! pub beta_g1: G1Point, |
| 33 | +//! pub beta_g2: G2Point, |
| 34 | +//! pub delta_g1: G1Point, |
| 35 | +//! pub delta_g2: G2Point, |
| 36 | +//! // [A_0(τ)]_1, [A_1(τ)]_1, ..., [A_n(τ)]_1 |
| 37 | +//! pub l_tau_g1: Vec<G1Point>, |
| 38 | +//! // [B_0(τ)]_1, [B_1(τ)]_1, ..., [B_n(τ)]_1 |
| 39 | +//! pub r_tau_g1: Vec<G1Point>, |
| 40 | +//! // [B_0(τ)]_2, [B_1(τ)]_2, ..., [B_n(τ)]_2 |
| 41 | +//! pub r_tau_g2: Vec<G2Point>, |
| 42 | +//! // [K_{k+1}(τ)]_1, [K_{k+2}(τ)]_1, ..., [K_n(τ)]_1 |
| 43 | +//! // where K_i(τ) = ƍ^{-1} * (β*l(τ) + α*r(τ) + o(τ)) |
| 44 | +//! // and "k" is the number of public inputs |
| 45 | +//! pub prover_k_tau_g1: Vec<G1Point>, |
| 46 | +//! // [delta^{-1} * t(τ) * tau^0]_1, [delta^{-1} * t(τ) * τ^1]_1, ..., [delta^{-1} * t(τ) * τ^m]_1 |
| 47 | +//! pub z_powers_of_tau_g1: Vec<G1Point>, |
| 48 | +//! } |
| 49 | +//! ``` |
| 50 | +
|
| 51 | +use ark_ec::pairing::Pairing; |
| 52 | +use ark_groth16::VerifyingKey; |
| 53 | +use lambdaworks_groth16::common::{G1Point, G2Point}; |
| 54 | + |
| 55 | +/// The prover key for for the Groth16 zkSNARK. |
| 56 | +pub struct ArkworksProvingKey<E: Pairing> { |
| 57 | + /// The underlying verification key. |
| 58 | + pub vk: VerifyingKey<E>, |
| 59 | + /// The element `beta * G` in `E::G1`. |
| 60 | + pub beta_g1: E::G1Affine, |
| 61 | + /// The element `delta * G` in `E::G1`. |
| 62 | + pub delta_g1: E::G1Affine, |
| 63 | + /// The elements `a_i * G` in `E::G1`. |
| 64 | + pub a_query: Vec<E::G1Affine>, |
| 65 | + /// The elements `b_i * G` in `E::G1`. |
| 66 | + pub b_g1_query: Vec<E::G1Affine>, |
| 67 | + /// The elements `b_i * H` in `E::G2`. |
| 68 | + pub b_g2_query: Vec<E::G2Affine>, |
| 69 | + /// The elements `h_i * G` in `E::G1`. |
| 70 | + pub h_query: Vec<E::G1Affine>, |
| 71 | + /// The elements `l_i * G` in `E::G1`. |
| 72 | + pub l_query: Vec<E::G1Affine>, |
| 73 | +} |
| 74 | + |
| 75 | +/// Converts an Arkworks `ProvingKey` to a Lambdaworks `ProvingKey`. |
| 76 | +/// |
| 77 | +/// Here is how the mapping is done Arkworks to Lambdaworks: |
| 78 | +/// - `pk.vb.alpha_g1` -> `alpha_g1` |
| 79 | +/// |
| 80 | +/// - `pk.b_g1_query` -> `beta_g1` |
| 81 | +/// - `pk.vk.beta_g2` -> `beta_g2` |
| 82 | +/// |
| 83 | +/// - `pk.delta_g1` -> `delta_g1` |
| 84 | +/// - `pk.vk.delta_g2` -> `delta_g2` |
| 85 | +/// |
| 86 | +/// - `pk.l_query` -> `l_tau_g1` |
| 87 | +/// - `pk.b_g1_query` -> `r_tau_g1` |
| 88 | +/// - `pk.b_g2_query` -> `r_tau_g2` |
| 89 | +/// |
| 90 | +/// - `pk.vk.gamma_abc_g1` -> `prover_k_tau_g1` |
| 91 | +/// |
| 92 | +pub fn convert_zkey<E: Pairing>( |
| 93 | + ark_pk: ark_groth16::ProvingKey<E>, |
| 94 | +) -> lambdaworks_groth16::ProvingKey { |
| 95 | + todo!() |
| 96 | +} |
0 commit comments