Skip to content

Commit

Permalink
refactor: define public, private structs for spend, nullifier derivat…
Browse files Browse the repository at this point in the history
…ion and delegator vote circuits (#3571)

* refactor: define `NullifierDerivationProof` public and private data

* refactor: define `SpendProof` public and private data

* refactor: define `DelegatorVoteProof` public and private data

* refactor: make new methods private, use DummyWitness in benches

and remove no longer needed clippy exceptions
  • Loading branch information
redshiftzero authored Jan 5, 2024
1 parent b3204b1 commit d471aa3
Show file tree
Hide file tree
Showing 15 changed files with 520 additions and 457 deletions.
90 changes: 27 additions & 63 deletions crates/bench/benches/delegator_vote.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ use ark_relations::r1cs::{
};
use decaf377::{Fq, Fr};
use decaf377_rdsa::{SpendAuth, VerificationKey};
use penumbra_asset::{balance, Value};
use penumbra_governance::{DelegatorVoteCircuit, DelegatorVoteProof};
use penumbra_keys::keys::{Bip44Path, NullifierKey, SeedPhrase, SpendKey};
use penumbra_proof_params::DELEGATOR_VOTE_PROOF_PROVING_KEY;
use penumbra_asset::Value;
use penumbra_governance::{
DelegatorVoteCircuit, DelegatorVoteProof, DelegatorVoteProofPrivate, DelegatorVoteProofPublic,
};
use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey};
use penumbra_proof_params::{DummyWitness, DELEGATOR_VOTE_PROOF_PROVING_KEY};
use penumbra_sct::Nullifier;
use penumbra_shielded_pool::Note;
use penumbra_tct as tct;
Expand All @@ -18,36 +20,10 @@ use criterion::{criterion_group, criterion_main, Criterion};
use rand_core::OsRng;

