Skip to main content

dusk_plonk/proof_system/widget/permutation/
verifierkey.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4//
5// Copyright (c) DUSK NETWORK. All rights reserved.
6
7use crate::commitment_scheme::Commitment;
8
9#[cfg(feature = "rkyv-impl")]
10use bytecheck::CheckBytes;
11#[cfg(feature = "rkyv-impl")]
12use rkyv::{
13    Archive, Deserialize, Serialize,
14    ser::{ScratchSpace, Serializer},
15};
16
17#[derive(Debug, PartialEq, Eq, Copy, Clone)]
18#[cfg_attr(
19    feature = "rkyv-impl",
20    derive(Archive, Deserialize, Serialize),
21    archive(bound(serialize = "__S: Serializer + ScratchSpace")),
22    archive_attr(derive(CheckBytes))
23)]
24pub(crate) struct VerifierKey {
25    #[cfg_attr(feature = "rkyv-impl", omit_bounds)]
26    pub(crate) s_sigma_1: Commitment,
27    #[cfg_attr(feature = "rkyv-impl", omit_bounds)]
28    pub(crate) s_sigma_2: Commitment,
29    #[cfg_attr(feature = "rkyv-impl", omit_bounds)]
30    pub(crate) s_sigma_3: Commitment,
31    #[cfg_attr(feature = "rkyv-impl", omit_bounds)]
32    pub(crate) s_sigma_4: Commitment,
33}
34
35#[cfg(feature = "alloc")]
36mod alloc {
37    use super::*;
38    use crate::composer::permutation::constants::{K1, K2, K3};
39    use crate::proof_system::linearization_poly::ProofEvaluations;
40    #[rustfmt::skip]
41    use ::alloc::vec::Vec;
42    use dusk_bls12_381::{BlsScalar, G1Affine};
43
44    impl VerifierKey {
45        pub(crate) fn compute_linearization_commitment(
46            &self,
47            scalars: &mut Vec<BlsScalar>,
48            points: &mut Vec<G1Affine>,
49            evaluations: &ProofEvaluations,
50            z_challenge: &BlsScalar,
51            u_challenge: &BlsScalar,
52            (alpha, beta, gamma): (&BlsScalar, &BlsScalar, &BlsScalar),
53            l1_eval: &BlsScalar,
54            z_comm: G1Affine,
55        ) {
56            let alpha_sq = alpha.square();
57
58            // (a_eval + beta * z + gamma)
59            // * (b_eval + beta * z * k1 + gamma)
60            // * (c_eval + beta * k2 * z + gamma)
61            // * (d_eval + beta * k3 * z + gamma) * alpha
62            let x = {
63                let beta_z = beta * z_challenge;
64                let q_0 = evaluations.a_eval + beta_z + gamma;
65
66                let beta_k1_z = beta * K1 * z_challenge;
67                let q_1 = evaluations.b_eval + beta_k1_z + gamma;
68
69                let beta_k2_z = beta * K2 * z_challenge;
70                let q_2 = evaluations.c_eval + beta_k2_z + gamma;
71
72                let beta_k3_z = beta * K3 * z_challenge;
73                let q_3 = (evaluations.d_eval + beta_k3_z + gamma) * alpha;
74
75                q_0 * q_1 * q_2 * q_3
76            };
77
78            // l1(z) * alpha^2
79            let r = l1_eval * alpha_sq;
80
81            scalars.push(x + r + u_challenge);
82            points.push(z_comm);
83
84            // -1 * (a_eval + beta * sigma_1_eval + gamma)
85            // * (b_eval + beta * sigma_2_eval + gamma)
86            // * (c_eval + beta * sigma_3_eval + gamma)
87            // * alpha^2
88            let y = {
89                let beta_sigma_1 = beta * evaluations.s_sigma_1_eval;
90                let q_0 = evaluations.a_eval + beta_sigma_1 + gamma;
91
92                let beta_sigma_2 = beta * evaluations.s_sigma_2_eval;
93                let q_1 = evaluations.b_eval + beta_sigma_2 + gamma;
94
95                let beta_sigma_3 = beta * evaluations.s_sigma_3_eval;
96                let q_2 = evaluations.c_eval + beta_sigma_3 + gamma;
97
98                let q_3 = beta * evaluations.z_eval * alpha;
99
100                -(q_0 * q_1 * q_2 * q_3)
101            };
102            scalars.push(y);
103            points.push(self.s_sigma_4.0);
104        }
105    }
106}