mirror of
https://github.com/saymrwulf/pasta_curves-source.git
synced 2026-09-05 20:10:32 +00:00
Hash domain and cs into transcript
This commit is contained in:
parent
437782e902
commit
4aa4b4463a
4 changed files with 134 additions and 3 deletions
30
src/plonk.rs
30
src/plonk.rs
|
|
@ -5,11 +5,14 @@
|
||||||
//! [halo]: https://eprint.iacr.org/2019/1021
|
//! [halo]: https://eprint.iacr.org/2019/1021
|
||||||
//! [plonk]: https://eprint.iacr.org/2019/953
|
//! [plonk]: https://eprint.iacr.org/2019/953
|
||||||
|
|
||||||
use crate::arithmetic::CurveAffine;
|
use blake2b_simd::Params as Blake2bParams;
|
||||||
|
|
||||||
|
use crate::arithmetic::{CurveAffine, FieldExt};
|
||||||
use crate::poly::{
|
use crate::poly::{
|
||||||
commitment::Params, Coeff, EvaluationDomain, ExtendedLagrangeCoeff, LagrangeCoeff, Polynomial,
|
commitment::Params, Coeff, EvaluationDomain, ExtendedLagrangeCoeff, LagrangeCoeff, Polynomial,
|
||||||
};
|
};
|
||||||
use crate::transcript::{ChallengeScalar, Transcript};
|
use crate::transcript::{ChallengeScalar, Transcript};
|
||||||
|
use std::convert::TryInto;
|
||||||
|
|
||||||
mod circuit;
|
mod circuit;
|
||||||
mod keygen;
|
mod keygen;
|
||||||
|
|
@ -77,13 +80,38 @@ impl<C: CurveAffine> VerifyingKey<C> {
|
||||||
|
|
||||||
/// Hashes a verification key into a transcript.
|
/// Hashes a verification key into a transcript.
|
||||||
pub fn hash<T: Transcript<C>>(&self, transcript: &mut T) -> io::Result<()> {
|
pub fn hash<T: Transcript<C>>(&self, transcript: &mut T) -> io::Result<()> {
|
||||||
|
let mut hasher = Blake2bParams::new()
|
||||||
|
.hash_length(64)
|
||||||
|
.personal(C::BLAKE2B_PERSONALIZATION)
|
||||||
|
.to_state();
|
||||||
|
|
||||||
|
// Hash in constants in the domain which influence the proof
|
||||||
|
let domain_hash = &self.domain.hash(&mut hasher);
|
||||||
|
transcript.common_scalar(C::Scalar::from_bytes_wide(domain_hash))?;
|
||||||
|
|
||||||
|
// Hash in `ConstraintSystem`
|
||||||
|
let cs_hash = &self.cs.hash(&mut hasher);
|
||||||
|
transcript.common_scalar(C::Scalar::from_bytes_wide(cs_hash))?;
|
||||||
|
|
||||||
|
// Hash in vector of fixed commitments
|
||||||
|
hasher.update(b"num_fixed_commitments");
|
||||||
|
hasher.update(&self.fixed_commitments.len().to_le_bytes());
|
||||||
for commitment in &self.fixed_commitments {
|
for commitment in &self.fixed_commitments {
|
||||||
transcript.common_point(*commitment)?;
|
transcript.common_point(*commitment)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hash in vector of permutation arguments
|
||||||
|
hasher.update(b"num_permutations");
|
||||||
|
hasher.update(&self.permutations.len().to_le_bytes());
|
||||||
for permutation in &self.permutations {
|
for permutation in &self.permutations {
|
||||||
permutation.hash(transcript)?;
|
permutation.hash(transcript)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hash in final Blake2bState
|
||||||
|
transcript.common_scalar(C::Scalar::from_bytes_wide(
|
||||||
|
hasher.finalize().as_bytes().try_into().unwrap(),
|
||||||
|
))?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
|
use blake2b_simd::State as Blake2bState;
|
||||||
use core::cmp::max;
|
use core::cmp::max;
|
||||||
use core::ops::{Add, Mul};
|
use core::ops::{Add, Mul};
|
||||||
use ff::Field;
|
use ff::Field;
|
||||||
use std::{
|
use std::{
|
||||||
convert::TryFrom,
|
convert::{TryFrom, TryInto},
|
||||||
ops::{Neg, Sub},
|
ops::{Neg, Sub},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -10,7 +11,7 @@ use super::{lookup, permutation, Error};
|
||||||
use crate::poly::Rotation;
|
use crate::poly::Rotation;
|
||||||
|
|
||||||
/// A column type
|
/// A column type
|
||||||
pub trait ColumnType: 'static + Sized {}
|
pub trait ColumnType: 'static + Sized + std::fmt::Debug {}
|
||||||
|
|
||||||
/// A column with an index and type
|
/// A column with an index and type
|
||||||
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
|
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
|
||||||
|
|
@ -27,6 +28,11 @@ impl<C: ColumnType> Column<C> {
|
||||||
pub(crate) fn column_type(&self) -> &C {
|
pub(crate) fn column_type(&self) -> &C {
|
||||||
&self.column_type
|
&self.column_type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn hash(&self, hasher: &mut Blake2bState) -> [u8; 64] {
|
||||||
|
hasher.update(&format!("{:?}", self).as_bytes());
|
||||||
|
hasher.finalize().as_bytes().try_into().unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An advice column
|
/// An advice column
|
||||||
|
|
@ -317,6 +323,12 @@ impl<F: Field> Expression<F> {
|
||||||
Expression::Scaled(poly, _) => poly.degree(),
|
Expression::Scaled(poly, _) => poly.degree(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Hash an Expression into a Blake2bState
|
||||||
|
pub fn hash(&self, hasher: &mut Blake2bState) -> [u8; 64] {
|
||||||
|
hasher.update(&format!("{:?}", self).as_bytes());
|
||||||
|
hasher.finalize().as_bytes().try_into().unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F: Field> Neg for Expression<F> {
|
impl<F: Field> Neg for Expression<F> {
|
||||||
|
|
@ -598,4 +610,70 @@ impl<F: Field> ConstraintSystem<F> {
|
||||||
self.num_instance_columns += 1;
|
self.num_instance_columns += 1;
|
||||||
tmp
|
tmp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Hashes the `ConstraintSystem` into a `u64`.
|
||||||
|
pub fn hash(&self, mut hasher: &mut Blake2bState) -> [u8; 64] {
|
||||||
|
hasher.update(b"num_fixed_columns");
|
||||||
|
hasher.update(&self.num_fixed_columns.to_le_bytes());
|
||||||
|
|
||||||
|
hasher.update(b"num_advice_columns");
|
||||||
|
hasher.update(&self.num_advice_columns.to_le_bytes());
|
||||||
|
|
||||||
|
hasher.update(b"num_aux_columns");
|
||||||
|
hasher.update(&self.num_aux_columns.to_le_bytes());
|
||||||
|
|
||||||
|
hasher.update(b"num_gates");
|
||||||
|
hasher.update(&self.gates.len().to_le_bytes());
|
||||||
|
for gate in self.gates.iter() {
|
||||||
|
hasher.update(gate.0.to_owned().as_bytes());
|
||||||
|
gate.1.hash(&mut hasher);
|
||||||
|
}
|
||||||
|
|
||||||
|
hasher.update(b"num_advice_queries");
|
||||||
|
hasher.update(&self.advice_queries.len().to_le_bytes());
|
||||||
|
for query in self.advice_queries.iter() {
|
||||||
|
query.0.hash(&mut hasher);
|
||||||
|
query.1.hash(&mut hasher);
|
||||||
|
}
|
||||||
|
|
||||||
|
hasher.update(b"num_aux_queries");
|
||||||
|
hasher.update(&self.aux_queries.len().to_le_bytes());
|
||||||
|
for query in self.aux_queries.iter() {
|
||||||
|
query.0.hash(&mut hasher);
|
||||||
|
query.1.hash(&mut hasher);
|
||||||
|
}
|
||||||
|
|
||||||
|
hasher.update(b"num_fixed_queries");
|
||||||
|
hasher.update(&self.fixed_queries.len().to_le_bytes());
|
||||||
|
for query in self.fixed_queries.iter() {
|
||||||
|
query.0.hash(&mut hasher);
|
||||||
|
query.1.hash(&mut hasher);
|
||||||
|
}
|
||||||
|
|
||||||
|
hasher.update(b"num_permutations");
|
||||||
|
hasher.update(&self.permutations.len().to_le_bytes());
|
||||||
|
for argument in self.permutations.iter() {
|
||||||
|
hasher.update(&argument.get_columns().len().to_le_bytes());
|
||||||
|
for column in argument.get_columns().iter() {
|
||||||
|
column.hash(&mut hasher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hasher.update(b"num_lookups");
|
||||||
|
hasher.update(&self.lookups.len().to_le_bytes());
|
||||||
|
for argument in self.lookups.iter() {
|
||||||
|
hasher.update(&argument.input_columns.len().to_le_bytes());
|
||||||
|
hasher.update(&argument.table_columns.len().to_le_bytes());
|
||||||
|
for (input, table) in argument
|
||||||
|
.input_columns
|
||||||
|
.iter()
|
||||||
|
.zip(argument.table_columns.iter())
|
||||||
|
{
|
||||||
|
input.hash(&mut hasher);
|
||||||
|
table.hash(&mut hasher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hasher.finalize().as_bytes().try_into().unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
use crate::arithmetic::parallelize;
|
use crate::arithmetic::parallelize;
|
||||||
|
|
||||||
|
use blake2b_simd::State as Blake2bState;
|
||||||
use ff::Field;
|
use ff::Field;
|
||||||
|
use std::convert::TryInto;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::ops::{Add, Deref, DerefMut, Index, IndexMut, Mul, RangeFrom, RangeFull, Sub};
|
use std::ops::{Add, Deref, DerefMut, Index, IndexMut, Mul, RangeFrom, RangeFull, Sub};
|
||||||
|
|
@ -228,4 +230,10 @@ impl Rotation {
|
||||||
pub fn next() -> Rotation {
|
pub fn next() -> Rotation {
|
||||||
Rotation(1)
|
Rotation(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Hash Rotation into a Blake2bState
|
||||||
|
pub fn hash(&self, hasher: &mut Blake2bState) -> [u8; 64] {
|
||||||
|
hasher.update(&format!("{:?}", self).as_bytes());
|
||||||
|
hasher.finalize().as_bytes().try_into().unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,9 @@ use super::{Coeff, ExtendedLagrangeCoeff, LagrangeCoeff, Polynomial, Rotation};
|
||||||
use ff::{Field, PrimeField};
|
use ff::{Field, PrimeField};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
use blake2b_simd::State as Blake2bState;
|
||||||
|
use std::convert::TryInto;
|
||||||
|
|
||||||
/// This structure contains precomputed constants and other details needed for
|
/// This structure contains precomputed constants and other details needed for
|
||||||
/// performing operations on an evaluation domain of size $2^k$ and an extended
|
/// performing operations on an evaluation domain of size $2^k$ and an extended
|
||||||
/// domain of size $2^{k} * j$ with $j \neq 0$.
|
/// domain of size $2^{k} * j$ with $j \neq 0$.
|
||||||
|
|
@ -376,4 +379,18 @@ impl<G: Group> EvaluationDomain<G> {
|
||||||
pub fn get_quotient_poly_degree(&self) -> usize {
|
pub fn get_quotient_poly_degree(&self) -> usize {
|
||||||
self.quotient_poly_degree as usize
|
self.quotient_poly_degree as usize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Hashes the constants in the domain which influence the proof into a u64
|
||||||
|
pub fn hash(&self, hasher: &mut Blake2bState) -> [u8; 64] {
|
||||||
|
hasher.update(b"k");
|
||||||
|
hasher.update(&self.k.to_le_bytes());
|
||||||
|
|
||||||
|
hasher.update(b"extended_k");
|
||||||
|
hasher.update(&self.extended_k.to_le_bytes());
|
||||||
|
|
||||||
|
hasher.update(b"omega");
|
||||||
|
hasher.update(&self.omega.to_bytes());
|
||||||
|
|
||||||
|
hasher.finalize().as_bytes().try_into().unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue