2021-02-10 03:36:25 -08:00
|
|
|
|
use super::circuit::Expression;
|
|
|
|
|
use ff::Field;
|
2020-11-30 22:53:20 -08:00
|
|
|
|
|
2021-01-20 05:47:55 -08:00
|
|
|
|
pub(crate) mod prover;
|
|
|
|
|
pub(crate) mod verifier;
|
2020-11-30 22:53:20 -08:00
|
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
2021-02-10 03:36:25 -08:00
|
|
|
|
pub(crate) struct Argument<F: Field> {
|
|
|
|
|
pub input_columns: Vec<Expression<F>>,
|
|
|
|
|
pub table_columns: Vec<Expression<F>>,
|
2020-11-30 22:53:20 -08:00
|
|
|
|
}
|
|
|
|
|
|
2021-02-10 03:36:25 -08:00
|
|
|
|
impl<F: Field> Argument<F> {
|
|
|
|
|
pub fn new(input_columns: &[Expression<F>], table_columns: &[Expression<F>]) -> Self {
|
2020-11-30 22:53:20 -08:00
|
|
|
|
assert_eq!(input_columns.len(), table_columns.len());
|
|
|
|
|
Argument {
|
|
|
|
|
input_columns: input_columns.to_vec(),
|
|
|
|
|
table_columns: table_columns.to_vec(),
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-12-22 07:54:41 -08:00
|
|
|
|
|
|
|
|
|
pub(crate) fn required_degree(&self) -> usize {
|
|
|
|
|
assert_eq!(self.input_columns.len(), self.table_columns.len());
|
|
|
|
|
|
|
|
|
|
// degree 2:
|
|
|
|
|
// l_0(X) * (1 - z'(X)) = 0
|
|
|
|
|
//
|
2021-02-11 17:40:53 -08:00
|
|
|
|
// degree (1 + input_degree + table_degree):
|
2020-12-22 07:54:41 -08:00
|
|
|
|
// z'(X) (a'(X) + \beta) (s'(X) + \gamma)
|
|
|
|
|
// - z'(\omega^{-1} X) (\theta^{m-1} a_0(X) + ... + a_{m-1}(X) + \beta) (\theta^{m-1} s_0(X) + ... + s_{m-1}(X) + \gamma)
|
|
|
|
|
//
|
|
|
|
|
// degree 2:
|
|
|
|
|
// l_0(X) * (a'(X) - s'(X)) = 0
|
|
|
|
|
//
|
|
|
|
|
// degree 2:
|
|
|
|
|
// (a′(X)−s′(X))⋅(a′(X)−a′(\omega{-1} X)) = 0
|
2021-02-11 17:40:53 -08:00
|
|
|
|
let mut input_degree = 1;
|
|
|
|
|
for expr in self.input_columns.iter() {
|
|
|
|
|
input_degree = std::cmp::max(input_degree, expr.degree());
|
|
|
|
|
}
|
|
|
|
|
let mut table_degree = 1;
|
|
|
|
|
for expr in self.table_columns.iter() {
|
|
|
|
|
table_degree = std::cmp::max(table_degree, expr.degree());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
1 + input_degree + table_degree
|
2020-12-22 07:54:41 -08:00
|
|
|
|
}
|
2020-11-30 22:53:20 -08:00
|
|
|
|
}
|