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()
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