mirror of
https://github.com/serai-dex/serai.git
synced 2024-11-17 01:17:36 +00:00
Fix a bug in the merkle algorithm
This commit is contained in:
parent
d5a12a9b97
commit
ff5c240fcc
2 changed files with 35 additions and 1 deletions
|
@ -18,7 +18,7 @@ pub(crate) fn merkle(hash_args: &[[u8; 32]]) -> [u8; 32] {
|
||||||
b"branch_hash".as_ref(),
|
b"branch_hash".as_ref(),
|
||||||
hashes[i].as_ref(),
|
hashes[i].as_ref(),
|
||||||
hashes
|
hashes
|
||||||
.get(i + i)
|
.get(i + 1)
|
||||||
.map(|hash| {
|
.map(|hash| {
|
||||||
let res: &[u8] = hash.as_ref();
|
let res: &[u8] = hash.as_ref();
|
||||||
res
|
res
|
||||||
|
|
34
coordinator/tributary/src/tests/merkle.rs
Normal file
34
coordinator/tributary/src/tests/merkle.rs
Normal 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]);
|
||||||
|
}
|
Loading…
Reference in a new issue