Skip to content

Commit

Permalink
append
Browse files Browse the repository at this point in the history
  • Loading branch information
tiagofneto committed Aug 30, 2023
1 parent 37bcd47 commit 477d802
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 43 deletions.
16 changes: 7 additions & 9 deletions src/data_structures/mmr/mmr.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,15 @@ impl MMRImpl of MMRTrait {
}

// @notice Appends an element to the MMR
// @param element The element to append
// @param hash The hashed element to append
// @param peaks The peaks of the MMR
// @return Result with the new root of the MMR
fn append(ref self: MMR, element: felt252, peaks: Peaks) -> Result<felt252, felt252> {
fn append(ref self: MMR, hash: felt252, peaks: Peaks) -> Result<felt252, felt252> {
if !peaks.valid(self.last_pos, self.root) {
return Result::Err('Invalid peaks');
}

self.last_pos += 1;
let hash = PoseidonHasher::hash_double(element, self.last_pos.into());

// TODO refactor this logic
let mut peaks_arr = ArrayTrait::new();
Expand Down Expand Up @@ -84,8 +83,7 @@ impl MMRImpl of MMRTrait {
};

let hash = PoseidonHasher::hash_double(*left, *right);
let hash_index = PoseidonHasher::hash_double(self.last_pos.into(), hash);
new_peaks.append(hash_index);
new_peaks.append(hash);
peaks_arr = new_peaks;

height += 1;
Expand All @@ -94,23 +92,23 @@ impl MMRImpl of MMRTrait {
let new_root = compute_root(self.last_pos.into(), peaks_arr.span());
self.root = new_root;

return Result::Ok(new_root);
Result::Ok(new_root)
}

// @notice Verifies a proof for an element in the MMR
// @param index The index of the element in the MMR
// @param value The value of the element
// @param hash The hash of the element
// @param peaks The peaks of the MMR
// @param proof The proof for the element
// @return Result with true if the proof is valid, false otherwise
fn verify_proof(
self: @MMR, index: usize, value: felt252, peaks: Peaks, proof: Proof
self: @MMR, index: usize, hash: felt252, peaks: Peaks, proof: Proof
) -> Result<bool, felt252> {
if !peaks.valid(*self.last_pos, *self.root) {
return Result::Err('Invalid peaks');
}

let peak = proof.compute_peak(index, value);
let peak = proof.compute_peak(index, hash);
Result::Ok(peaks.contains_peak(peak))
}
}
1 change: 0 additions & 1 deletion src/data_structures/mmr/proof.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use cairo_lib::data_structures::mmr::utils::get_height;
use cairo_lib::utils::bitwise::left_shift;
use array::SpanTrait;
use traits::Into;
use debug::PrintTrait;

type Proof = Span<felt252>;

Expand Down
64 changes: 32 additions & 32 deletions src/data_structures/mmr/tests/test_mmr.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ use array::{ArrayTrait, SpanTrait};
use result::ResultTrait;

fn helper_test_get_elements() -> Span<felt252> {
let elem1 = PoseidonHasher::hash_double(1, 1);
let elem2 = PoseidonHasher::hash_double(2, 2);
let elem3 = PoseidonHasher::hash_double(3, PoseidonHasher::hash_double(elem1, elem2));
let elem4 = PoseidonHasher::hash_double(4, 4);
let elem5 = PoseidonHasher::hash_double(5, 5);
let elem6 = PoseidonHasher::hash_double(6, PoseidonHasher::hash_double(elem4, elem5));
let elem7 = PoseidonHasher::hash_double(7, PoseidonHasher::hash_double(elem3, elem6));
let elem8 = PoseidonHasher::hash_double(8, 8);
let elem1 = PoseidonHasher::hash_single(1);
let elem2 = PoseidonHasher::hash_single(2);
let elem3 = PoseidonHasher::hash_double(elem1, elem2);
let elem4 = PoseidonHasher::hash_single(4);
let elem5 = PoseidonHasher::hash_single(5);
let elem6 = PoseidonHasher::hash_double(elem4, elem5);
let elem7 = PoseidonHasher::hash_double(elem3, elem6);
let elem8 = PoseidonHasher::hash_single(8);

let arr = array![elem1, elem2, elem3, elem4, elem5, elem6, elem7, elem8];
arr.span()
Expand All @@ -25,7 +25,7 @@ fn test_append_initial() {
let mut mmr: MMR = Default::default();

let peaks = array![].span();
mmr.append(1, peaks);
mmr.append(*elems.at(0), peaks);

let root = PoseidonHasher::hash_double(1, *elems.at(0));
assert(mmr.last_pos == 1, 'Wrong last_pos');
Expand All @@ -39,10 +39,10 @@ fn test_append_1() {
let mut mmr: MMR = Default::default();

let mut peaks = array![].span();
mmr.append(1, peaks);
mmr.append(*elems.at(0), peaks);

peaks = array![*elems.at(0)].span();
mmr.append(2, peaks);
mmr.append(*elems.at(1), peaks);

let root = PoseidonHasher::hash_double(3, *elems.at(2));
assert(mmr.last_pos == 3, 'Wrong last_pos');
Expand All @@ -56,13 +56,13 @@ fn test_append_2() {
let mut mmr: MMR = Default::default();

let mut peaks = array![].span();
mmr.append(1, peaks);
mmr.append(*elems.at(0), peaks);

peaks = array![*elems.at(0)].span();
mmr.append(2, peaks);
mmr.append(*elems.at(1), peaks);

peaks = array![*elems.at(2)].span();
mmr.append(4, peaks);
mmr.append(*elems.at(3), peaks);

let root = PoseidonHasher::hash_double(
4, PoseidonHasher::hash_double(*elems.at(2), *elems.at(3))
Expand All @@ -78,16 +78,16 @@ fn test_append_3() {
let mut mmr: MMR = Default::default();

let mut peaks = array![].span();
mmr.append(1, peaks);
mmr.append(*elems.at(0), peaks);

peaks = array![*elems.at(0)].span();
mmr.append(2, peaks);
mmr.append(*elems.at(1), peaks);

peaks = array![*elems.at(2)].span();
mmr.append(4, peaks);
mmr.append(*elems.at(3), peaks);

peaks = array![*elems.at(2), *elems.at(3)].span();
mmr.append(5, peaks);
mmr.append(*elems.at(4), peaks);

let root = PoseidonHasher::hash_double(7, *elems.at(6));
assert(mmr.last_pos == 7, 'Wrong last_pos');
Expand All @@ -101,19 +101,19 @@ fn test_append_4() {
let mut mmr: MMR = Default::default();

let mut peaks = array![].span();
mmr.append(1, peaks);
mmr.append(*elems.at(0), peaks);

peaks = array![*elems.at(0)].span();
mmr.append(2, peaks);
mmr.append(*elems.at(1), peaks);

peaks = array![*elems.at(2)].span();
mmr.append(4, peaks);
mmr.append(*elems.at(3), peaks);

peaks = array![*elems.at(2), *elems.at(3)].span();
mmr.append(5, peaks);
mmr.append(*elems.at(4), peaks);

peaks = array![*elems.at(6)].span();
mmr.append(8, peaks);
mmr.append(*elems.at(7), peaks);

let root = PoseidonHasher::hash_double(
8, PoseidonHasher::hash_double(*elems.at(6), *elems.at(7))
Expand All @@ -129,16 +129,16 @@ fn test_append_wrong_peaks() {
let mut mmr: MMR = Default::default();

let mut peaks = array![].span();
mmr.append(1, peaks);
mmr.append(*elems.at(0), peaks);

peaks = array![*elems.at(0)].span();
mmr.append(2, peaks);
mmr.append(*elems.at(1), peaks);

peaks = array![*elems.at(2)].span();
mmr.append(4, peaks);
mmr.append(*elems.at(3), peaks);

peaks = array![*elems.at(2), *elems.at(4)].span();
let res = mmr.append(5, peaks);
let res = mmr.append(*elems.at(4), peaks);

assert(res.is_err(), 'Wrong peaks');
}
Expand All @@ -157,7 +157,7 @@ fn test_verify_proof_all_left() {
let proof = array![*elems.at(1), *elems.at(5)].span();
let peaks = array![*elems.at(6), *elems.at(7)].span();

assert(mmr.verify_proof(1, 1, peaks, proof).unwrap(), 'Invalid proof all left')
assert(mmr.verify_proof(1, *elems.at(0), peaks, proof).unwrap(), 'Invalid proof all left')
}

#[test]
Expand All @@ -174,7 +174,7 @@ fn test_verify_proof_all_right() {
let proof = array![*elems.at(3), *elems.at(2)].span();
let peaks = array![*elems.at(6), *elems.at(7)].span();

assert(mmr.verify_proof(5, 5, peaks, proof).unwrap(), 'Invalid proof all right')
assert(mmr.verify_proof(5, *elems.at(4), peaks, proof).unwrap(), 'Invalid proof all right')
}

#[test]
Expand All @@ -191,7 +191,7 @@ fn test_verify_proof_left_right() {
let proof = array![*elems.at(0), *elems.at(5)].span();
let peaks = array![*elems.at(6), *elems.at(7)].span();

assert(mmr.verify_proof(2, 2, peaks, proof).unwrap(), 'Valid invalid proof left right')
assert(mmr.verify_proof(2, *elems.at(1), peaks, proof).unwrap(), 'Valid invalid proof left right')
}

#[test]
Expand All @@ -208,7 +208,7 @@ fn test_verify_invalid_proof() {
let proof = array![*elems.at(2), *elems.at(2)].span();
let peaks = array![*elems.at(6), *elems.at(7)].span();

assert(!mmr.verify_proof(2, 2, peaks, proof).unwrap(), 'Invalid proof left right')
assert(!mmr.verify_proof(2, *elems.at(1), peaks, proof).unwrap(), 'Invalid proof left right')
}

#[test]
Expand All @@ -225,5 +225,5 @@ fn test_verify_proof_invalid_peaks() {
let proof = array![*elems.at(0), *elems.at(5)].span();
let peaks = array![*elems.at(1), *elems.at(5)].span();

assert(mmr.verify_proof(2, 2, peaks, proof).is_err(), 'Proof wrong peaks')
assert(mmr.verify_proof(2, *elems.at(1), peaks, proof).is_err(), 'Proof wrong peaks')
}
1 change: 0 additions & 1 deletion src/data_structures/mmr/tests/test_proof.cairo
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use cairo_lib::data_structures::mmr::proof::{Proof, ProofTrait};
use cairo_lib::hashing::poseidon::PoseidonHasher;
use array::{ArrayTrait, SpanTrait};
use debug::PrintTrait;

fn helper_test_get_elements() -> Span<felt252> {
let elem1 = PoseidonHasher::hash_single(1);
Expand Down

0 comments on commit 477d802

Please sign in to comment.