Skip to content

Commit

Permalink
Merge pull request #803 from AleoHQ/parallelize-merkle-tree
Browse files Browse the repository at this point in the history
Merkle tree parallelize integration + upgrade to snarkVM 0.4.0
  • Loading branch information
howardwu authored Jun 1, 2021
2 parents e811037 + 59f366a commit 0774aee
Show file tree
Hide file tree
Showing 16 changed files with 283 additions and 155 deletions.
249 changes: 147 additions & 102 deletions Cargo.lock

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,20 @@ name = "snarkos"
path = "snarkos/main.rs"

[dependencies.snarkvm-algorithms]
version = "0.3.1"
version = "0.4.0"
default-features = false

[dependencies.snarkvm-dpc]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-objects]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-posw]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkos-consensus]
path = "./consensus"
Expand Down
25 changes: 24 additions & 1 deletion benchmarks/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,36 @@ name = "syncing"
path = "syncing/syncing.rs"
harness = false

[[bench]]
name = "merkle"
path = "merkle/merkle.rs"
harness = false

[[bench]]
name = "network"
path = "network/network.rs"
harness = false

[dependencies.snarkvm-algorithms]
version = "0.4.0"

[dependencies.snarkvm-curves]
version = "0.4.0"

[dependencies.snarkvm-dpc]
version = "0.4.0"

[dependencies.snarkvm-objects]
version = "0.4.0"

[dependencies.snarkvm-parameters]
version = "0.4.0"

[dependencies.snarkvm-posw]
version = "0.4.0"

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkos-profiler]
path = "../profiler"
Expand Down
54 changes: 54 additions & 0 deletions benchmarks/merkle/merkle.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// Copyright (C) 2019-2021 Aleo Systems Inc.
// This file is part of the snarkOS library.

// The snarkOS library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// The snarkOS library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with the snarkOS library. If not, see <https://www.gnu.org/licenses/>.

use std::sync::Arc;

use criterion::*;
use rand::Rng;
use snarkvm_algorithms::{merkle_tree::MerkleTree, MerkleParameters, CRH};
use snarkvm_dpc::base_dpc::instantiated::*;
use snarkvm_parameters::{LedgerMerkleTreeParameters, Parameter};
use snarkvm_utilities::bytes::FromBytes;

fn merkle_build(c: &mut Criterion) {
let crh_parameters =
<MerkleTreeCRH as CRH>::Parameters::read(&LedgerMerkleTreeParameters::load_bytes().unwrap()[..])
.expect("read bytes as hash for MerkleParameters in ledger");
let merkle_tree_hash_parameters = <CommitmentMerkleParameters as MerkleParameters>::H::from(crh_parameters);
let ledger_merkle_tree_parameters: Arc<CommitmentMerkleParameters> =
Arc::new(From::from(merkle_tree_hash_parameters));

let mut commitments = Vec::with_capacity(10000);
for _ in 0..10000 {
let mut buf = [0u8; 32];
rand::thread_rng().fill(&mut buf[..]);
commitments.push(buf);
}

c.bench_function("merkle_build", move |b| {
b.iter(|| {
MerkleTree::new(ledger_merkle_tree_parameters.clone(), &commitments[..]).unwrap();
});
});
}

criterion_group! {
name = merkle;
config = Criterion::default().sample_size(10);
targets = merkle_build
}

criterion_main!(merkle);
12 changes: 6 additions & 6 deletions consensus/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,22 @@ license = "GPL-3.0"
edition = "2018"

[dependencies.snarkvm-algorithms]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-curves]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-dpc]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-objects]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-posw]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkos-profiler]
path = "../profiler"
Expand Down
2 changes: 1 addition & 1 deletion metrics/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ features = [ "macros", "rt-multi-thread" ]
version = "0.3"

[dev-dependencies.snarkvm-derives]
version = "0.3.1"
version = "0.4.0"

[dev-dependencies.serial_test]
version = "0.5.0"
8 changes: 4 additions & 4 deletions network/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,16 @@ license = "GPL-3.0"
edition = "2018"

[dependencies.snarkvm-algorithms]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-dpc]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-objects]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkos-consensus]
path = "../consensus"
Expand Down
16 changes: 8 additions & 8 deletions parameters/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,34 +18,34 @@ license = "GPL-3.0"
edition = "2018"

[dependencies.snarkvm-algorithms]
version = "0.3.1"
version = "0.4.0"
default-features = false

[dependencies.snarkvm-parameters]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"
default-features = false

[dependencies.curl]
version = "0.4.36"
optional = true

[dev-dependencies.snarkvm-curves]
version = "0.3.1"
version = "0.4.0"

[dev-dependencies.snarkvm-dpc]
version = "0.3.1"
version = "0.4.0"

[dev-dependencies.snarkvm-marlin]
version = "0.3.1"
version = "0.4.0"

[dev-dependencies.snarkvm-objects]
version = "0.3.1"
version = "0.4.0"

[dev-dependencies.snarkvm-posw]
version = "0.3.1"
version = "0.4.0"

