public void ConsistencyTest() { // Start with a tree with 2 leaves: MerkleTree tree = new MerkleTree(); var startingNodes = tree.Append(new MerkleHash[] { new MerkleHash("1"), new MerkleHash("2"), }); // startingNodes.ForEachWithIndex((n, i) => n.Text = i.ToString()); MerkleHash firstRoot = tree.BuildTree(); List <MerkleHash> oldRoots = new List <MerkleHash>() { firstRoot }; // Add a new leaf and verify that each time we add a leaf, we can get a consistency check // for all the previous leaves. for (int i = 2; i < 100; i++) { tree.Append(new MerkleHash(i.ToString())); //.Text=i.ToString(); tree.BuildTree(); // After adding a leaf, verify that all the old root hashes exist. oldRoots.ForEach((oldRootHash, n) => { List <MerkleProofHash> proof = tree.ConsistencyProof(n + 2); MerkleHash hash, lhash, rhash; if (proof.Count > 1) { lhash = proof[proof.Count - 2].Hash; int hidx = proof.Count - 1; hash = rhash = MerkleTree.ComputeHash(lhash, proof[hidx].Hash); hidx -= 2; while (hidx >= 0) { lhash = proof[hidx].Hash; hash = rhash = MerkleTree.ComputeHash(lhash, rhash); --hidx; } } else { hash = proof[0].Hash; } (hash == oldRootHash).Should().BeTrue("Old root hash not found for index " + i + " m = " + (n + 2).ToString()); }); // Then we add this root hash as the next old root hash to check. oldRoots.Add(tree.RootNode !.Hash); } }
public void CreateUnbalancedTreeTest() { MerkleTree tree = new MerkleTree(); tree.Append(new MerkleHash("abc")); tree.Append(new MerkleHash("def")); tree.Append(new MerkleHash("123")); tree.BuildTree(); tree.RootNode.Should().NotBeNull(); }
public void AuditTest() { // Build a tree, and given the root node and a leaf hash, verify that the we can reconstruct the root hash. MerkleTree tree = new MerkleTree(); MerkleHash l1 = new MerkleHash("abc"); MerkleHash l2 = new MerkleHash("def"); MerkleHash l3 = new MerkleHash("123"); MerkleHash l4 = new MerkleHash("456"); tree.Append(new MerkleHash[] { l1, l2, l3, l4 }); MerkleHash rootHash = tree.BuildTree(); List <MerkleProofHash> auditTrail = tree.AuditProof(l1); MerkleTree.VerifyAudit(rootHash, l1, auditTrail).Should().BeTrue(); auditTrail = tree.AuditProof(l2); MerkleTree.VerifyAudit(rootHash, l2, auditTrail).Should().BeTrue(); auditTrail = tree.AuditProof(l3); MerkleTree.VerifyAudit(rootHash, l3, auditTrail).Should().BeTrue(); auditTrail = tree.AuditProof(l4); MerkleTree.VerifyAudit(rootHash, l4, auditTrail).Should().BeTrue(); }
public void FixingOddNumberOfLeavesManuallyTest() { MerkleTree tree = new MerkleTree(); MerkleHash l1 = new MerkleHash("abc"); MerkleHash l2 = new MerkleHash("def"); MerkleHash l3 = new MerkleHash("123"); tree.Append(new MerkleHash[] { l1, l2, l3 }); MerkleHash rootHash = tree.BuildTree(); tree.FixOddNumberLeaves(); MerkleHash rootHashAfterFix = tree.BuildTree(); (rootHash != rootHashAfterFix).Should().BeTrue(); }
public void AddTreeTest() { MerkleTree tree = new MerkleTree(); MerkleHash l1 = new MerkleHash("abc"); MerkleHash l2 = new MerkleHash("def"); MerkleHash l3 = new MerkleHash("123"); tree.Append(new MerkleHash[] { l1, l2, l3 }); MerkleHash rootHash = tree.BuildTree(); MerkleTree tree2 = new MerkleTree(); MerkleHash l5 = new MerkleHash("456"); MerkleHash l6 = new MerkleHash("xyzzy"); MerkleHash l7 = new MerkleHash("fizbin"); MerkleHash l8 = new MerkleHash("foobar"); tree2.Append(new MerkleHash[] { l5, l6, l7, l8 }); MerkleHash tree2RootHash = tree2.BuildTree(); MerkleHash rootHashAfterAddTree = tree.AddTree(tree2); (rootHash != rootHashAfterAddTree).Should().BeTrue(); }