Exemple #1
0
        public byte[] CalculateMerkleRootInternal(MerkleProofElement currentElement, MerkleHashCalculator calculator)
        {
            if (currentElement is ProofHashedLeaf)
            {
                var leafElement = (ProofHashedLeaf)currentElement;
                return(leafElement.MerkleHash);
            }
            else if (currentElement is ProofValueLeaf)
            {
                var valueElement = (ProofValueLeaf)currentElement;
                var value        = valueElement.Content;
                if (calculator.IsContainerProofValueLeaf(value))
                {
                    var merkleProofTree = this.BuildProofTree(value, calculator);
                    return(this.CalculateMerkleRootInternal(merkleProofTree.Root, calculator));
                }
                else
                {
                    return(calculator.CalculateLeafHash(value));
                }
            }
            else if (currentElement is ProofNode)
            {
                var proofElement = (ProofNode)currentElement;
                var left         = this.CalculateMerkleRootInternal(proofElement.Left, calculator);
                var right        = this.CalculateMerkleRootInternal(proofElement.Right, calculator);

                return(calculator.CalculateNodeHash(proofElement.Prefix, left, right));
            }
            else
            {
                throw new System.Exception("Should have handled this type? " + currentElement.GetType());
            }
        }