[dev-dependencies.snarkos-consensus]
path = "../consensus"
Expand Down
2 changes: 1 addition & 1 deletion parameters/examples/generate_transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ fn empty_ledger<T: Transaction, P: LoadableMerkleParameters, S: Storage>(
.map_err(|err| LedgerError::Message(err.to_string()))?;

let leaves: &[[u8; 32]] = &[];
let cm_merkle_tree = MerkleTree::<P>::new(parameters.clone(), leaves.iter())?;
let cm_merkle_tree = MerkleTree::<P>::new(parameters.clone(), &leaves[..])?;

Ok(Ledger {
current_block_height: Default::default(),
Expand Down
8 changes: 4 additions & 4 deletions rpc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@ license = "GPL-3.0"
edition = "2018"

[dependencies.snarkvm-algorithms]
version = "0.3.1"
version = "0.4.0"
default-features = false

[dependencies.snarkvm-dpc]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-objects]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkos-consensus]
path = "../consensus"
Expand Down
12 changes: 6 additions & 6 deletions storage/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,19 @@ mem_storage = [ ]
test = [ ] # enables database deletion for tests; used by snarkos-testing

[dependencies.snarkvm-algorithms]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-dpc]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-objects]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-parameters]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkos-parameters]
path = "../parameters"
Expand Down Expand Up @@ -72,7 +72,7 @@ version = "1.0"
path = "../consensus"

[dev-dependencies.snarkvm-curves]
version = "0.3.1"
version = "0.4.0"

[dev-dependencies.snarkos-testing]
path = "../testing"
8 changes: 5 additions & 3 deletions storage/src/ledger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,17 +134,19 @@ impl<T: Transaction, P: LoadableMerkleParameters, S: Storage> Ledger<T, P, S> {

let mut cm_and_indices = vec![];

for (commitment_key, index_value) in storage.get_col(COL_COMMITMENT)? {
let cms = storage.get_col(COL_COMMITMENT)?;

for (commitment_key, index_value) in cms {
let commitment: T::Commitment = FromBytes::read(&commitment_key[..])?;
let index = bytes_to_u32(&index_value) as usize;

cm_and_indices.push((commitment, index));
}

cm_and_indices.sort_by(|&(_, i), &(_, j)| i.cmp(&j));
let commitments = cm_and_indices.into_iter().map(|(cm, _)| cm);
let commitments = cm_and_indices.into_iter().map(|(cm, _)| cm).collect::<Vec<_>>();

let merkle_tree = MerkleTree::new(ledger_parameters.clone(), commitments)?;
let merkle_tree = MerkleTree::new(ledger_parameters.clone(), &commitments[..])?;

Ok(Self {
current_block_height: AtomicU32::new(bytes_to_u32(&val)),
Expand Down
8 changes: 6 additions & 2 deletions storage/src/objects/dpc_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,13 @@ impl<T: Transaction, P: LoadableMerkleParameters, S: Storage> Ledger<T, P, S> {
new_cm_and_indices.sort_by(|&(_, i), &(_, j)| i.cmp(&j));

let old_commitments = old_cm_and_indices.into_iter().map(|(cm, _)| cm);
let new_commitments = new_cm_and_indices.into_iter().map(|(cm, _)| cm);
let new_commitments = new_cm_and_indices.into_iter().map(|(cm, _)| cm).collect::<Vec<_>>();

let new_tree = { self.cm_merkle_tree.read().rebuild(old_commitments, new_commitments)? };
let new_tree = {
self.cm_merkle_tree
.read()
.rebuild(old_commitments, &new_commitments[..])?
};
*self.cm_merkle_tree.write() = new_tree;

Ok(())
Expand Down
2 changes: 1 addition & 1 deletion storage/src/objects/ledger_scheme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ impl<T: Transaction, P: LoadableMerkleParameters, S: Storage> LedgerScheme for L
}

let leaves: &[[u8; 32]] = &[];
let empty_cm_merkle_tree = MerkleTree::<Self::MerkleParameters>::new(parameters.clone(), leaves.iter())?;
let empty_cm_merkle_tree = MerkleTree::<Self::MerkleParameters>::new(parameters.clone(), leaves)?;

let ledger_storage = Self {
current_block_height: Default::default(),
Expand Down
14 changes: 7 additions & 7 deletions testing/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,25 +29,25 @@ network = [
]

[dependencies.snarkvm-algorithms]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-curves]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-dpc]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-objects]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-parameters]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-posw]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"

[dependencies.snarkos-consensus]
path = "../consensus"
Expand Down
8 changes: 4 additions & 4 deletions toolkit/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,20 @@ path = "benches/account.rs"
harness = false

[dependencies.snarkvm-algorithms]
version = "0.3.1"
version = "0.4.0"
default-features = false
features = [ "wasm" ]

[dependencies.snarkvm-dpc]
version = "0.3.1"
version = "0.4.0"
default-features = false

[dependencies.snarkvm-objects]
version = "0.3.1"
version = "0.4.0"
default-features = false

[dependencies.snarkvm-utilities]
version = "0.3.1"
version = "0.4.0"

[dependencies.anyhow]
version = "1.0.40"
Expand Down

0 comments on commit 0774aee

Please sign in to comment.