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());
            }
        }
        public MerkleProofElement BuildFromBinaryTreeInternal(BinaryTreeElement currentElement, MerkleHashCalculator calculator)
        {
            if (currentElement is EmptyLeaf)
            {
                return(new ProofHashedLeaf(new byte[32]));
            }
            else if (currentElement is Leaf)
            {
                var leafElement = (Leaf)currentElement;
                var pathElem    = currentElement.PathElem;
                if (!(pathElem is null))
                {
                    if (pathElem is PathLeafElement)
                    {
                        return(new ProofValueLeaf(leafElement.Content, pathElem.Previous));
                    }
                    else
                    {
                        throw new System.Exception("The path and structure don't match. We are at a leaf, but path elem is not a leaf: " + pathElem);
                    }
                }
                else
                {
                    var hash = calculator.CalculateLeafHash(leafElement.Content);

                    return(new ProofHashedLeaf(hash));
                }
            }