Skip to content

Commit

Permalink
Merge pull request #81 from worldcoin/ewoolsey/cleanup
Browse files Browse the repository at this point in the history
Cleanup
  • Loading branch information
ewoolsey committed Jul 10, 2024
2 parents 5e03e63 + af219dd commit 36429d2
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 94 deletions.
51 changes: 21 additions & 30 deletions benches/cascading_merkle_tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@ fn bench_cascading_create_dense_mmap_tree(criterion: &mut Criterion) {
value,
|bencher: &mut criterion::Bencher, value| {
bencher.iter(|| {
let storage: MmapVec<_> =
unsafe { MmapVec::open_create("./testfile").unwrap() };
let tempfile = tempfile::tempfile().unwrap();
let storage: MmapVec<_> = unsafe { MmapVec::create(tempfile).unwrap() };
let _tree: CascadingMerkleTree<PoseidonHash, _> =
CascadingMerkleTree::new_with_leaves(
storage,
Expand All @@ -138,8 +138,6 @@ fn bench_cascading_create_dense_mmap_tree(criterion: &mut Criterion) {
);
}
group.finish();
// remove created mmap file
let _ = std::fs::remove_file("./testfile");
}

fn bench_cascading_restore_dense_mmap_tree(criterion: &mut Criterion) {
Expand All @@ -149,29 +147,28 @@ fn bench_cascading_restore_dense_mmap_tree(criterion: &mut Criterion) {
create_values_for_tree(14),
];

// create 3 trees with different sizes, that are immediately dropped, but mmap
// file should be saved
(0..3).zip(&tree_values).for_each(|(_id, value)| {
let storage: MmapVec<_> = unsafe { MmapVec::open_create("./testfile").unwrap() };
let _tree: CascadingMerkleTree<PoseidonHash, _> = CascadingMerkleTree::new_with_leaves(
storage,
value.depth,
&value.empty_value,
&value.initial_values,
);
let _root = _tree.root();
});

let mut group = criterion.benchmark_group("bench_cascading_restore_dense_mmap_tree");

(0..3).zip(tree_values).for_each(|(id, value)| {
let tempfile = tempfile::NamedTempFile::new().unwrap();
let path = tempfile.path();
let storage: MmapVec<_> = unsafe { MmapVec::create_from_path(path).unwrap() };
{
let tree: CascadingMerkleTree<PoseidonHash, _> = CascadingMerkleTree::new_with_leaves(
storage,
value.depth,
&value.empty_value,
&value.initial_values,
);
let _ = tree.root();
}

group.bench_with_input(
BenchmarkId::from_parameter(format!("restore_dense_mmap_tree_depth_{}", value.depth)),
&(id, value),
|bencher: &mut criterion::Bencher, (id, value)| {
|bencher: &mut criterion::Bencher, (_id, value)| {
bencher.iter(|| {
let storage =
unsafe { MmapVec::open_create(format!("./testfile{}", id)).unwrap() };
let storage = unsafe { MmapVec::restore_from_path(path).unwrap() };
let _tree: CascadingMerkleTree<PoseidonHash, _> =
CascadingMerkleTree::restore(storage, value.depth, &value.empty_value)
.unwrap();
Expand All @@ -181,10 +178,6 @@ fn bench_cascading_restore_dense_mmap_tree(criterion: &mut Criterion) {
);
});
group.finish();
// remove created mmap files
let _ = std::fs::remove_file("./testfile0");
let _ = std::fs::remove_file("./testfile1");
let _ = std::fs::remove_file("./testfile2");
}

#[allow(unused)]
Expand All @@ -211,8 +204,9 @@ fn bench_cascading_dense_tree_reads(criterion: &mut Criterion) {
#[allow(unused)]
fn bench_cascading_dense_mmap_tree_reads(criterion: &mut Criterion) {
let tree_value = create_values_for_tree(14);
let file = tempfile::tempfile().unwrap();

let storage = unsafe { MmapVec::open_create("./testfile").unwrap() };
let storage = unsafe { MmapVec::create(file).unwrap() };
let tree = CascadingMerkleTree::<PoseidonHash, _>::new_with_leaves(
storage,
tree_value.depth,
Expand All @@ -228,8 +222,6 @@ fn bench_cascading_dense_mmap_tree_reads(criterion: &mut Criterion) {
})
})
});
// remove mmap file
let _ = std::fs::remove_file("./testfile");
}

fn bench_cascading_dense_tree_writes(criterion: &mut Criterion) {
Expand Down Expand Up @@ -263,7 +255,8 @@ fn bench_cascading_dense_mmap_tree_writes(criterion: &mut Criterion) {
criterion.bench_function("dense mmap tree writes", |b| {
b.iter_batched_ref(
|| {
let storage = unsafe { MmapVec::open_create("./testfile").unwrap() };
let file = tempfile::tempfile().unwrap();
let storage = unsafe { MmapVec::create(file).unwrap() };
CascadingMerkleTree::<PoseidonHash, _>::new_with_leaves(
storage,
tree_value.depth,
Expand All @@ -277,8 +270,6 @@ fn bench_cascading_dense_mmap_tree_writes(criterion: &mut Criterion) {
BatchSize::SmallInput,
);
});
// remove mmap file
let _ = std::fs::remove_file("./testfile");
}

fn create_values_for_tree(depth: usize) -> TreeValues<PoseidonHash> {
Expand Down
38 changes: 19 additions & 19 deletions benches/lazy_merkle_tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,10 @@ fn bench_create_dense_mmap_tree(criterion: &mut Criterion) {

for value in tree_values.iter() {
group.bench_with_input(BenchmarkId::from_parameter(format!("create_dense_mmap_tree_depth_{}", value.depth)), value, |bencher: &mut criterion::Bencher, value| {
let file = tempfile::NamedTempFile::new().unwrap();
let path = file.path().to_str().unwrap();
bencher.iter(|| {
let _tree = LazyMerkleTree::<PoseidonHash, Canonical>::new_mmapped_with_dense_prefix_with_init_values(value.depth, value.prefix_depth, &value.empty_value, &value.initial_values, "./testfile").unwrap();
let _tree = LazyMerkleTree::<PoseidonHash, Canonical>::new_mmapped_with_dense_prefix_with_init_values(value.depth, value.prefix_depth, &value.empty_value, &value.initial_values, path).unwrap();
let _root = _tree.root();
});
});
Expand All @@ -72,27 +74,29 @@ fn bench_restore_dense_mmap_tree(criterion: &mut Criterion) {
create_values_for_tree(14),
];

// create 3 trees with different sizes, that are immediately dropped, but mmap
// file should be saved
(0..3).zip(&tree_values).for_each(|(id, value)| {
let _tree = LazyMerkleTree::<PoseidonHash, Canonical>::new_mmapped_with_dense_prefix_with_init_values(value.depth, value.prefix_depth, &value.empty_value, &value.initial_values, &format!("./testfile{}", id)).unwrap();
let _root = _tree.root();
});

let mut group = criterion.benchmark_group("bench_restore_dense_mmap_tree");

(0..3).zip(tree_values).for_each(|(id, value)| {

let file = tempfile::NamedTempFile::new().unwrap();
let path = file.path().to_str().unwrap();
{
let _tree = LazyMerkleTree::<PoseidonHash, Canonical>::new_mmapped_with_dense_prefix_with_init_values(value.depth, value.prefix_depth, &value.empty_value, &value.initial_values, path).unwrap();
let _root = _tree.root();
}

group.bench_with_input(
BenchmarkId::from_parameter(format!("restore_dense_mmap_tree_depth_{}", value.depth)),
&(id, value),
|bencher: &mut criterion::Bencher, (id, value)| {
|bencher: &mut criterion::Bencher, (_id, value)| {
bencher.iter(|| {
let _tree =
LazyMerkleTree::<PoseidonHash, Canonical>::attempt_dense_mmap_restore(
value.depth,
value.depth,
&value.empty_value,
&format!("./testfile{}", id),
path,
)
.unwrap();
let _root = _tree.root();
Expand All @@ -101,10 +105,6 @@ fn bench_restore_dense_mmap_tree(criterion: &mut Criterion) {
);
});
group.finish();
// remove created mmap files
let _ = std::fs::remove_file("./testfile0");
let _ = std::fs::remove_file("./testfile1");
let _ = std::fs::remove_file("./testfile2");
}

#[allow(unused)]
Expand All @@ -131,13 +131,15 @@ fn bench_dense_tree_reads(criterion: &mut Criterion) {
#[allow(unused)]
fn bench_dense_mmap_tree_reads(criterion: &mut Criterion) {
let tree_value = create_values_for_tree(14);
let file = tempfile::NamedTempFile::new().unwrap();
let path = file.path().to_str().unwrap();

let tree = LazyMerkleTree::<PoseidonHash>::new_mmapped_with_dense_prefix_with_init_values(
tree_value.depth,
tree_value.prefix_depth,
&tree_value.empty_value,
&tree_value.initial_values,
"./testfile",
path,
)
.unwrap();

Expand All @@ -149,8 +151,6 @@ fn bench_dense_mmap_tree_reads(criterion: &mut Criterion) {
})
})
});
// remove mmap file
let _ = std::fs::remove_file("./testfile");
}

fn bench_dense_tree_writes(criterion: &mut Criterion) {
Expand Down Expand Up @@ -178,6 +178,8 @@ fn bench_dense_tree_writes(criterion: &mut Criterion) {

fn bench_dense_mmap_tree_writes(criterion: &mut Criterion) {
let tree_value = create_values_for_tree(14);
let file = tempfile::NamedTempFile::new().unwrap();
let path = file.path().to_str().unwrap();

let value = Field::from(123_456);

Expand All @@ -189,7 +191,7 @@ fn bench_dense_mmap_tree_writes(criterion: &mut Criterion) {
tree_value.prefix_depth,
&tree_value.empty_value,
&tree_value.initial_values,
"./testfile",
path,
)
.unwrap()
},
Expand All @@ -199,8 +201,6 @@ fn bench_dense_mmap_tree_writes(criterion: &mut Criterion) {
BatchSize::SmallInput,
);
});
// remove mmap file
let _ = std::fs::remove_file("./testfile");
}

fn create_values_for_tree(depth: usize) -> TreeValues<PoseidonHash> {
Expand Down
8 changes: 4 additions & 4 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@ fn build_circuit(depth: usize) -> Result<()> {
let depth_subfolder = depth_subfolder.display();
download_and_store_binary(
&format!("{SEMAPHORE_DOWNLOAD_URL}/{depth_str}/semaphore.zkey"),
&format!("{depth_subfolder}/semaphore.zkey"),
format!("{depth_subfolder}/semaphore.zkey"),
)?;
download_and_store_binary(
&format!("{SEMAPHORE_DOWNLOAD_URL}/{depth_str}/semaphore.wasm"),
&format!("{depth_subfolder}/semaphore.wasm"),
format!("{depth_subfolder}/semaphore.wasm"),
)?;

let zkey_file = base_path.join(&depth_str).join(format!("semaphore.zkey"));
let wasm_file = base_path.join(&depth_str).join(format!("semaphore.wasm"));
let zkey_file = base_path.join(&depth_str).join("semaphore.zkey");
let wasm_file = base_path.join(&depth_str).join("semaphore.wasm");

assert!(zkey_file.exists());
assert!(wasm_file.exists());
Expand Down
4 changes: 2 additions & 2 deletions examples/abort_test/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ fn main() -> Result<()> {

let tempfile = tempfile::tempfile()?;
let mmap_vec: MmapVec<<TestHasher as Hasher>::Hash> =
unsafe { MmapVec::new(tempfile.try_clone()?)? };
unsafe { MmapVec::restore(tempfile.try_clone()?)? };

// initialize
if args.len() == 1 {
Expand All @@ -43,7 +43,7 @@ fn main() -> Result<()> {

drop(mmap_vec);

let mmap_vec: MmapVec<<TestHasher as Hasher>::Hash> = unsafe { MmapVec::new(tempfile)? };
let mmap_vec: MmapVec<<TestHasher as Hasher>::Hash> = unsafe { MmapVec::restore(tempfile)? };

println!("restoring");
let mut tree = CascadingMerkleTree::<TestHasher, _>::restore(mmap_vec, 30, &1)?;
Expand Down
19 changes: 7 additions & 12 deletions src/cascading_merkle_tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,7 @@ where
depth: usize,
empty_value: &H::Hash,
) -> Result<CascadingMerkleTree<H, S>> {
// # Safety
// Safe because we're calling `.validate` on the tree later
let tree = unsafe { Self::restore_unchecked(storage, depth, empty_value)? };
let tree = Self::restore_unchecked(storage, depth, empty_value)?;

tree.validate()?;

Expand All @@ -66,18 +64,15 @@ where

/// Restores a tree from the provided storage
///
/// # Safety
/// This method is unsafe as it does not validate the contents of storage.
/// Use this only if you're sure that the contents of storage are valid -
/// i.e. have not been modified since last use.
pub unsafe fn restore_unchecked(
/// Invalid storage will likely result in unpredictable behavior and panic
pub fn restore_unchecked(
storage: S,
depth: usize,
empty_value: &H::Hash,
) -> Result<CascadingMerkleTree<H, S>> {
ensure!(depth > 0, "Tree depth must be greater than 0");
if storage.is_empty() || !storage.len().is_power_of_two() {
bail!("Storage must have been previously initialized and cannot be empty");
bail!("Invalid storage length: {}", storage.len());
}

let sparse_column = Self::sparse_column(depth, empty_value);
Expand Down Expand Up @@ -992,7 +987,7 @@ mod tests {
println!("Create tempfile");
let tempfile = tempfile::tempfile().unwrap();
println!("Init mmap");
let mmap_vec: MmapVec<_> = unsafe { MmapVec::new(tempfile).unwrap() };
let mmap_vec: MmapVec<_> = unsafe { MmapVec::restore(tempfile).unwrap() };

println!("Init tree");
let mut tree = CascadingMerkleTree::<TestHasher, MmapVec<_>>::new_with_leaves(
Expand Down Expand Up @@ -1028,7 +1023,7 @@ mod tests {
let file_path = tempfile.path().to_owned();

// Initialize the expected tree
let mmap_vec: MmapVec<_> = unsafe { MmapVec::new(tempfile.reopen()?).unwrap() };
let mmap_vec: MmapVec<_> = unsafe { MmapVec::restore(tempfile.reopen()?).unwrap() };
let expected_tree = CascadingMerkleTree::<PoseidonHash, MmapVec<_>>::new_with_leaves(
mmap_vec,
3,
Expand All @@ -1042,7 +1037,7 @@ mod tests {
drop(expected_tree);

// Restore the tree
let mmap_vec: MmapVec<_> = unsafe { MmapVec::restore(file_path).unwrap() };
let mmap_vec: MmapVec<_> = unsafe { MmapVec::restore_from_path(file_path).unwrap() };
let tree =
CascadingMerkleTree::<PoseidonHash, MmapVec<_>>::restore(mmap_vec, 3, &Field::ZERO)?;

Expand Down
Loading

0 comments on commit 36429d2

Please sign in to comment.