public void AuditTest2(int leafCount) { MerkleHash hash = null; var tree = new MerkleAppendTree.MerkleTree(); for (int i = 0; i < leafCount; i++) { hash = MerkleHash.Create(i.ToString()); tree.AppendLeaf(hash); } MerkleHash rootHash = tree.RootNode.Hash; foreach (var leaf in tree.RootNode.Leaves()) { Output.WriteLine(leaf.ToString()); } List <MerkleProofHash> auditTrail = tree.AuditProof(hash); Output.WriteLine("Audit Trail:"); foreach (var h in auditTrail) { Output.WriteLine(h.ToString()); } Assert.True(MerkleTree.VerifyAudit(rootHash, hash, auditTrail)); }
public void SetRightNode(MerkleNode node) { MerkleTree.Contract(() => node.Hash != null, "Node hash must be initialized."); RightNode = node; RightNode.Parent = this; // Can't compute hash if the left node isn't set yet. if (LeftNode != null) { ComputeHash(); } }
/// <summary> /// Verifies the hash for this node against the computed hash for our child nodes. /// If we don't have any children, the return is always true because we have nothing to verify against. /// </summary> public bool VerifyHash() { if (LeftNode == null && RightNode == null) { return(true); } if (RightNode == null) { return(Hash.Equals(LeftNode.Hash)); } MerkleTree.Contract(() => LeftNode != null, "Left branch must be a node if right branch is a node."); MerkleHash leftRightHash = MerkleHash.Create(LeftNode.Hash, RightNode.Hash); return(Hash.Equals(leftRightHash)); }
public void CompareCliftonMerkleToAppendMerkle_Test(int leafCount) { var cliftonTree = new Clifton.Blockchain.MerkleTree(); for (int i = 0; i < leafCount; i++) { var newLeafNode = new Clifton.Blockchain.MerkleNode(Clifton.Blockchain.MerkleHash.Create(i.ToString())); cliftonTree.AppendLeaf(newLeafNode); } cliftonTree.BuildTree(); var appendTree = new MerkleAppendTree.MerkleTree(); for (int i = 0; i < leafCount; i++) { var newLeafNode = new MerkleAppendTree.MerkleNode(MerkleAppendTree.MerkleHash.Create(i.ToString())); appendTree.AppendLeaf(newLeafNode); } Assert.Equal(cliftonTree.RootNode.Hash.ToString(), appendTree.RootNode.Hash.ToString()); }
public void SetHash(byte[] hash) { MerkleTree.Contract(() => hash.Length == Constants.HASH_LENGTH, "Unexpected hash length."); Value = hash; }
public override bool Equals(object obj) { MerkleTree.Contract(() => obj is MerkleHash, "rvalue is not a MerkleHash"); return(Equals((MerkleHash)obj)); }