You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

575 lines
22 KiB

  1. use std::collections::HashMap;
  2. #[macro_use]
  3. extern crate arrayref;
  4. extern crate tiny_keccak;
  5. extern crate rustc_hex;
  6. extern crate hex;
  7. use rustc_hex::ToHex;
  8. mod utils;
  9. mod node;
  10. const TYPENODEEMPTY: u8 = 0;
  11. const TYPENODENORMAL: u8 = 1;
  12. const TYPENODEFINAL: u8 = 2;
  13. const TYPENODEVALUE: u8 = 3;
  14. const EMPTYNODEVALUE: [u8;32] = [0;32];
  15. pub struct TestValue {
  16. bytes: Vec<u8>,
  17. index_length: u32,
  18. }
  19. pub trait Value {
  20. fn bytes(&self) -> &Vec<u8>;
  21. fn index_length(&self) -> u32;
  22. fn hi(&self) -> [u8;32];
  23. fn ht(&self) -> [u8;32];
  24. }
  25. impl Value for TestValue {
  26. fn bytes(&self) -> &Vec<u8> {
  27. &self.bytes
  28. }
  29. fn index_length(&self) -> u32 {
  30. self.index_length
  31. }
  32. fn hi(&self) -> [u8;32] {
  33. utils::hash_vec(self.bytes().to_vec().split_at(self.index_length() as usize).0.to_vec())
  34. }
  35. fn ht(&self) -> [u8;32] {
  36. utils::hash_vec(self.bytes().to_vec())
  37. }
  38. }
  39. #[allow(dead_code)]
  40. pub struct Db {
  41. storage: HashMap<[u8;32], Vec<u8>>,
  42. }
  43. impl Db {
  44. pub fn insert(&mut self, k: [u8; 32], t: u8, il: u32, b: Vec<u8>) {
  45. let mut v: Vec<u8>;
  46. v = [t].to_vec();
  47. let il_bytes = il.to_le_bytes();
  48. v.extend(il_bytes.to_vec()); // il_bytes are [u8;4] (4 bytes)
  49. v.extend(&b);
  50. self.storage.insert(k, v);
  51. }
  52. pub fn get(&self, k: &[u8;32]) -> (u8, u32, Vec<u8>) {
  53. if k.to_vec() == EMPTYNODEVALUE.to_vec() {
  54. return (0, 0, EMPTYNODEVALUE.to_vec());
  55. }
  56. match self.storage.get(k) {
  57. Some(x) => {
  58. let t = x[0];
  59. let il_bytes: [u8; 4] = [x[1], x[2], x[3], x[4]];
  60. let il = u32::from_le_bytes(il_bytes);
  61. let b = &x[5..];
  62. (t, il, b.to_vec())
  63. },
  64. None => (TYPENODEEMPTY, 0, EMPTYNODEVALUE.to_vec()),
  65. }
  66. }
  67. }
  68. pub fn new_db()-> Db {
  69. Db {
  70. storage: HashMap::new(),
  71. }
  72. }
  73. pub struct MerkleTree {
  74. #[allow(dead_code)]
  75. root: [u8; 32],
  76. #[allow(dead_code)]
  77. num_levels: u32,
  78. #[allow(dead_code)]
  79. sto: Db,
  80. }
  81. pub fn new(num_levels: u32) -> MerkleTree {
  82. MerkleTree {
  83. root: EMPTYNODEVALUE,
  84. num_levels,
  85. sto: new_db(),
  86. }
  87. }
  88. impl MerkleTree {
  89. pub fn add(&mut self, v: &TestValue) {
  90. #![allow(unused_variables)]
  91. #[allow(dead_code)]
  92. let leaf_node_string = String::from_utf8_lossy(&v.bytes());
  93. // add the leaf that we are adding
  94. self.sto.insert(v.ht(), TYPENODEVALUE, v.index_length(), v.bytes().to_vec());
  95. let index = v.index_length() as usize;
  96. let hi = v.hi();
  97. let ht = v.ht();
  98. let path = utils::get_path(self.num_levels, hi);
  99. let mut siblings: Vec<[u8;32]> = Vec::new();
  100. let mut node_hash = self.root;
  101. for i in (0..=self.num_levels-2).rev() {
  102. // get node
  103. let (t, il, node_bytes) = self.sto.get(&node_hash);
  104. if t == TYPENODEFINAL {
  105. let hi_child = utils::hash_vec(node_bytes.to_vec().split_at(il as usize).0.to_vec());
  106. let path_child = utils::get_path(self.num_levels, hi_child);
  107. let pos_diff = utils::compare_paths(&path_child, &path);
  108. if pos_diff == 999 { // TODO use a match here, and instead of 999 return something better
  109. println!("node already exists");
  110. println!("compare paths err");
  111. return;
  112. }
  113. let final_node_1_hash = utils::calc_hash_from_leaf_and_level(pos_diff, &path_child, utils::hash_vec(node_bytes.to_vec()));
  114. self.sto.insert(final_node_1_hash, TYPENODEFINAL, il, node_bytes.to_vec());
  115. let final_node_2_hash = utils::calc_hash_from_leaf_and_level(pos_diff, &path, v.ht());
  116. self.sto.insert(final_node_2_hash, TYPENODEFINAL, v.index_length(), v.bytes().to_vec());
  117. // parent node
  118. let parent_node: node::TreeNode;
  119. if path[pos_diff as usize] {
  120. parent_node = node::TreeNode {
  121. child_l: final_node_1_hash,
  122. child_r: final_node_2_hash,
  123. }} else {
  124. parent_node = node::TreeNode {
  125. child_l: final_node_2_hash,
  126. child_r: final_node_1_hash,
  127. }}
  128. let empties = utils::get_empties_between_i_and_pos(i, pos_diff+1);
  129. for empty in &empties {
  130. siblings.push(*empty);
  131. }
  132. let path_from_pos_diff = utils::cut_path(&path, (pos_diff + 1) as usize);
  133. self.root = self.replace_leaf(path_from_pos_diff, &siblings, parent_node.ht(), TYPENODENORMAL, 0, parent_node.bytes().to_vec());
  134. return;
  135. }
  136. let node = node::parse_node_bytes(node_bytes);
  137. let sibling: [u8;32];
  138. if !path[i as usize] {
  139. node_hash = node.child_l;
  140. sibling = node.child_r;
  141. } else {
  142. sibling = node.child_l;
  143. node_hash = node.child_r;
  144. }
  145. siblings.push(*array_ref!(sibling, 0, 32));
  146. if node_hash == EMPTYNODEVALUE {
  147. if i==self.num_levels-2 && siblings[siblings.len()-1]==EMPTYNODEVALUE {
  148. let final_node_hash = utils::calc_hash_from_leaf_and_level(i+1, &path, v.ht());
  149. self.sto.insert(final_node_hash, TYPENODEFINAL, v.index_length(), v.bytes().to_vec());
  150. self.root = final_node_hash;
  151. return;
  152. }
  153. let final_node_hash = utils::calc_hash_from_leaf_and_level(i, &path, v.ht());
  154. let path_from_i = utils::cut_path(&path, i as usize);
  155. self.root = self.replace_leaf(path_from_i, &siblings, final_node_hash, TYPENODEFINAL, v.index_length(), v.bytes().to_vec());
  156. return;
  157. }
  158. }
  159. self.root = self.replace_leaf(path, &siblings, v.ht(), TYPENODEVALUE, v.index_length(), v.bytes().to_vec());
  160. }
  161. #[allow(dead_code)]
  162. pub fn replace_leaf(&mut self, path: Vec<bool>, siblings: &Vec<[u8;32]>, leaf_hash: [u8;32], node_type: u8, index_length: u32, leaf_value: Vec<u8>) -> [u8;32] {
  163. self.sto.insert(leaf_hash, node_type, index_length, leaf_value);
  164. let mut curr_node = leaf_hash;
  165. for i in 0..siblings.len() {
  166. if !path[i as usize] {
  167. let node = node::TreeNode {
  168. child_l: curr_node,
  169. child_r: siblings[siblings.len()-1-i],
  170. };
  171. self.sto.insert(node.ht(), TYPENODENORMAL, 0, node.bytes());
  172. curr_node = node.ht();
  173. } else {
  174. let node = node::TreeNode {
  175. child_l: siblings[siblings.len()-1-i],
  176. child_r: curr_node,
  177. };
  178. self.sto.insert(node.ht(), TYPENODENORMAL, 0, node.bytes());
  179. curr_node = node.ht();
  180. }
  181. }
  182. curr_node
  183. }
  184. #[allow(dead_code)]
  185. pub fn get_value_in_pos(&self, hi: [u8;32]) -> Vec<u8> {
  186. let path = utils::get_path(self.num_levels, hi);
  187. let mut node_hash = self.root;
  188. for i in (0..=self.num_levels-2).rev() {
  189. let (t, il, node_bytes) = self.sto.get(&node_hash);
  190. if t == TYPENODEFINAL {
  191. let hi_node = utils::hash_vec(node_bytes.to_vec().split_at(il as usize).0.to_vec());
  192. let path_node = utils::get_path(self.num_levels, hi_node);
  193. let pos_diff = utils::compare_paths(&path_node, &path);
  194. // if pos_diff > self.num_levels {
  195. if pos_diff != 999 {
  196. return EMPTYNODEVALUE.to_vec();
  197. }
  198. return node_bytes;
  199. }
  200. let node = node::parse_node_bytes(node_bytes);
  201. if !path[i as usize] {
  202. node_hash = node.child_l;
  203. } else {
  204. node_hash = node.child_r;
  205. }
  206. }
  207. let (_t, _il, node_bytes) = self.sto.get(&node_hash);
  208. node_bytes
  209. }
  210. #[allow(dead_code)]
  211. pub fn generate_proof(&self, hi: [u8;32]) -> Vec<u8> {
  212. let mut mp: Vec<u8> = Vec::new();
  213. let mut empties: [u8;32] = [0;32];
  214. let path = utils::get_path(self.num_levels, hi);
  215. let mut siblings: Vec<[u8;32]> = Vec::new();
  216. let mut node_hash = self.root;
  217. for i in 0..self.num_levels {
  218. let (t, il, node_bytes) = self.sto.get(&node_hash);
  219. if t == TYPENODEFINAL {
  220. let real_value_in_pos = self.get_value_in_pos(hi);
  221. if real_value_in_pos == EMPTYNODEVALUE {
  222. let leaf_hi = utils::hash_vec(node_bytes.to_vec().split_at(il as usize).0.to_vec());
  223. let path_child = utils::get_path(self.num_levels, leaf_hi);
  224. let pos_diff = utils::compare_paths(&path_child, &path);
  225. if pos_diff == self.num_levels { // TODO use a match here, and instead of 999 return something better
  226. return mp;
  227. }
  228. if pos_diff != self.num_levels-1-i {
  229. let sibling = utils::calc_hash_from_leaf_and_level(pos_diff, &path_child, utils::hash_vec(node_bytes.to_vec()));
  230. let mut new_siblings: Vec<[u8;32]> = Vec::new();
  231. new_siblings.push(sibling);
  232. new_siblings.extend(siblings);
  233. siblings = new_siblings;
  234. // set empties bit
  235. let bit_pos = self.num_levels-2-pos_diff;
  236. empties[(empties.len() as isize + (bit_pos as isize/8-1) as isize) as usize] |= 1 << (bit_pos%8);
  237. }
  238. }
  239. break
  240. }
  241. let node = node::parse_node_bytes(node_bytes);
  242. let sibling: [u8;32];
  243. if !path[self.num_levels as usize -i as usize -2] {
  244. node_hash = node.child_l;
  245. sibling = node.child_r;
  246. } else {
  247. sibling = node.child_l;
  248. node_hash = node.child_r;
  249. }
  250. if sibling != EMPTYNODEVALUE {
  251. // set empties bit
  252. empties[(empties.len() as isize + (i as isize/8-1) as isize) as usize] |= 1 << (i%8);
  253. let mut new_siblings: Vec<[u8;32]> = Vec::new();
  254. new_siblings.push(sibling);
  255. new_siblings.extend(siblings);
  256. siblings = new_siblings;
  257. }
  258. }
  259. mp.append(&mut empties[..].to_vec());
  260. for s in siblings {
  261. mp.append(&mut s.to_vec());
  262. }
  263. mp
  264. }
  265. #[allow(dead_code)]
  266. pub fn print_level(&self, parent: [u8;32], mut lvl: u32, max_level: u32) {
  267. let mut line: String = "".to_string();
  268. for _ in 0..lvl {
  269. line += &format!(" ");
  270. }
  271. line += &format!("lvl {}", lvl);
  272. line += &format!(" - '{}' = ", parent.to_hex());
  273. let (t, _, node_bytes) = self.sto.get(&parent);
  274. let mut node = node::TreeNode {
  275. child_l: EMPTYNODEVALUE,
  276. child_r: EMPTYNODEVALUE,
  277. };
  278. if t==TYPENODENORMAL {
  279. node = node::parse_node_bytes(node_bytes);
  280. line += &format!("'{}' - '{}'", node.child_l.to_hex(), node.child_r.to_hex());
  281. } else if t == TYPENODEVALUE {
  282. //
  283. } else if t == TYPENODEFINAL {
  284. let hash_node_bytes = utils::hash_vec(node_bytes);
  285. line += &format!("[final] final tree node: {} \n", hash_node_bytes.to_hex());
  286. let (_, _, leaf_node_bytes) = self.sto.get(&hash_node_bytes);
  287. for _ in 0..lvl {
  288. line += " ";
  289. }
  290. let leaf_node_string = String::from_utf8_lossy(&leaf_node_bytes);
  291. line += &format!("leaf value: {}", leaf_node_string);
  292. } else {
  293. line += "[EMPTY Branch]"
  294. }
  295. println!("{}", line);
  296. lvl += 1;
  297. if node.child_r.len()>0 && lvl<max_level && t != TYPENODEEMPTY && t != TYPENODEFINAL {
  298. self.print_level(node.child_l, lvl, max_level);
  299. self.print_level(node.child_r, lvl, max_level);
  300. }
  301. }
  302. pub fn print_full_tree(&self) {
  303. self.print_level(self.root, 0, self.num_levels - 1);
  304. println!("root {:?}", self.root.to_hex());
  305. }
  306. pub fn print_levels_tree(&self, max_level: u32) {
  307. self.print_level(self.root, 0, self.num_levels - 1 - max_level);
  308. println!("root {:?}", self.root.to_hex());
  309. }
  310. }
  311. #[allow(dead_code)]
  312. pub fn verify_proof(root: [u8;32], mp: Vec<u8>, hi: [u8;32], ht: [u8;32], num_levels: u32) -> bool {
  313. let empties: Vec<u8>;
  314. empties = mp.split_at(32).0.to_vec();
  315. let mut siblings: Vec<[u8;32]> = Vec::new();
  316. for i in (empties.len()..mp.len()).step_by(EMPTYNODEVALUE.len()) {
  317. let mut sibling: [u8;32] = [0;32];
  318. sibling.copy_from_slice(&mp[i..i+EMPTYNODEVALUE.len()]);
  319. siblings.push(sibling);
  320. }
  321. let path = utils::get_path(num_levels, hi);
  322. let mut node_hash = ht;
  323. let mut sibling_used_pos = 0;
  324. for i in (0..=num_levels-2).rev() {
  325. let sibling: [u8;32];
  326. if (empties[empties.len()-i as usize/8-1] & (1 << (i%8))) > 0 {
  327. sibling = siblings[sibling_used_pos];
  328. sibling_used_pos += 1;
  329. } else {
  330. sibling = EMPTYNODEVALUE;
  331. }
  332. let n: node::TreeNode;
  333. if path[num_levels as usize - i as usize-2] {
  334. n = node::TreeNode {
  335. child_l: sibling,
  336. child_r: node_hash,
  337. }} else {
  338. n = node::TreeNode {
  339. child_l: node_hash,
  340. child_r: sibling,
  341. }}
  342. if node_hash == EMPTYNODEVALUE && sibling == EMPTYNODEVALUE {
  343. node_hash = EMPTYNODEVALUE;
  344. } else {
  345. node_hash = n.ht();
  346. }
  347. }
  348. if node_hash==root {
  349. return true;
  350. }
  351. false
  352. }
  353. #[cfg(test)]
  354. mod tests {
  355. use super::*;
  356. use rustc_hex::ToHex;
  357. #[test]
  358. fn test_hash_vec() {
  359. let a: Vec<u8> = From::from("test");
  360. let h = utils::hash_vec(a);
  361. assert_eq!("9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658", h.to_hex());
  362. }
  363. #[test]
  364. fn test_new_mt() {
  365. let mt: MerkleTree = new(140);
  366. assert_eq!(140, mt.num_levels);
  367. assert_eq!("0000000000000000000000000000000000000000000000000000000000000000", mt.root.to_hex());
  368. let (_t, _il, b) = mt.sto.get(&[0;32]);
  369. assert_eq!(mt.root.to_vec(), b);
  370. }
  371. #[test]
  372. fn test_tree_node() {
  373. let n = node::TreeNode {
  374. child_l: [1;32],
  375. child_r: [2;32],
  376. };
  377. assert_eq!("01010101010101010101010101010101010101010101010101010101010101010202020202020202020202020202020202020202020202020202020202020202",
  378. n.bytes().to_hex());
  379. assert_eq!("346d8c96a2454213fcc0daff3c96ad0398148181b9fa6488f7ae2c0af5b20aa0", n.ht().to_hex());
  380. }
  381. #[test]
  382. fn test_add() {
  383. let mut mt: MerkleTree = new(140);
  384. assert_eq!("0000000000000000000000000000000000000000000000000000000000000000", mt.root.to_hex());
  385. let val = TestValue {
  386. bytes: vec![1,2,3,4,5],
  387. index_length: 3,
  388. };
  389. mt.add(&val);
  390. let (_t, _il, b) = mt.sto.get(&val.ht());
  391. assert_eq!(*val.bytes(), b);
  392. assert_eq!("a0e72cc948119fcb71b413cf5ada12b2b825d5133299b20a6d9325ffc3e2fbf1", mt.root.to_hex());
  393. }
  394. #[test]
  395. fn test_add_2() {
  396. let mut mt: MerkleTree = new(140);
  397. let val = TestValue {
  398. bytes: "this is a test leaf".as_bytes().to_vec(),
  399. index_length: 15,
  400. };
  401. assert_eq!("0000000000000000000000000000000000000000000000000000000000000000", mt.root.to_hex());
  402. mt.add(&val);
  403. let (_t, _il, b) = mt.sto.get(&val.ht());
  404. assert_eq!(*val.bytes(), b);
  405. assert_eq!("b4fdf8a653198f0e179ccb3af7e4fc09d76247f479d6cfc95cd92d6fda589f27", mt.root.to_hex());
  406. let val2 = TestValue {
  407. bytes: "this is a second test leaf".as_bytes().to_vec(),
  408. index_length: 15,
  409. };
  410. mt.add(&val2);
  411. let (_t, _il, b) = mt.sto.get(&val2.ht());
  412. assert_eq!(*val2.bytes(), b);
  413. assert_eq!("8ac95e9c8a6fbd40bb21de7895ee35f9c8f30ca029dbb0972c02344f49462e82", mt.root.to_hex());
  414. }
  415. #[test]
  416. fn test_generate_proof_and_verify_proof() {
  417. let mut mt: MerkleTree = new(140);
  418. let val = TestValue {
  419. bytes: "this is a test leaf".as_bytes().to_vec(),
  420. index_length: 15,
  421. };
  422. assert_eq!("0000000000000000000000000000000000000000000000000000000000000000", mt.root.to_hex());
  423. mt.add(&val);
  424. let (_t, _il, b) = mt.sto.get(&val.ht());
  425. assert_eq!(*val.bytes(), b);
  426. assert_eq!("b4fdf8a653198f0e179ccb3af7e4fc09d76247f479d6cfc95cd92d6fda589f27", mt.root.to_hex());
  427. let val2 = TestValue {
  428. bytes: "this is a second test leaf".as_bytes().to_vec(),
  429. index_length: 15,
  430. };
  431. mt.add(&val2);
  432. let (_t, _il, b) = mt.sto.get(&val2.ht());
  433. assert_eq!(*val2.bytes(), b);
  434. assert_eq!("8ac95e9c8a6fbd40bb21de7895ee35f9c8f30ca029dbb0972c02344f49462e82", mt.root.to_hex());
  435. let mp = mt.generate_proof(val2.hi());
  436. assert_eq!("0000000000000000000000000000000000000000000000000000000000000001fd8e1a60cdb23c0c7b2cf8462c99fafd905054dccb0ed75e7c8a7d6806749b6b", mp.to_hex());
  437. // verify
  438. let v = verify_proof(mt.root, mp, val2.hi(), val2.ht(), mt.num_levels);
  439. assert_eq!(true, v);
  440. }
  441. #[test]
  442. fn test_generate_proof_empty_leaf_and_verify_proof() {
  443. let mut mt: MerkleTree = new(140);
  444. let val = TestValue {
  445. bytes: "this is a test leaf".as_bytes().to_vec(),
  446. index_length: 15,
  447. };
  448. mt.add(&val);
  449. let val2 = TestValue {
  450. bytes: "this is a second test leaf".as_bytes().to_vec(),
  451. index_length: 15,
  452. };
  453. mt.add(&val2);
  454. assert_eq!("8ac95e9c8a6fbd40bb21de7895ee35f9c8f30ca029dbb0972c02344f49462e82", mt.root.to_hex());
  455. // proof of empty leaf
  456. let val3 = TestValue {
  457. bytes: "this is a third test leaf".as_bytes().to_vec(),
  458. index_length: 15,
  459. };
  460. let mp = mt.generate_proof(val3.hi());
  461. assert_eq!("000000000000000000000000000000000000000000000000000000000000000389741fa23da77c259781ad8f4331a5a7d793eef1db7e5200ddfc8e5f5ca7ce2bfd8e1a60cdb23c0c7b2cf8462c99fafd905054dccb0ed75e7c8a7d6806749b6b", mp.to_hex());
  462. // verify that is a proof of an empty leaf (EMPTYNODEVALUE)
  463. let v = verify_proof(mt.root, mp, val3.hi(), EMPTYNODEVALUE, mt.num_levels);
  464. assert_eq!(true, v);
  465. }
  466. #[test]
  467. fn test_harcoded_proofs_of_existing_leaf() {
  468. // check proof of value in leaf
  469. let mut root: [u8;32] = [0;32];
  470. root.copy_from_slice(&hex::decode("7d7c5e8f4b3bf434f3d9d223359c4415e2764dd38de2e025fbf986e976a7ed3d").unwrap());
  471. let mp = hex::decode("0000000000000000000000000000000000000000000000000000000000000002d45aada6eec346222eaa6b5d3a9260e08c9b62fcf63c72bc05df284de07e6a52").unwrap();
  472. let mut hi: [u8;32] = [0;32];
  473. hi.copy_from_slice(&hex::decode("786677808ba77bdd9090a969f1ef2cbd1ac5aecd9e654f340500159219106878").unwrap());
  474. let mut ht: [u8;32] = [0;32];
  475. ht.copy_from_slice(&hex::decode("786677808ba77bdd9090a969f1ef2cbd1ac5aecd9e654f340500159219106878").unwrap());
  476. let v = verify_proof(root, mp, hi, ht, 140);
  477. assert_eq!(true, v);
  478. }
  479. #[test]
  480. fn test_harcoded_proofs_of_empty_leaf() {
  481. // check proof of value in leaf
  482. let mut root: [u8;32] = [0;32];
  483. root.copy_from_slice(&hex::decode("8f021d00c39dcd768974ddfe0d21f5d13f7215bea28db1f1cb29842b111332e7").unwrap());
  484. let mp = hex::decode("0000000000000000000000000000000000000000000000000000000000000004bf8e980d2ed328ae97f65c30c25520aeb53ff837579e392ea1464934c7c1feb9").unwrap();
  485. let mut hi: [u8;32] = [0;32];
  486. hi.copy_from_slice(&hex::decode("a69792a4cff51f40b7a1f7ae596c6ded4aba241646a47538898f17f2a8dff647").unwrap());
  487. let v = verify_proof(root, mp, hi, EMPTYNODEVALUE, 140);
  488. assert_eq!(true, v);
  489. }
  490. #[test]
  491. fn test_add_leafs_different_order() {
  492. let mut mt1: MerkleTree = new(140);
  493. mt1.add(&TestValue {bytes: "0 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  494. mt1.add(&TestValue {bytes: "1 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  495. mt1.add(&TestValue {bytes: "2 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  496. mt1.add(&TestValue {bytes: "3 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  497. mt1.add(&TestValue {bytes: "4 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  498. mt1.add(&TestValue {bytes: "5 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  499. mt1.print_full_tree();
  500. let mut mt2: MerkleTree = new(140);
  501. mt2.add(&TestValue {bytes: "2 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  502. mt2.add(&TestValue {bytes: "1 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  503. mt2.add(&TestValue {bytes: "0 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  504. mt2.add(&TestValue {bytes: "5 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  505. mt2.add(&TestValue {bytes: "3 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  506. mt2.add(&TestValue {bytes: "4 this is a test leaf".as_bytes().to_vec(), index_length: 15,});
  507. mt2.print_full_tree();
  508. assert_eq!(mt1.root, mt2.root);
  509. assert_eq!(mt1.root.to_hex(), "264397f84da141b3134dcde1d7540d27a2bf0d787bbe8365d9ad5c9c18d3c621");
  510. }
  511. #[test]
  512. fn test_add_1000_leafs() {
  513. let mut mt: MerkleTree = new(140);
  514. for i in 0..1000 {
  515. mt.add(&TestValue {bytes: (i.to_string()+" this is a test leaf").as_bytes().to_vec(), index_length: 15,});
  516. }
  517. assert_eq!(mt.root.to_hex(), "6e2da580b2920cd78ed8d4e4bf41e209dfc99ef28bc19560042f0ac803e0d6f7");
  518. }
  519. }