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());
            }
        }
Exemple #2
0
        public MerkleHashSummary CalculateMerkleRoot(object value, MerkleHashCalculator calculator)
        {
            var binaryTree = this.TreeFactory.Build(value);
            var proofTree  = this.ProofFactory.BuildFromBinaryTree(binaryTree, calculator);

            return(this.CalculateMerkleRootOfTree(proofTree, calculator));
        }
 public static byte[] MerkleHash(object value, MerkleHashCalculator calculator)
 {
     return(MerkleHashSummary(value, calculator).MerkleHash);
 }
        public static MerkleProofTree GenerateProof(object value, PathSet pathSet, MerkleHashCalculator calculator)
        {
            var binaryTree = treeFactory.BuildWithPath(value, pathSet);

            return(proofFactory.BuildFromBinaryTree(binaryTree, calculator));
        }
        private static MerkleHashSummary MerkleProofHashSummary(MerkleProofTree tree, MerkleHashCalculator calculator)
        {
            var summaryFactory = new MerkleHashSummaryFactory(treeFactory, proofFactory);

            return(summaryFactory.CalculateMerkleTreeRoot(tree, calculator));
        }
        public static MerkleHashSummary MerkleHashSummary(object value, MerkleHashCalculator calculator)
        {
            var summaryFactory = new MerkleHashSummaryFactory(treeFactory, proofFactory);

            return(summaryFactory.CalculateMerkleRoot(value, calculator));
        }
 public static byte[] MerkleTreeHash(MerkleProofTree tree, MerkleHashCalculator calculator)
 {
     return(MerkleProofHashSummary(tree, calculator).MerkleHash);
 }
Exemple #8
0
        public MerkleProofTree BuildProofTree(object value, MerkleHashCalculator calculator)
        {
            var root = this.TreeFactory.Build(value);

            return(this.ProofFactory.BuildFromBinaryTree(root, calculator));
        }
Exemple #9
0
        public MerkleHashSummary CalculateMerkleRootOfTree(MerkleProofTree proofTree, MerkleHashCalculator calculator)
        {
            var calculatedSummary = this.CalculateMerkleRootInternal(proofTree.Root, calculator);

            return(new MerkleHashSummary(calculatedSummary));
        }
Exemple #10
0
 public MerkleHashSummary CalculateMerkleTreeRoot(MerkleProofTree tree, MerkleHashCalculator calculator)
 {
     return(this.CalculateMerkleRootOfTree(tree, calculator));
 }
        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));
                }
            }
        public MerkleProofTree BuildFromBinaryTree(BinaryTree originalTree, MerkleHashCalculator calculator)
        {
            var rootElem = this.BuildFromBinaryTreeInternal(originalTree.Root, calculator);

            return(new MerkleProofTree(rootElem));
        }