Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

integrate blsttc/blstrs and remove mint::* #157

Merged
merged 8 commits into from Mar 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 9 additions & 9 deletions Cargo.toml
Expand Up @@ -17,11 +17,12 @@ ringct-serde = [ "blst_ringct/serde" ]
[dependencies]
thiserror = "1.0.24"
quickcheck_macros = "1"
rand = "0.7.1"
blsttc = "3.3.0"
rand = "0.8.0"
blsttc = {git = "https://github.com/dan-da/blsttc", branch = "sn_dbc_integration"}
hex = "0.4.3"
rand_core = "0.6.3"
xor_name = "3.1.0"
# xor_name = "3.1.0"
xor_name = {git = "https://github.com/iancoleman/xor_name", branch = "remove_osrng"}

[dependencies.quickcheck]
git = "https://github.com/davidrusu/quickcheck.git"
Expand All @@ -38,12 +39,10 @@ xor_name = "3.1.0"
git = "https://github.com/davidrusu/blst-bulletproofs.git"
branch = "bls12-381-curve"

[dependencies.rand8]
package = "rand"
version = "0.8.0"

[dependencies.bls_dkg]
version = "~0.9"
git = "https://github.com/dan-da/bls_dkg.git"
branch = "sn_dbc_integration"
version = "~0.9.1"
optional = true

[dependencies.tiny-keccak]
Expand All @@ -57,10 +56,11 @@ xor_name = "3.1.0"

[dev-dependencies]
anyhow = "1.0.40"
rand = "0.7.1"
rand = "0.8.0"
rustyline = "8.0.0"
bincode = "1.3.3"
criterion = "0.3.5"
pprof = {version = "0.7.0", features = ["flamegraph"]}

[dev-dependencies.sn_dbc]
path = "."
Expand Down
159 changes: 68 additions & 91 deletions benches/reissue.rs
Expand Up @@ -9,191 +9,168 @@
#![allow(clippy::from_iter_instead_of_collect)]

use sn_dbc::{
Amount, Dbc, GenesisBuilderMock, MintNode, Owner, OwnerOnce, Result, SimpleKeyManager,
SpentBookNodeMock,
Amount, Dbc, GenesisBuilderMock, Owner, OwnerOnce, Result, SpentBookNodeMock,
TransactionVerifier,
};

use blst_ringct::Output;

use criterion::{black_box, criterion_group, criterion_main, Criterion};
use rand::SeedableRng;
use rand8::SeedableRng as SeedableRng8;
use rand::SeedableRng as SeedableRng8;

const N_OUTPUTS: u32 = 100;

