mirror of https://github.com/zcash/halo2.git
Compare commits
4 Commits
dc4e7eb712
...
e3e2517f45
Author | SHA1 | Date |
---|---|---|
ying tong | e3e2517f45 | |
Daira-Emma Hopwood | 7df93fd855 | |
adria0 | daaa638966 | |
therealyingtong | d09f2b9db1 |
|
@ -12,7 +12,7 @@ jobs:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions-rs/toolchain@v1
|
- uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: nightly
|
toolchain: '1.76.0'
|
||||||
override: true
|
override: true
|
||||||
|
|
||||||
# - name: Setup mdBook
|
# - name: Setup mdBook
|
||||||
|
@ -26,7 +26,7 @@ jobs:
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: install
|
command: install
|
||||||
args: mdbook --git https://github.com/HollowMan6/mdBook.git --rev 62e01b34c23b957579c04ee1b24b57814ed8a4d5
|
args: mdbook --git https://github.com/HollowMan6/mdBook.git --rev 5830c9555a4dc051675d17f1fcb04dd0920543e8
|
||||||
|
|
||||||
- name: Install mdbook-katex and mdbook-pdf
|
- name: Install mdbook-katex and mdbook-pdf
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
|
@ -40,6 +40,11 @@ jobs:
|
||||||
- name: Build halo2 book
|
- name: Build halo2 book
|
||||||
run: mdbook build book/
|
run: mdbook build book/
|
||||||
|
|
||||||
|
- uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: nightly-2023-10-05
|
||||||
|
override: true
|
||||||
|
|
||||||
- name: Build latest rustdocs
|
- name: Build latest rustdocs
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
|
|
|
@ -14,8 +14,6 @@ title = "The halo2 Book"
|
||||||
macros = "macros.txt"
|
macros = "macros.txt"
|
||||||
renderers = ["html"]
|
renderers = ["html"]
|
||||||
|
|
||||||
[output.katex]
|
|
||||||
|
|
||||||
[output.html]
|
[output.html]
|
||||||
|
|
||||||
[output.html.print]
|
[output.html.print]
|
||||||
|
|
|
@ -414,6 +414,97 @@ impl<G: PrimeGroup, ConcreteCircuit: Circuit<G::Scalar>> CircuitCost<G, Concrete
|
||||||
_marker: PhantomData::default(),
|
_marker: PhantomData::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the marginal prover work per instance of this circuit.
|
||||||
|
pub fn marginal_prover_work(&self) -> MarginalProverWork {
|
||||||
|
// Instance columns
|
||||||
|
// - 1 `lagrange_to_coeff` for each instance column
|
||||||
|
// - 1 `coeff_to_extended` for each instance column
|
||||||
|
// - 1 `commit_lagrange` for each instance column
|
||||||
|
let instance = ProverWorkContribution::new(
|
||||||
|
self.num_instance_columns,
|
||||||
|
self.num_instance_columns,
|
||||||
|
self.num_instance_columns,
|
||||||
|
);
|
||||||
|
// Instance columns
|
||||||
|
// - 1 `lagrange_to_coeff` for each advice column
|
||||||
|
// - 1 `coeff_to_extended` for each advice column
|
||||||
|
// - 1 `commit_lagrange` for each advice column
|
||||||
|
let advice = ProverWorkContribution::new(
|
||||||
|
self.num_advice_columns,
|
||||||
|
self.num_advice_columns,
|
||||||
|
self.num_advice_columns,
|
||||||
|
);
|
||||||
|
// Lookup arguments
|
||||||
|
// - for the permuted input expression:
|
||||||
|
// - 1 `lagrange_to_coeff`
|
||||||
|
// - 1 `coeff_to_extended`
|
||||||
|
// - 1 `commit_lagrange`
|
||||||
|
// - for the permuted table expression:
|
||||||
|
// - 1 `lagrange_to_coeff`
|
||||||
|
// - 1 `coeff_to_extended`
|
||||||
|
// - 1 `commit_lagrange`
|
||||||
|
// - for the lookup product:
|
||||||
|
// - 1 `lagrange_to_coeff`
|
||||||
|
// - 1 `coeff_to_extended`
|
||||||
|
// - 1 `commit_lagrange`
|
||||||
|
let lookups =
|
||||||
|
ProverWorkContribution::new(self.lookups * 3, self.lookups * 3, self.lookups * 3);
|
||||||
|
// For each chunk:
|
||||||
|
// - 1 `lagrange_to_coeff`
|
||||||
|
// - 1 `coeff_to_extended`
|
||||||
|
// - 1 `commit_lagrange`
|
||||||
|
let equality = ProverWorkContribution::new(
|
||||||
|
self.permutation_chunks(),
|
||||||
|
self.permutation_chunks(),
|
||||||
|
self.permutation_chunks(),
|
||||||
|
);
|
||||||
|
|
||||||
|
MarginalProverWork {
|
||||||
|
instance,
|
||||||
|
advice,
|
||||||
|
lookups,
|
||||||
|
equality,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the prover work for the given number of instances of this circuit.
|
||||||
|
pub fn prover_work(&self, instances: usize) -> ProverWork {
|
||||||
|
let mut extended_k = self.k;
|
||||||
|
let n = 1u64 << self.k;
|
||||||
|
while (1 << extended_k) < (n * (self.max_deg as u64 - 1)) {
|
||||||
|
extended_k += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let marginal = self.marginal_prover_work();
|
||||||
|
|
||||||
|
// Vanishing argument
|
||||||
|
// - 1 `extended_to_coeff` on `h_poly`
|
||||||
|
// - 1 commitment to random_poly
|
||||||
|
// - (max_deg - 1) commitments (1 for each `h(X)` piece)
|
||||||
|
let vanishing = ProverWorkContribution::new(0, 1, 1 + (self.max_deg - 1));
|
||||||
|
|
||||||
|
// Multiopen argument
|
||||||
|
// - 1 commitment to q_prime
|
||||||
|
let multiopen = ProverWorkContribution::new(0, 0, 1);
|
||||||
|
|
||||||
|
// IPA polynomial commitment
|
||||||
|
// - 1 commitment to s_poly
|
||||||
|
// - the number of scalar multiplications resulting from all rounds of IPA
|
||||||
|
// is equivalent to about 2 * (2 * 2^k) (excluding some constants)
|
||||||
|
let polycomm = ProverWorkContribution::new(0, 0, 4);
|
||||||
|
|
||||||
|
ProverWork {
|
||||||
|
extended_k,
|
||||||
|
instance: marginal.instance * instances,
|
||||||
|
advice: marginal.advice * instances,
|
||||||
|
lookups: marginal.lookups * instances,
|
||||||
|
equality: marginal.equality * instances,
|
||||||
|
vanishing,
|
||||||
|
multiopen,
|
||||||
|
polycomm,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// (commitments, evaluations)
|
/// (commitments, evaluations)
|
||||||
|
@ -510,6 +601,72 @@ impl<G: PrimeGroup> From<ProofSize<G>> for usize {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct ProverWorkContribution {
|
||||||
|
// Number of FFTs in the 2^k domain
|
||||||
|
ffts: usize,
|
||||||
|
// Number of FFTs in the 2^extended_k domain
|
||||||
|
extended_ffts: usize,
|
||||||
|
// Number of multi-scalar multiplications of length 2^k
|
||||||
|
msms: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ProverWorkContribution {
|
||||||
|
fn new(ffts: usize, extended_ffts: usize, msms: usize) -> Self {
|
||||||
|
ProverWorkContribution {
|
||||||
|
ffts,
|
||||||
|
extended_ffts,
|
||||||
|
msms,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add for ProverWorkContribution {
|
||||||
|
type Output = Self;
|
||||||
|
|
||||||
|
fn add(self, rhs: Self) -> Self::Output {
|
||||||
|
Self {
|
||||||
|
ffts: self.ffts + rhs.ffts,
|
||||||
|
extended_ffts: self.extended_ffts + rhs.extended_ffts,
|
||||||
|
msms: self.msms + rhs.msms,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Mul<usize> for ProverWorkContribution {
|
||||||
|
type Output = Self;
|
||||||
|
|
||||||
|
fn mul(self, instances: usize) -> Self::Output {
|
||||||
|
Self {
|
||||||
|
ffts: self.ffts * instances,
|
||||||
|
extended_ffts: self.extended_ffts * instances,
|
||||||
|
msms: self.msms * instances,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The marginal prover work to generate a Halo 2 proof, broken down into its contributing factors.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct MarginalProverWork {
|
||||||
|
instance: ProverWorkContribution,
|
||||||
|
advice: ProverWorkContribution,
|
||||||
|
lookups: ProverWorkContribution,
|
||||||
|
equality: ProverWorkContribution,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The prover work to generate a Halo 2 proof, broken down into its contributing factors.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct ProverWork {
|
||||||
|
extended_k: u32,
|
||||||
|
instance: ProverWorkContribution,
|
||||||
|
advice: ProverWorkContribution,
|
||||||
|
lookups: ProverWorkContribution,
|
||||||
|
equality: ProverWorkContribution,
|
||||||
|
vanishing: ProverWorkContribution,
|
||||||
|
multiopen: ProverWorkContribution,
|
||||||
|
polycomm: ProverWorkContribution,
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use pasta_curves::{Eq, Fp};
|
use pasta_curves::{Eq, Fp};
|
||||||
|
|
Loading…
Reference in New Issue