Circuit::synthesize(): Old note commmitment integrity.

This commit is contained in:
therealyingtong 2021-06-07 18:24:58 +08:00
parent 84172e0326
commit 1a1a65af4a
2 changed files with 42 additions and 4 deletions

View File

@ -42,13 +42,13 @@ use gadget::{
StateWord, Word, StateWord, Word,
}, },
sinsemilla::{ sinsemilla::{
chip::{SinsemillaChip, SinsemillaCommitDomains, SinsemillaConfig, SinsemillaHashDomains}, chip::{SinsemillaChip, SinsemillaConfig, SinsemillaHashDomains},
commit_ivk::CommitIvkConfig, commit_ivk::CommitIvkConfig,
merkle::{ merkle::{
chip::{MerkleChip, MerkleConfig}, chip::{MerkleChip, MerkleConfig},
MerklePath, MerklePath,
}, },
CommitDomain, note_commit::NoteCommitConfig,
}, },
utilities::{ utilities::{
copy, copy,
@ -63,7 +63,8 @@ use std::convert::TryInto;
pub(crate) mod gadget; pub(crate) mod gadget;
/// Size of the Orchard circuit. /// Size of the Orchard circuit.
const K: u32 = 11; // FIXME: This circuit should fit within 2^11 rows.
const K: u32 = 12;
/// Configuration needed to use the Orchard Action circuit. /// Configuration needed to use the Orchard Action circuit.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -81,6 +82,7 @@ pub struct Config {
sinsemilla_config_1: SinsemillaConfig, sinsemilla_config_1: SinsemillaConfig,
sinsemilla_config_2: SinsemillaConfig, sinsemilla_config_2: SinsemillaConfig,
commit_ivk_config: CommitIvkConfig, commit_ivk_config: CommitIvkConfig,
old_note_commit_config: NoteCommitConfig,
} }
/// The Orchard Action circuit. /// The Orchard Action circuit.
@ -241,6 +243,11 @@ impl plonk::Circuit<pallas::Base> for Circuit {
let commit_ivk_config = let commit_ivk_config =
CommitIvkConfig::configure(meta, advices, sinsemilla_config_1.clone()); CommitIvkConfig::configure(meta, advices, sinsemilla_config_1.clone());
// Configuration to handle decomposition and canonicity checking
// for NoteCommit_old.
let old_note_commit_config =
NoteCommitConfig::configure(meta, advices, sinsemilla_config_1.clone());
// TODO: Infrastructure to handle public inputs. // TODO: Infrastructure to handle public inputs.
let q_primary = meta.selector(); let q_primary = meta.selector();
let primary = meta.instance_column(); let primary = meta.instance_column();
@ -272,6 +279,7 @@ impl plonk::Circuit<pallas::Base> for Circuit {
sinsemilla_config_1, sinsemilla_config_1,
sinsemilla_config_2, sinsemilla_config_2,
commit_ivk_config, commit_ivk_config,
old_note_commit_config,
} }
} }
@ -553,7 +561,7 @@ impl plonk::Circuit<pallas::Base> for Circuit {
}; };
// Diversified address integrity. // Diversified address integrity.
let _pk_d_old = { let (pk_d_old, _) = {
let commit_ivk_config = config.commit_ivk_config.clone(); let commit_ivk_config = config.commit_ivk_config.clone();
let ivk = { let ivk = {
@ -573,6 +581,28 @@ impl plonk::Circuit<pallas::Base> for Circuit {
g_d_old.mul(layouter.namespace(|| "[ivk] g_d_old"), ivk.inner())? g_d_old.mul(layouter.namespace(|| "[ivk] g_d_old"), ivk.inner())?
}; };
// Old note commitment integrity.
let _cm_old = {
let old_note_commit_config = config.old_note_commit_config.clone();
let rcm_old = self.rcm_old.as_ref().map(|rcm_old| **rcm_old);
// g★_d || pk★_d || i2lebsp_{64}(v) || i2lebsp_{255}(rho) || i2lebsp_{255}(psi)
old_note_commit_config.assign_region(
layouter.namespace(|| {
"g★_d || pk★_d || i2lebsp_{64}(v) || i2lebsp_{255}(rho) || i2lebsp_{255}(psi)"
}),
config.sinsemilla_chip_1(),
config.ecc_chip(),
g_d_old.inner(),
pk_d_old.inner(),
v_old,
rho_old,
psi_old,
rcm_old,
)?
};
Ok(()) Ok(())
} }
} }

View File

@ -10,6 +10,14 @@ use crate::{constants::L_ORCHARD_BASE, primitives::sinsemilla, spec::extract_p,
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct NoteCommitTrapdoor(pub(super) pallas::Scalar); pub(crate) struct NoteCommitTrapdoor(pub(super) pallas::Scalar);
impl std::ops::Deref for NoteCommitTrapdoor {
type Target = pallas::Scalar;
fn deref(&self) -> &pallas::Scalar {
&self.0
}
}
/// A commitment to a note. /// A commitment to a note.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct NoteCommitment(pub(super) pallas::Point); pub struct NoteCommitment(pub(super) pallas::Point);