fn bench_reissue_1_to_100(c: &mut Criterion) {
let mut rng8 = rand8::rngs::StdRng::from_seed([0u8; 32]);
let mut rng = rand::rngs::StdRng::from_seed([0u8; 32]);
let mut rng8 = rand::rngs::StdRng::from_seed([0u8; 32]);
dan-da marked this conversation as resolved.
Show resolved Hide resolved

let (mintnode, mut spentbook, starting_dbc) =
generate_dbc_of_value(N_OUTPUTS as Amount, &mut rng, &mut rng8).unwrap();
let (mut spentbook, starting_dbc) =
generate_dbc_of_value(N_OUTPUTS as Amount, &mut rng8).unwrap();

let (mut rr_builder, ..) = sn_dbc::TransactionBuilder::default()
let mut dbc_builder = sn_dbc::TransactionBuilder::default()
.add_input_by_secrets(
starting_dbc
.owner_once_bearer()
.unwrap()
.secret_key_blst()
.secret_key()
.unwrap(),
starting_dbc.amount_secrets_bearer().unwrap(),
vec![], // never any decoys for genesis
&mut rng8,
)
.add_outputs((0..N_OUTPUTS).into_iter().map(|_| {
.add_outputs_by_amount((0..N_OUTPUTS).into_iter().map(|_| {
let owner_once =
OwnerOnce::from_owner_base(Owner::from_random_secret_key(&mut rng), &mut rng8);
(
Output {
amount: 1,
public_key: owner_once.as_owner().public_key_blst(),
},
owner_once,
)
OwnerOnce::from_owner_base(Owner::from_random_secret_key(&mut rng8), &mut rng8);
(1, owner_once)
}))
.build(&mut rng8)
.unwrap();

for (key_image, tx) in rr_builder.inputs() {
for (key_image, tx) in dbc_builder.inputs() {
let spent_proof_share = spentbook.log_spent(key_image, tx).unwrap();
rr_builder = rr_builder.add_spent_proof_share(spent_proof_share);
dbc_builder = dbc_builder.add_spent_proof_share(spent_proof_share);
}
let rr = rr_builder.build().unwrap();

let spent_proofs = dbc_builder.spent_proofs().unwrap();
let tx = &dbc_builder.transaction;

let guard = pprof::ProfilerGuard::new(100).unwrap();
c.bench_function(&format!("reissue split 1 to {}", N_OUTPUTS), |b| {
b.iter(|| {
mintnode.reissue(black_box(rr.clone())).unwrap();
})
TransactionVerifier::verify(&spentbook.key_manager, black_box(tx), &spent_proofs)
.unwrap();
});
});
if let Ok(report) = guard.report().build() {
let file = std::fs::File::create(&format!("reissue_split_1_to_{}.svg", N_OUTPUTS)).unwrap();
report.flamegraph(file).unwrap();
};
}

fn bench_reissue_100_to_1(c: &mut Criterion) {
let mut rng8 = rand8::rngs::StdRng::from_seed([0u8; 32]);
let mut rng = rand::rngs::StdRng::from_seed([0u8; 32]);
let mut rng8 = rand::rngs::StdRng::from_seed([0u8; 32]);
let num_decoys = 0;

let (mintnode, mut spentbook, starting_dbc) =
generate_dbc_of_value(N_OUTPUTS as Amount, &mut rng, &mut rng8).unwrap();
let (mut spentbook_node, starting_dbc) =
generate_dbc_of_value(N_OUTPUTS as Amount, &mut rng8).unwrap();

let (mut rr_builder, mut dbc_builder, ..) = sn_dbc::TransactionBuilder::default()
let mut dbc_builder = sn_dbc::TransactionBuilder::default()
.add_input_by_secrets(
starting_dbc
.owner_once_bearer()
.unwrap()
.secret_key_blst()
.secret_key()
.unwrap(),
starting_dbc.amount_secrets_bearer().unwrap(),
vec![], // never any decoy inputs for genesis
&mut rng8,
)
.add_outputs((0..N_OUTPUTS).into_iter().map(|_| {
.add_outputs_by_amount((0..N_OUTPUTS).into_iter().map(|_| {
let owner_once =
OwnerOnce::from_owner_base(Owner::from_random_secret_key(&mut rng), &mut rng8);
(
Output {
amount: 1,
public_key: owner_once.as_owner().public_key_blst(),
},
owner_once,
)
OwnerOnce::from_owner_base(Owner::from_random_secret_key(&mut rng8), &mut rng8);
(1, owner_once)
}))
.build(&mut rng8)
.unwrap();

for (key_image, tx) in rr_builder.inputs() {
let spent_proof_share = spentbook.log_spent(key_image, tx).unwrap();
rr_builder = rr_builder.add_spent_proof_share(spent_proof_share);
for (key_image, tx) in dbc_builder.inputs() {
let spent_proof_share = spentbook_node.log_spent(key_image, tx).unwrap();
dbc_builder = dbc_builder.add_spent_proof_share(spent_proof_share);
}
let rr = rr_builder.build().unwrap();

let reissue_share = mintnode.reissue(rr).unwrap();

dbc_builder = dbc_builder.add_reissue_share(reissue_share);
let dbcs = dbc_builder.build(mintnode.key_manager()).unwrap();
let dbcs = dbc_builder.build(&spentbook_node.key_manager).unwrap();

let output_owner_once =
OwnerOnce::from_owner_base(Owner::from_random_secret_key(&mut rng), &mut rng8);
OwnerOnce::from_owner_base(Owner::from_random_secret_key(&mut rng8), &mut rng8);

let (mut merge_rr_builder, ..) = sn_dbc::TransactionBuilder::default()
let mut merge_dbc_builder = sn_dbc::TransactionBuilder::default()
.add_inputs_by_secrets(
dbcs.into_iter()
.map(|(_dbc, owner_once, amount_secrets)| {
(
owner_once.as_owner().secret_key_blst().unwrap(),
owner_once.as_owner().secret_key().unwrap(),
amount_secrets,
spentbook.random_decoys(num_decoys, &mut rng8),
spentbook_node.random_decoys(num_decoys, &mut rng8),
)
})
.collect(),
&mut rng8,
)
.add_output(
Output {
amount: N_OUTPUTS as Amount,
public_key: output_owner_once.as_owner().public_key_blst(),
},
output_owner_once,
)
.add_output_by_amount(N_OUTPUTS as Amount, output_owner_once)
.build(&mut rng8)
.unwrap();

for (key_image, tx) in merge_rr_builder.inputs() {
let spent_proof_share = spentbook.log_spent(key_image, tx).unwrap();
merge_rr_builder = merge_rr_builder.add_spent_proof_share(spent_proof_share);
for (key_image, tx) in merge_dbc_builder.inputs() {
let spent_proof_share = spentbook_node.log_spent(key_image, tx).unwrap();
merge_dbc_builder = merge_dbc_builder.add_spent_proof_share(spent_proof_share);
}
let merge_rr = merge_rr_builder.build().unwrap();

let spent_proofs = merge_dbc_builder.spent_proofs().unwrap();
let tx = &merge_dbc_builder.transaction;

let guard = pprof::ProfilerGuard::new(100).unwrap();
c.bench_function(&format!("reissue merge {} to 1", N_OUTPUTS), |b| {
b.iter(|| {
mintnode.reissue(black_box(merge_rr.clone())).unwrap();
})
TransactionVerifier::verify(&spentbook_node.key_manager, black_box(tx), &spent_proofs)
.unwrap();
});
});
if let Ok(report) = guard.report().build() {
let file = std::fs::File::create(&format!("reissue_merge_{}_to_1.svg", N_OUTPUTS)).unwrap();
report.flamegraph(file).unwrap();
};
}

fn generate_dbc_of_value(
amount: Amount,
rng: &mut impl rand::RngCore,
rng8: &mut (impl rand8::RngCore + rand_core::CryptoRng),
) -> Result<(MintNode<SimpleKeyManager>, SpentBookNodeMock, Dbc)> {
let (mint_node, mut spentbook_node, genesis_dbc, _genesis_material, _amount_secrets) =
GenesisBuilderMock::init_genesis_single(rng, rng8)?;
rng8: &mut (impl rand::RngCore + rand_core::CryptoRng),
) -> Result<(SpentBookNodeMock, Dbc)> {
let (mut spentbook_node, genesis_dbc, _genesis_material, _amount_secrets) =
GenesisBuilderMock::init_genesis_single(rng8)?;

let output_amounts = vec![amount, sn_dbc::GenesisMaterial::GENESIS_AMOUNT - amount];

let (mut rr_builder, mut dbc_builder, _material) = sn_dbc::TransactionBuilder::default()
let mut dbc_builder = sn_dbc::TransactionBuilder::default()
.add_input_by_secrets(
genesis_dbc.owner_once_bearer()?.secret_key_blst()?,
genesis_dbc.owner_once_bearer()?.secret_key()?,
genesis_dbc.amount_secrets_bearer()?,
vec![], // never any decoys for genesis
rng8,
)
.add_outputs(output_amounts.into_iter().map(|amount| {
let owner_once = OwnerOnce::from_owner_base(Owner::from_random_secret_key(rng), rng8);
(
Output {
amount,
public_key: owner_once.as_owner().public_key_blst(),
},
owner_once,
)
.add_outputs_by_amount(output_amounts.into_iter().map(|amount| {
let owner_once = OwnerOnce::from_owner_base(Owner::from_random_secret_key(rng8), rng8);
(amount, owner_once)
}))
.build(rng8)?;

// Build ReissuRequest
for (key_image, tx) in rr_builder.inputs() {
for (key_image, tx) in dbc_builder.inputs() {
let spent_proof_share = spentbook_node.log_spent(key_image, tx)?;
rr_builder = rr_builder.add_spent_proof_share(spent_proof_share);
dbc_builder = dbc_builder.add_spent_proof_share(spent_proof_share);
}
let rr = rr_builder.build()?;

let reissue_share = mint_node.reissue(rr)?;
dbc_builder = dbc_builder.add_reissue_share(reissue_share);
let (starting_dbc, ..) = dbc_builder
.build(mint_node.key_manager())?
.build(&spentbook_node.key_manager)?
.into_iter()
.next()
.unwrap();

Ok((mint_node, spentbook_node, starting_dbc))
Ok((spentbook_node, starting_dbc))
}

criterion_group! {
Expand Down