#[allow(clippy::too_many_arguments)]
fn prove(
r: Fq,
s: Fq,
state_commitment_proof: tct::Proof,
note: Note,
spend_auth_randomizer: Fr,
ak: VerificationKey<SpendAuth>,
nk: NullifierKey,
anchor: tct::Root,
balance_commitment: balance::Commitment,
nullifier: Nullifier,
rk: VerificationKey<SpendAuth>,
start_position: tct::Position,
) {
let _proof = DelegatorVoteProof::prove(
r,
s,
&DELEGATOR_VOTE_PROOF_PROVING_KEY,
state_commitment_proof,
note,
spend_auth_randomizer,
ak,
nk,
anchor,
balance_commitment,
nullifier,
rk,
start_position,
)
.expect("can create proof");
fn prove(r: Fq, s: Fq, public: DelegatorVoteProofPublic, private: DelegatorVoteProofPrivate) {
let _proof =
DelegatorVoteProof::prove(r, s, &DELEGATOR_VOTE_PROOF_PROVING_KEY, public, private)
.expect("can create proof");
}

fn delegator_vote_proving_time(c: &mut Criterion) {
Expand All @@ -73,7 +49,7 @@ fn delegator_vote_proving_time(c: &mut Criterion) {
let v_blinding = Fr::from(0i32);
let balance_commitment = value_to_send.commit(v_blinding);
let rk: VerificationKey<SpendAuth> = rsk.into();
let nf = Nullifier::derive(&nk, state_commitment_proof.position(), &note_commitment);
let nullifier = Nullifier::derive(&nk, state_commitment_proof.position(), &note_commitment);
sct.end_epoch().unwrap();

let first_note_commitment = Note::generate(&mut OsRng, &sender, value_to_send).commit();
Expand All @@ -83,40 +59,28 @@ fn delegator_vote_proving_time(c: &mut Criterion) {

let r = Fq::rand(&mut OsRng);
let s = Fq::rand(&mut OsRng);

c.bench_function("delegator proving", |b| {
b.iter(|| {
prove(
r,
s,
state_commitment_proof.clone(),
note.clone(),
spend_auth_randomizer,
ak,
nk,
anchor,
balance_commitment,
nf,
rk,
start_position,
)
})
});

// Also print out the number of constraints.
let circuit = DelegatorVoteCircuit::new(
let public = DelegatorVoteProofPublic {
anchor,
balance_commitment,
nullifier,
rk,
start_position,
};
let private = DelegatorVoteProofPrivate {
state_commitment_proof,
note,
v_blinding,
spend_auth_randomizer,
ak,
nk,
anchor,
balance_commitment,
nf,
rk,
start_position,
);
};

c.bench_function("delegator proving", |b| {
b.iter(|| prove(r, s, public.clone(), private.clone()))
});

// Also print out the number of constraints.
let circuit = DelegatorVoteCircuit::with_dummy_witness();

let cs = ConstraintSystem::new_ref();
cs.set_optimization_goal(OptimizationGoal::Constraints);
Expand Down
28 changes: 16 additions & 12 deletions crates/bench/benches/nullifier_derivation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@ use ark_relations::r1cs::{
};
use decaf377::Fq;
use penumbra_asset::Value;
use penumbra_keys::keys::{Bip44Path, NullifierKey, SeedPhrase, SpendKey};
use penumbra_proof_params::NULLIFIER_DERIVATION_PROOF_PROVING_KEY;
use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey};
use penumbra_proof_params::{DummyWitness, NULLIFIER_DERIVATION_PROOF_PROVING_KEY};
use penumbra_sct::Nullifier;
use penumbra_shielded_pool::{Note, Rseed};
use penumbra_shielded_pool::{
Note, NullifierDerivationProofPrivate, NullifierDerivationProofPublic, Rseed,
};
use penumbra_shielded_pool::{NullifierDerivationCircuit, NullifierDerivationProof};
use penumbra_tct as tct;

use criterion::{criterion_group, criterion_main, Criterion};
use rand_core::OsRng;

fn prove(position: tct::Position, note: Note, nk: NullifierKey, nullifier: Nullifier) {
fn prove(public: NullifierDerivationProofPublic, private: NullifierDerivationProofPrivate) {
let _proof = NullifierDerivationProof::prove(
&mut OsRng,
&NULLIFIER_DERIVATION_PROOF_PROVING_KEY,
position,
note,
nk,
nullifier,
public,
private,
)
.expect("Can generate proof");
}
Expand All @@ -47,14 +47,18 @@ fn nullifier_derivation_proving_time(c: &mut Criterion) {
sct.insert(tct::Witness::Keep, note_commitment).unwrap();
let state_commitment_proof = sct.witness(note_commitment).unwrap();
let position = state_commitment_proof.position();
let public = NullifierDerivationProofPublic {
position,
note_commitment,
nullifier,
};
let private = NullifierDerivationProofPrivate { nk };

c.bench_function("nullifier derivation proving", |b| {
b.iter(|| prove(position, note.clone(), nk, nullifier))
b.iter(|| prove(public.clone(), private.clone()))
});

// Also print out the number of constraints.
let circuit = NullifierDerivationCircuit::new(position, note.commit(), nk, nullifier);

let circuit = NullifierDerivationCircuit::with_dummy_witness();
let cs = ConstraintSystem::new_ref();
cs.set_optimization_goal(OptimizationGoal::Constraints);
cs.set_mode(SynthesisMode::Setup);
Expand Down
83 changes: 22 additions & 61 deletions crates/bench/benches/spend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,47 +6,20 @@ use ark_relations::r1cs::{
};
use decaf377::{Fq, Fr};
use decaf377_rdsa::{SpendAuth, VerificationKey};
use penumbra_asset::{balance, Value};
use penumbra_keys::keys::{Bip44Path, NullifierKey, SeedPhrase, SpendKey};
use penumbra_proof_params::SPEND_PROOF_PROVING_KEY;
use penumbra_asset::Value;
use penumbra_keys::keys::{Bip44Path, SeedPhrase, SpendKey};
use penumbra_proof_params::{DummyWitness, SPEND_PROOF_PROVING_KEY};
use penumbra_sct::Nullifier;
use penumbra_shielded_pool::{Note, SpendCircuit, SpendProof};
use penumbra_shielded_pool::{Note, SpendCircuit, SpendProof, SpendProofPrivate, SpendProofPublic};
use penumbra_tct as tct;

use criterion::{criterion_group, criterion_main, Criterion};
use rand_core::OsRng;

#[allow(clippy::too_many_arguments)]
fn prove(
r: Fq,
s: Fq,
state_commitment_proof: tct::Proof,
note: Note,
v_blinding: Fr,
spend_auth_randomizer: Fr,
ak: VerificationKey<SpendAuth>,
nk: NullifierKey,
anchor: tct::Root,
balance_commitment: balance::Commitment,
nullifier: Nullifier,
rk: VerificationKey<SpendAuth>,
) {
let _proof = SpendProof::prove(
r,
s,
&SPEND_PROOF_PROVING_KEY,
state_commitment_proof,
note,
v_blinding,
spend_auth_randomizer,
ak,
nk,
anchor,
balance_commitment,
nullifier,
rk,
)
.expect("can create proof");
fn prove(r: Fq, s: Fq, public: SpendProofPublic, private: SpendProofPrivate) {
let _proof = SpendProof::prove(r, s, &SPEND_PROOF_PROVING_KEY, public, private)
.expect("can create proof");
}

fn spend_proving_time(c: &mut Criterion) {
Expand Down Expand Up @@ -76,39 +49,27 @@ fn spend_proving_time(c: &mut Criterion) {

let r = Fq::rand(&mut OsRng);
let s = Fq::rand(&mut OsRng);

c.bench_function("spend proving", |b| {
b.iter(|| {
prove(
r,
s,
state_commitment_proof.clone(),
note.clone(),
v_blinding,
spend_auth_randomizer,
ak,
nk,
anchor,
balance_commitment,
nf,
rk,
)
})
});

// Also print out the number of constraints.
let circuit = SpendCircuit::new(
let public = SpendProofPublic {
anchor,
balance_commitment,
nullifier: nf,
rk,
};
let private = SpendProofPrivate {
state_commitment_proof,
note,
v_blinding,
spend_auth_randomizer,
ak,
nk,
anchor,
balance_commitment,
nf,
rk,
);
};

c.bench_function("spend proving", |b| {
b.iter(|| prove(r, s, public.clone(), private.clone()))
});

// Also print out the number of constraints.
let circuit = SpendCircuit::with_dummy_witness();

let cs = ConstraintSystem::new_ref();
cs.set_optimization_goal(OptimizationGoal::Constraints);
Expand Down
Loading

0 comments on commit d471aa3

Please sign in to comment.