Fix a bug in the merkle algorithm

This commit is contained in:
Luke Parker 2023-04-12 10:52:28 -04:00
parent d5a12a9b97
commit ff5c240fcc
No known key found for this signature in database
2 changed files with 35 additions and 1 deletions

View file

@ -18,7 +18,7 @@ pub(crate) fn merkle(hash_args: &[[u8; 32]]) -> [u8; 32] {
b"branch_hash".as_ref(),
hashes[i].as_ref(),
hashes
.get(i + i)
.get(i + 1)
.map(|hash| {
let res: &[u8] = hash.as_ref();
res

View file

@ -0,0 +1,34 @@
use std::collections::HashSet;
use rand_core::{RngCore, OsRng};
#[test]
fn merkle() {
let mut used = HashSet::new();
// Test this produces a unique root
let mut test = |hashes: &[[u8; 32]]| {
let hash = crate::merkle(hashes);
assert!(!used.contains(&hash));
used.insert(hash);
};
// Zero should be a special case which return 0
assert_eq!(crate::merkle(&[]), [0; 32]);
test(&[]);
let mut one = [0; 32];
OsRng.fill_bytes(&mut one);
let mut two = [0; 32];
OsRng.fill_bytes(&mut two);
let mut three = [0; 32];
OsRng.fill_bytes(&mut three);
// Make sure it's deterministic
assert_eq!(crate::merkle(&[one]), crate::merkle(&[one]));
// Test a few basic structures
test(&[one]);
test(&[one, two]);
test(&[one, two, three]);
test(&[one, three]);
}