Skip to content

Commit

Permalink
Merge pull request #52 from HerodotusDev/develop
Browse files Browse the repository at this point in the history
Stacked MMRs fix + Pia's commits
  • Loading branch information
beeinger authored Feb 27, 2024
2 parents 6e4542b + 388cc4a commit e149073
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 16 deletions.
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,19 @@

[![Cargo Test](https://github.com/HerodotusDev/rust-mmr/actions/workflows/ci.yml/badge.svg)](https://github.com/HerodotusDev/rust-mmr/actions/workflows/ci.yml)

# Quick Start

Add dependency on `Cargo.toml`

```rust
accumulators = { version = "0.4.0", features = ["all"] }
```

# Development

Test : `cargo test --all-features`
Bench : `cargo bench --all-features`

## Accumulators

### - [MMR](./src/mmr/README.md)
Expand Down Expand Up @@ -53,4 +66,4 @@ Key value stores used for storing the accumulator data.

---

Herodotus Dev Ltd - 2023
Herodotus Dev Ltd - 2024
30 changes: 20 additions & 10 deletions src/mmr/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,8 +226,10 @@ impl MMR {
}

let options = options.unwrap_or_default();
let element_count = self.elements_count.get().await?;
let tree_size = options.elements_count.unwrap_or(element_count);
let tree_size = match options.elements_count {
Some(count) => count,
None => self.elements_count.get().await?,
};

if element_index > tree_size {
return Err(MMRError::InvalidElementIndex);
Expand Down Expand Up @@ -284,8 +286,10 @@ impl MMR {
options: Option<ProofOptions>,
) -> Result<Vec<Proof>, MMRError> {
let options = options.unwrap_or_default();
let element_count = self.elements_count.get().await?;
let tree_size = options.elements_count.unwrap_or(element_count);
let tree_size = match options.elements_count {
Some(count) => count,
None => self.elements_count.get().await?,
};

for &element_index in &elements_indexes {
if element_index == 0 {
Expand Down Expand Up @@ -349,8 +353,10 @@ impl MMR {
options: Option<ProofOptions>,
) -> Result<bool, MMRError> {
let options = options.unwrap_or_default();
let element_count = self.elements_count.get().await?;
let tree_size = options.elements_count.unwrap_or(element_count);
let tree_size = match options.elements_count {
Some(count) => count,
None => self.elements_count.get().await?,
};

let leaf_count = mmr_size_to_leaf_count(tree_size);
let peaks_count = leaf_count_to_peaks_count(leaf_count);
Expand Down Expand Up @@ -418,8 +424,10 @@ impl MMR {
}

pub async fn get_peaks(&self, option: PeaksOptions) -> Result<Vec<String>, MMRError> {
let elements_count = self.elements_count.get().await?;
let tree_size = option.elements_count.unwrap_or(elements_count);
let tree_size = match option.elements_count {
Some(count) => count,
None => self.elements_count.get().await?,
};

let peaks_idxs = find_peaks(tree_size);
let peaks = self.retrieve_peaks_hashes(peaks_idxs, None).await?;
Expand Down Expand Up @@ -458,8 +466,10 @@ impl MMR {
}

pub async fn bag_the_peaks(&self, elements_count: Option<usize>) -> Result<String, MMRError> {
let element_count_result = self.elements_count.get().await;
let tree_size = elements_count.unwrap_or(element_count_result?);
let tree_size = match elements_count {
Some(count) => count,
None => self.elements_count.get().await?,
};
let peaks_idxs = find_peaks(tree_size);

let peaks_hashes = self.retrieve_peaks_hashes(peaks_idxs.clone(), None).await?;
Expand Down
11 changes: 6 additions & 5 deletions src/mmr/mmrs/stacked.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ impl MMR {
let sub_mmrs_count = sub_mmrs_metadata.len();
let mut sub_mmrs: Vec<SubMMR> = Vec::with_capacity(sub_mmrs_count);

for (idx, (size, mmr_metadata)) in sub_mmrs_metadata.into_iter().enumerate() {
for (idx, (size, mmr_metadata)) in sub_mmrs_metadata.iter().enumerate() {
let (_, _, _, hashes_table) =
MMR::get_stores(&mmr_metadata.mmr_id, mmr_metadata.store.clone());

sub_mmrs.push(SubMMR {
size,
size: *size,
store: mmr_metadata.store.clone(),
key: hashes_table.key.clone(),
});
Expand All @@ -41,19 +41,20 @@ impl MMR {
let current_elements_count = mmr.elements_count.get().await?;

//? If the current MMR is already larger than the sub MMR, we don't need to do anything
if current_elements_count >= elements_count {
if current_elements_count >= *elements_count {
continue;
}

let leaves_count = elements_count_to_leaf_count(elements_count)?;
let leaves_count = elements_count_to_leaf_count(*elements_count)?;

mmr.elements_count.set(elements_count).await?;
mmr.elements_count.set(*elements_count).await?;
mmr.leaves_count.set(leaves_count).await?;
}

mmr.hashes.get_store_and_full_key = MMR::get_store_and_full_key;
mmr.hashes.get_stores_and_full_keys = MMR::get_stores_and_full_keys;
mmr.hashes.sub_mmrs = Some(sub_mmrs);
mmr.sub_mmrs = sub_mmrs_metadata;

Ok(mmr)
}
Expand Down

0 comments on commit e149073

Please sign in to comment.