protected virtual MerkleNode CreateNode(MerkleNode left, MerkleNode right) { return(new MerkleNode(left, right)); }
protected void BuildAuditTrail(List <MerkleProofHash> auditTrail, MerkleNode parent, MerkleNode child) { if (parent != null) { Contract(() => child.Parent == parent, "Parent of child is not expected parent."); var nextChild = parent.LeftNode == child ? parent.RightNode : parent.LeftNode; var direction = parent.LeftNode == child ? MerkleProofHash.Branch.Left : MerkleProofHash.Branch.Right; // For the last leaf, the right node may not exist. In that case, we ignore it because it's // the hash we are given to verify. if (nextChild != null) { auditTrail.Add(new MerkleProofHash(nextChild.Hash, direction)); } BuildAuditTrail(auditTrail, child.Parent.Parent, child.Parent); } }