Exemple #1
0
    def addOneBlock(self, data):
        if len(self.lstLeaves) == 0:
            raise MerkleError(
                'The tree has not been created and new block cannot be added to the null tree.'
            )
        elif len(self.lstLeaves) == 1:
            tmpRoot = TreeNode(nodeSide='Root')
            newLeafNode = TreeNode(data=data, parentNode=tmpRoot, nodeSide='R')
            self.lstLeaves.append([newLeafNode])
            self.lstDataBlocks.append([data])
            self.root.parentNode = tmpRoot
            self.root.nodeSide = 'L'

            tmpRoot.leftChild = self.root
            tmpRoot.rightChild = newLeafNode
            tmpRoot.setData(self.root.data + newLeafNode.data)

            self.root = self.root.parentNode
        else:
            lastLayerIndex = len(self.lstLeaves) - 1
            llFirstLeaf = self.lstLeaves[lastLayerIndex][0]
            bllFirstLeaf = self.lstLeaves[lastLayerIndex - 1][0]

            commonParent = self._getCommonParent(llFirstLeaf, bllFirstLeaf)

            newLeafNode = TreeNode(data=data, nodeSide='R')
            tmpNode = TreeNode(parentNode=commonParent,
                               leftChild=commonParent.rightChild,
                               rightChild=newLeafNode,
                               nodeSide='R')

            commonParent.rightChild.nodeSide = 'L'
            commonParent.rightChild = tmpNode

            tmpNode.leftChild.parentNode = tmpNode
            tmpNode.rightChild.parentNode = tmpNode

            self.lstLeaves.append([newLeafNode])
            self.lstDataBlocks.append([data])

            while tmpNode != None:
                tmpNode.setData(tmpNode.leftChild.data +
                                tmpNode.rightChild.data)
                tmpNode = tmpNode.parentNode

        self.combineSimilarSubTrees()
Exemple #2
0
    def createTree(self, dataBlocks=[], setAsMainTree=False):
        if setAsMainTree:
            if self.root != None:
                del self.root
                del self.lstDataBlocks
                del self.lstLeaves
                self.lstLeaves = []
                self.lstDataBlocks = []

        thisRoot = None
        self.dbCounter = 0
        self.counter = 0
        dbCount = len(dataBlocks)
        subTreesHeight = []
        leafsCount = []
        # Calculating sub trees information
        while dbCount > 0:
            subTreesHeight.append(int(math.log2(dbCount)) + 1)
            leafCount = 2**int(math.log2(dbCount))
            leafsCount.append(leafCount)
            dbCount -= leafCount

        # Generating subtrees of merkle tree
        roots = []
        for s in subTreesHeight:
            tNode = TreeNode(nodeSide='Root')
            roots.append(tNode)
            self.tmpSubTreelstLeaves = []
            self.tmpSubTreelstDataBlock = []
            if s > 1:
                self.__makeSubTree(roots[len(roots) - 1], 1, s - 1, dataBlocks)
                self.lstLeaves.append(self.tmpSubTreelstLeaves)
                self.lstDataBlocks.append(self.tmpSubTreelstDataBlock)
            else:
                self.tmpSubTreelstLeaves.append(tNode)
                self.tmpSubTreelstDataBlock.append(dataBlocks[self.dbCounter])
                tNode.setData(dataBlocks[self.dbCounter])
                self.dbCounter += 1
                self.lstLeaves.append(self.tmpSubTreelstLeaves)
                self.lstDataBlocks.append(self.tmpSubTreelstDataBlock)

        # joining subtrees to make main merkle tree
        if len(roots) > 0:
            lastRootIndex = len(roots) - 1
            thisRoot = roots[lastRootIndex]
            i = lastRootIndex - 1
            while i >= 0:
                tNode = TreeNode(data=roots[i].data + thisRoot.data,
                                 nodeSide='Root')
                thisRoot.parentNode = tNode
                roots[i].parentNode = tNode

                tNode.leftChild = roots[i]
                tNode.rightChild = thisRoot

                roots[i].nodeSide = 'L'
                thisRoot.nodeSide = 'R'

                thisRoot = tNode
                i -= 1
        if setAsMainTree:
            self.root = thisRoot
        return thisRoot