85 lines
2.7 KiB
Rust
85 lines
2.7 KiB
Rust
use criterion::{criterion_group, criterion_main, Criterion};
|
|
use ff::Field;
|
|
use rand_core::OsRng;
|
|
use zcash_primitives::{
|
|
consensus::{NetworkUpgrade::Canopy, Parameters, TEST_NETWORK},
|
|
note_encryption::{try_sapling_note_decryption, Memo, SaplingNoteEncryption},
|
|
primitives::{Diversifier, PaymentAddress, ValueCommitment},
|
|
transaction::components::{OutputDescription, GROTH_PROOF_SIZE},
|
|
util::generate_random_rseed,
|
|
};
|
|
|
|
fn bench_note_decryption(c: &mut Criterion) {
|
|
let mut rng = OsRng;
|
|
let height = TEST_NETWORK.activation_height(Canopy).unwrap();
|
|
|
|
let valid_ivk = jubjub::Fr::random(&mut rng);
|
|
let invalid_ivk = jubjub::Fr::random(&mut rng);
|
|
|
|
// Construct a fake Sapling output as if we had just deserialized a transaction.
|
|
let output = {
|
|
let diversifier = Diversifier([0; 11]);
|
|
let pk_d = diversifier.g_d().unwrap() * valid_ivk;
|
|
let pa = PaymentAddress::from_parts(diversifier, pk_d).unwrap();
|
|
|
|
let rseed = generate_random_rseed(&TEST_NETWORK, height, &mut rng);
|
|
|
|
// Construct the value commitment for the proof instance
|
|
let value = 100;
|
|
let value_commitment = ValueCommitment {
|
|
value,
|
|
randomness: jubjub::Fr::random(&mut rng),
|
|
};
|
|
let cv = value_commitment.commitment().into();
|
|
|
|
let note = pa.create_note(value, rseed).unwrap();
|
|
let cmu = note.cmu();
|
|
|
|
let mut ne = SaplingNoteEncryption::new(None, note, pa, Memo::default(), &mut rng);
|
|
let ephemeral_key = ne.epk().clone().into();
|
|
let enc_ciphertext = ne.encrypt_note_plaintext();
|
|
let out_ciphertext = ne.encrypt_outgoing_plaintext(&cv, &cmu);
|
|
|
|
OutputDescription {
|
|
cv,
|
|
cmu,
|
|
ephemeral_key,
|
|
enc_ciphertext,
|
|
out_ciphertext,
|
|
zkproof: [0; GROTH_PROOF_SIZE],
|
|
}
|
|
};
|
|
|
|
let mut group = c.benchmark_group("Sapling note decryption");
|
|
|
|
group.bench_function("valid", |b| {
|
|
b.iter(|| {
|
|
try_sapling_note_decryption(
|
|
&TEST_NETWORK,
|
|
height,
|
|
&valid_ivk,
|
|
&output.ephemeral_key,
|
|
&output.cmu,
|
|
&output.enc_ciphertext,
|
|
)
|
|
.unwrap()
|
|
})
|
|
});
|
|
|
|
group.bench_function("invalid", |b| {
|
|
b.iter(|| {
|
|
try_sapling_note_decryption(
|
|
&TEST_NETWORK,
|
|
height,
|
|
&invalid_ivk,
|
|
&output.ephemeral_key,
|
|
&output.cmu,
|
|
&output.enc_ciphertext,
|
|
)
|
|
})
|
|
});
|
|
}
|
|
|
|
criterion_group!(benches, bench_note_decryption);
|
|
criterion_main!(benches);
|