示例#1
0
    def __dataHandle(self, data):
        if data['No'] == 1:
            #            logcontent = 'Handle a random number:' + str(data['content']['genrandom'])
            #            self.logger.info(logcontent)
            #            if str(data['content']['genrandom']) not in glovar.RanList:
            glovar.newRanLock.acquire()
            glovar.NewRanList.append(str(data['content']['genrandom']))
            glovar.newRanLock.release()

            broadMessage(data)

#                logcontent = ' Broad this committee random number again: ' + str(data['genrandom'])
#                self.logger.info(logcontent)
# Receive a hashseed
        if data['No'] == 2:
            #            logcontent = ' Receive a hashvalue:' + str(data['content']['ranhash'])
            #            self.logger.info(logcontent)

            #            if data['ranhash'] not in glovar.HashList:
            glovar.newHashLock.acquire()
            glovar.NewHashList.append(data['content']['ranhash'])
            glovar.newHashLock.release()

            if (glovar.NewHashSeed == 0
                    or data['content']['ranhash'] < glovar.NewHashSeed):
                glovar.newHashLock.acquire()
                glovar.NewHashSeed = data['content']['ranhash']
                glovar.newHashLock.release()
                broadMessage(data)
示例#2
0
文件: blockgen.py 项目: louis0121/pos
    def broadFirstCommitBlock(self):

        for each in glovar.ComList:
            if self.cominfo[1] == each[1]:
                if len(each[3]['newblock']):
                    content = {'block':each[3]['newblock'][0],'incomno':each[0],\
                        'comid':each[1],'commitnum':each[3]['commit'],\
                        'comlist':each[3]['commitlist']}
                else:
                    return

                beforesend = {
                    'type': 'firstblock',
                    'No': 3,
                    'content': content
                }
                temp = str(beforesend)
                hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
                senddata = {
                    'messageid': hashvalue,
                    'type': 'firstblock',
                    'No': 3,
                    'content': content
                }

        for each in glovar.ComList:
            if each[0] == self.cominfo[0] and each[1] != self.cominfo[1]:
                each[5].acquire()
                each[4].put(senddata)
                each[5].release()
            if each[0] == glovar.Firstcomno + 1:
                each[5].acquire()
                each[4].put(senddata)
                each[5].release()

        glovar.messageLock.acquire()
        glovar.MessageList.append(hashvalue)
        glovar.messageLock.release()
        broadMessage(senddata)
        logcontent = 'Broad a commit firstblock:' + \
        str(senddata['content']['block'][4])
        self.logger.info(logcontent)
示例#3
0
文件: verify.py 项目: louis0121/pos
    def broadSecondCommitBlock(self):

        for each in glovar.ComList:
            if each[1] == self.cominfo[1]:
                content = {'block':each[3]['newsecondblock'][0],'incomno':self.cominfo[0],'comid':self.cominfo[1],'commitnum':each[3]['secondcommit'],'comlist':each[3]['secondcommitlist']}
                beforesend = {'type':'secondblock','No':3,'content':content}
                temp = str(beforesend)
                hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
                senddata = {'messageid':hashvalue,'type':'secondblock','No':3,'content':content}

        for each in glovar.ComList:
            if each[1] != self.cominfo[1]:
                each[5].acquire()
                each[4].put(senddata)
                each[5].release()

        glovar.messageLock.acquire()
        glovar.MessageList.append(hashvalue)
        glovar.messageLock.release()
        broadMessage(senddata)
        logcontent = 'Broad a second commit block:' + str(senddata['content']['block'][1])
        self.logger.info(logcontent)
示例#4
0
    def com_formation(self):
        # initial global status
        glovar.newComLock.acquire()
        glovar.NewComList.clear()
        glovar.newComLock.release()
        glovar.newRanLock.acquire()
        glovar.NewRanList.clear()
        glovar.newRanLock.release()
        glovar.newHashLock.acquire()
        glovar.NewHashList.clear()
        glovar.NewHashSeed = 0
        glovar.newHashLock.release()
        glovar.NewPosList.clear()

        self.logger.info('--------------------------------------------------')
        # Start committee formation
        random.seed()
        genrandom = random.uniform(0, 1)
        logcontent = 'Send a random number: ' + str(genrandom)
        self.logger.info(logcontent)
        glovar.newRanLock.acquire()
        glovar.NewRanList.append(str(genrandom))
        glovar.newRanLock.release()

        timestamp = time.time()
        content = {'genrandom': genrandom}
        beforesend = {
            'type': 'newcommittee',
            'No': 1,
            'timestamp': timestamp,
            'content': content
        }
        temp = str(beforesend)
        hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
        senddata = {
            'messageid': hashvalue,
            'type': 'newcommittee',
            'No': 1,
            'timestamp': timestamp,
            'content': content
        }

        glovar.messageLock.acquire()
        glovar.MessageList.append(hashvalue)
        glovar.messageLock.release()
        broadMessage(senddata)

        # Wait one or two RANBROAD_TIME duration for generating hashvalue
        starttime = int(time.time())
        curtime = starttime
        while curtime < starttime + RANBROAD_TIME:
            try:
                glovar.newComqueueLock.acquire()
                data = glovar.newcomqueue.get_nowait()
                glovar.newComqueueLock.release()
                #                logcontent = 'Get a message:' + str(data['messageid'])
                #                self.logger.info(logcontent)
                self.__dataHandle(data)
            except queue.Empty:
                glovar.newComqueueLock.release()
                time.sleep(0.1)
            finally:
                curtime = int(time.time())

        logcontent = 'Received new committee random numbers: ' + str(
            len(glovar.NewRanList))
        self.logger.info(logcontent)
        self.logger.info(glovar.NewRanList)

        #        self.logger.info('Generate hash value of random numbers.')
        glovar.newRanLock.acquire()
        randomstring = "".join(glovar.NewRanList)
        glovar.newRanLock.release()

        hashvalue = int(
            hashlib.sha256(randomstring.encode('utf-8')).hexdigest(), 16)
        glovar.newHashLock.acquire()
        glovar.NewHashSeed = hashvalue
        glovar.NewHashList.append(hashvalue)
        glovar.newHashLock.release()

        content = {'ranhash': hashvalue, 'ranlist': glovar.NewRanList}
        beforesend = {'type': 'newcommittee', 'No': 2, 'content': content}
        temp = str(beforesend)
        hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
        senddata = {
            'messageid': hashvalue,
            'type': 'newcommittee',
            'No': 2,
            'content': content
        }

        glovar.messageLock.acquire()
        glovar.MessageList.append(hashvalue)
        glovar.messageLock.release()
        broadMessage(senddata)

        # Wait one or two RANBROAD_TIME duration for agree on the smallest hashvalue
        starttime = int(time.time())
        curtime = starttime
        while curtime < starttime + RANBROAD_TIME:
            try:
                data = glovar.newcomqueue.get_nowait()
                #                logcontent = 'Get a message:' + str(data['messageid'])
                #                self.logger.info(logcontent)
                self.__dataHandle(data)
            except queue.Empty:
                time.sleep(0.1)
            finally:
                curtime = int(time.time())

        logcontent = 'Received new committee hashvalue list numbers: ' + str(
            len(glovar.NewHashList))
        self.logger.info(logcontent)
        #        self.logger.info(glovar.HashList)
        logcontent = 'The final new committee HashSeed is:\n' + str(
            glovar.NewHashSeed)
        self.logger.info(logcontent)

        # Generate random number to choose members for each committee
        nodenum = glovar.Firstcommem * glovar.Firstcomno + glovar.Secondcommem
        comnum = glovar.Firstcomno + 1
        random.seed(glovar.NewHashSeed)
        for i in range(nodenum):
            glovar.NewPosList.append(random.uniform(0, glovar.Stakesum))

        logcontent = 'NewPosList:' + str(len(glovar.NewPosList)) + '\n' + str(
            glovar.NewPosList)
        self.logger.info(logcontent)
        #        logcontent = 'NodeId: ' + str(glovar.NodeId)
        #        self.logger.info(logcontent)
        #        logcontent = 'Stakemin: ' + str(glovar.Stakemin)
        #        self.logger.info(logcontent)
        #        logcontent = 'Stakemax: ' + str(glovar.Stakemax)
        #        self.logger.info(logcontent)
        #        logcontent = 'Firstcommem: ' + str(glovar.Firstcommem)
        #        self.logger.info(logcontent)
        #        logcontent = 'Firstcomno: ' + str(glovar.Firstcomno)
        #        self.logger.info(logcontent)
        #        logcontent = 'Secondcommem: ' + str(glovar.Secondcommem)
        #        self.logger.info(logcontent)

        # Record the status of committee
        for i in range(nodenum):
            if (glovar.NewPosList[i] > glovar.Stakemin
                    and glovar.NewPosList[i] <= glovar.Stakemax):
                incomno = i // glovar.Firstcommem + 1
                if (incomno < comnum):
                    commember = glovar.NewPosList[(incomno - 1) *
                                                  glovar.Firstcommem:incomno *
                                                  glovar.Firstcommem]
                else:
                    commember = glovar.NewPosList[(incomno - 1) *
                                                  glovar.Firstcommem:]

                newblock = []
                commitlist = []
                commitblocklist = []
                comstatus = {
                    'genblock': 0,
                    'blockhash': '0',
                    'stage': 0,
                    'commit': 0,
                    'commitlist': commitlist,
                    'newblock': newblock,
                    'verify': 0,
                    'commitblock': 0,
                    'commitblocklist': commitblocklist
                }
                comnodequeue = queue.Queue()
                cominfo = [
                    incomno, glovar.NewPosList[i], commember, comstatus,
                    comnodequeue
                ]
                glovar.NewComList.append(cominfo)

        self.logger.info('--------------------------------------------')
        if len(glovar.NewComList):
            logcontent = 'Next new committee nodes:\n'
            for each in glovar.NewComList:
                logcontent += str(each) + '\n'
            self.logger.info(logcontent)
示例#5
0
    def run(self):
        # Config the directory of log file
        filename = self.logdirectory + 'DelayMeasurelog.txt'
        self.logger = logging.getLogger('DelayMeasure')
        self.logger.setLevel(level=logging.INFO)
        handler = logging.FileHandler(filename)
        handler.setLevel(logging.INFO)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)
        self.logger.info('Start delay measurement process')
        firstdelayname = self.logdirectory + '/firstdelay.txt'
        seconddelayname = self.logdirectory + '/seconddelay.txt'

        time.sleep(INIWAIT_TIME + 2 * RANBROAD_TIME + 10)

        testtime = 10

        # for i in range(10):
        while True:
            self.firstconfirm = 0
            trans_input_no = 1
            trans_input_item = ['123']
            trans_input = [trans_input_no, trans_input_item]

            trans_output_no = 1
            trans_output_output1 = ['456', 1]
            trans_output_item = [trans_output_output1]
            trans_output = [trans_output_no, trans_output_item]

            timestamp = time.time()
            temptransaction = [trans_input, trans_output, timestamp]

            temp = str(temptransaction)
            hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
            newtransaction = [hashvalue, trans_input, trans_output, timestamp]

            glovar.TransactionList.append(newtransaction)
            senddata = {
                'messageid': hashvalue,
                'type': 'transaction',
                'No': 1,
                'content': newtransaction
            }
            glovar.messageLock.acquire()
            glovar.MessageList.append(hashvalue)
            glovar.messageLock.release()
            start_length = len(glovar.BLOCKCHAIN)
            start_time = time.time()
            # Start the firstblock confirmation process
            firstthread = threading.Thread(target=self.__firstCheck,
                                           args=(start_time, hashvalue,
                                                 firstdelayname))
            firstthread.start()
            broadMessage(senddata)

            end_time = start_time - 1

            notfind = True
            while notfind:
                cur_time = time.time()
                if len(glovar.BLOCKCHAIN) > start_length:
                    block = glovar.BLOCKCHAIN[start_length]
                    for each in block[7]:
                        if hashvalue == each[0]:
                            end_time = time.time()
                            notfind = False
                            break
                    start_length += 1
                    if notfind:
                        if int(cur_time) - int(start_time) > 60:
                            logcontent = "Transction:" + str(hashvalue) + \
                                " second comfirmation has surpassed 60 seconds."
                            self.logger.info(logcontent)
                            break

                else:
                    time.sleep(0.05)

            if not notfind:
                latency = end_time - start_time
                logcontent = "Transaction:" + str(
                    hashvalue) + " final latency:" + str(latency)
                self.logger.info(logcontent)

                ftps = open(seconddelayname, 'a')
                output = str(latency) + "\n"
                ftps.write(output)
                ftps.close()

            firstthread.join()
            self.logger.info("The second confirmation is finishied")
#            while not self.firstconfirm:
#                time.sleep(0.1)

        self.logger.info("Transaction delay measurement is over")
示例#6
0
文件: verify.py 项目: louis0121/pos
    def __dataHandle(self, data):
        if data['type'] == 'firstblock' and data['No'] == 3:
            # Verify whether it is commited by the committee member
            if (data['content']['commitnum'] >= glovar.Firstcommem//2+1):
#                logcontent = 'A valid commit firstblock:' + str(data['content']['block'][4])
#                self.logger.info(logcontent)

                for each in glovar.ComList:
                    if self.cominfo[1] == each[1]:
                        if data['content']['block'][4] not in each[3]['addfirstlist']:
                            each[3]['commitblocklist'].append(data['content']['block'][4])
                            each[3]['transactionlist'].extend(data['content']['block'][5])
#                        logcontent = 'Save a commit firstblock:' + str(data['content']['block'][4])
#                        self.logger.info(logcontent)

        if data['type'] == 'secondblock' and data['No'] == 1:
#            logcontent = 'Handle a secondblock:' + str(data['messageid'])
#            self.logger.info(logcontent)
            blockdata = data['content']

            # Verify if the node is in our committee
            if blockdata[3] in self.cominfo[2]:
                logcontent = 'Verify a secondblock:' + str(blockdata[1]) + ' from comid:' + str(blockdata[3])
                self.logger.info(logcontent)

                # Send a commitment message
                content = {'blockhash':blockdata[1],'incomno':self.cominfo[0],'comid':self.cominfo[1],'commit':1}
                beforesend = {'type':'secondblock','No':2,'content':content}
                temp = str(beforesend)
                hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
                senddata = {'messageid':hashvalue,'type':'secondblock','No':2,'content':content}

                glovar.messageLock.acquire()
                glovar.MessageList.append(hashvalue)
                glovar.messageLock.release()
                broadMessage(senddata)
                logcontent = 'Send a second commitment for block:' + str(senddata['content']['blockhash'])
                self.logger.info(logcontent)

                # Check if there is another PoS in the same committee
                for each in glovar.ComList:
                    if each[0] == self.cominfo[0] and each[1] != self.cominfo[1]:
                        each[5].acquire()
                        each[4].put(senddata)
                        each[5].release()

        if data['type'] == 'secondblock' and data['No'] == 2:
#            logcontent = 'Handle a second commitment:' + str(data['messageid'])
#            self.logger.info(logcontent)

            # Verify whether it is commited by the committee member
            if data['content']['comid'] in self.cominfo[2]:
                logcontent = 'Verify a second commitment for block:' + str(data['content']['blockhash']) + ' from comid:' + str(data['content']['comid'])
                self.logger.info(logcontent)

                for each in glovar.ComList:
                    if each[1] == self.cominfo[1]:
                        if each[3]['verify']:
                            if each[3]['secondblockhash'] == data['content']['blockhash']:
                                each[3]['secondcommit'] += 1
                                each[3]['secondcommitlist'].append(data['content']['comid'])
                                logcontent = 'Secondblock:' + str(each[3]['secondblockhash']) + ' receive a commit. Total:' + str(each[3]['secondcommit'])
                                self.logger.info(logcontent)

                        # Receive enough commitment
                            if (each[3]['secondcommit'] >= glovar.Secondcommem//2+1):
                                logcontent = 'Receive enough commitment for blocblock:' + str(each[3]['secondblockhash'])
                                self.logger.info(logcontent)
                                self.broadSecondCommitBlock()
                                self.addBlock(each[3]['newsecondblock'][0])

        if data['type'] == 'secondblock' and data['No'] == 3:
#            logcontent = 'Handle a commit secondblock:' + str(data['content']['block'][1])
#            self.logger.info(logcontent)

            # Verify if the firstblock has received enough commitment from its committee
            listisin = True
            for each in data['content']['comlist']:
                if each not in self.cominfo[2]:
                    listisin = False
                    break
            if listisin:
                logcontent = 'Verified the commit secondblock:' + str(data['content']['block'][1])
                self.logger.info(logcontent)

                for each in glovar.ComList:
                    if each[1] == self.cominfo[1]:
                        # Delate the blockhash has been included in the
                        # secondblock from commitblocklist
                        each[5].acquire()
#                        logcontent = "each[3]['commitblocklist']:" + str(each[3]['commitblocklist'])
#                        self.logger.info(logcontent)
#                        logcontent = "data['content']['block'][6]:" + str(data['content']['block'][6])
#                        self.logger.info(logcontent)
                        templist = []
                        for every in each[3]['commitblocklist']:
                            if every not in data['content']['block'][6]:
                                templist.append(every)

                        each[3]['commitblocklist'] = templist.copy()

                        temptranslist = []
                        for every in each[3]['transactionlist']:
                            if every not in data['content']['block'][7]:
                                temptranslist.append(every)

                        each[3]['transactionlist'] = temptranslist.copy()

                        each[3]['addfirstlist'].extend(data['content']['block'][6])
#                        logcontent = "each[3]['addfirstlist']:" + str(each[3]['addfirstlist'])
#                        self.logger.info(logcontent)
#                        logcontent = "each[3]['commitblocklist']:" + str(each[3]['commitblocklist'])
#                        self.logger.info(logcontent)
                        each[5].release()

                        self.addBlock(data['content']['block'])
示例#7
0
文件: verify.py 项目: louis0121/pos
    def __gendatablock(self):

#        stillin = True
        time.sleep(5)
        cur_time = int(time.time())
        prev_time = cur_time - ( cur_time % BLOCK_INTERVAL ) + BLOCK_INTERVAL
        while True:
            cur_time = int(time.time())
            if cur_time > prev_time:
                # Select a leader to generate block 
                self.logger.info('----------------------------------------')
#                logcontent = 'Choose a new leader to generate a secondblock'
#                self.logger.info(logcontent)

                randomstring = "".join(str(self.cominfo[2]))
                glovar.blockchainLock.acquire()
                if len(glovar.BLOCKCHAIN):
                    prevhash = glovar.BLOCKCHAIN[len(glovar.BLOCKCHAIN)-1][1]
                else:
                    prevhash = 0
                blockheight = len(glovar.BLOCKCHAIN) +1
                glovar.blockchainLock.release()
                randomstring += str(prevhash)

                logcontent = "randomstring:" + str(randomstring)
                self.logger.info(logcontent)
                idchoose = int(hashlib.sha256(randomstring.encode('utf-8')).hexdigest(), 16) % len(self.cominfo[2])

                logcontent = str(idchoose+1) + ' member: ' + \
                str(self.cominfo[2][idchoose]) + ' is chosen to generate a second block'
                self.logger.info(logcontent)

                # Self is selected
                if self.cominfo[1] == self.cominfo[2][idchoose]:
                    for each in glovar.ComList:
                        if self.cominfo[1] == each[1]:
                            each[5].acquire()
                            commitblocklist = each[3]['commitblocklist'].copy()
                            transactionlist = each[3]['transactionlist'].copy()
                            each[3]['commitblocklist'].clear()
                            each[3]['transactionlist'].clear()
                            each[3]['verify'] = 1
#                            logcontent = "each[3]['commitblocklist']:" + str(len(each[3]['commitblocklist']))
#                            self.logger.info(logcontent)
                            each[5].release()

                    timestamp = time.time()
                    temp = str(prevhash) + str(self.cominfo[0]) + str(self.cominfo[1]) + str(self.cominfo[2]) + str(timestamp) + str(commitblocklist) + str(len(transactionlist))
                    hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
                    newblock = [prevhash,hashvalue,self.cominfo[0],self.cominfo[1],self.cominfo[2],timestamp,commitblocklist,transactionlist, blockheight]

                    for each in glovar.ComList:
                        if self.cominfo[1] == each[1]:
                            each[5].acquire()
                            each[3]['secondblockhash'] = hashvalue
                            each[3]['newsecondblock'].append(newblock)
                            each[5].release()

                    senddata = {'messageid':hashvalue,'type':'secondblock','No':1,'content':newblock}
                    glovar.messageLock.acquire()
                    glovar.MessageList.append(hashvalue)
                    glovar.messageLock.release()
                    broadMessage(senddata)
                    self.logger.info('---------------------------------')
                    logcontent = str(self.cominfo[1]) + ' :broadcast a second block:' + str(hashvalue)
                    self.logger.info(logcontent)

                    # Send data to this PoS node process
                    for each in glovar.ComList:
                        if each[0] == self.cominfo[0] and each[1] != self.cominfo[1]:
                            each[5].acquire()
                            each[4].put(senddata)
                            each[5].release()

                prev_time += BLOCK_INTERVAL

            else:
                time.sleep(0.2)

            # Check if the PoS node is still in the verify committee
            if glovar.ComChange:
#                for each in glovar.ComList:
#                    if self.cominfo[1] == each[1]:
#                        each[6] = 0
#                        break
                break

        logcontent = "The secondblock generation pocess is ended"
        self.logger.info(logcontent)
示例#8
0
文件: blockgen.py 项目: louis0121/pos
    def addBlock(self, block):
        glovar.firstchainLock.acquire()
        if len(glovar.FIRSTBLOCKCHAIN):
            if glovar.FIRSTBLOCKCHAIN[len(glovar.FIRSTBLOCKCHAIN) -
                                      1][4] != block[4]:
                glovar.FIRSTBLOCKCHAIN.append(block)
#                logcontent = 'Add a firstblock to the chain'
#                self.logger.info(logcontent)
        else:
            glovar.FIRSTBLOCKCHAIN.append(block)
#            logcontent = 'Add a firstblock to the chain'
#            self.logger.info(logcontent)
        glovar.firstchainLock.release()

        # Change the status of committee member
        for each in glovar.ComList:
            if each[1] == self.cominfo[1]:
                #                each[5].acquire()
                each[3]['genblock'] = 0
                each[3]['blockhash'] = '0'
                each[3]['commit'] = 0
                each[3]['commitlist'].clear()
                each[3]['newblock'].clear()
#                each[5].release()

#        self.logger.info('----------------------------------------------')
#        logcontent = 'Choose a new leader to Generate a block'
#        self.logger.info(logcontent)

        incomno = self.cominfo[0]
        comid = self.cominfo[1]
        commember = self.cominfo[2]
        # Select a leader to generate block
        randomstring = "".join(str(self.cominfo[2])) + str(block[1]) + str(
            block[4])
        idchoose = int(
            hashlib.sha256(randomstring.encode('utf-8')).hexdigest(),
            16) % len(commember)

        logcontent = 'The ' + str(idchoose + 1) + ' member: ' + str(
            commember[idchoose]) + ' is chosen to generate a block'
        self.logger.info(logcontent)

        # Self is selected
        transactions = []
        if comid == commember[idchoose]:
            # Add transactions into the new block
            for each in glovar.ComList:
                if comid == each[1]:
                    # If the PoS node has received transactions
                    if len(each[3]['transactionlist']):
                        for every in each[3]['transactionlist']:
                            transactions.append(every)
                        each[3]['transactionlist'].clear()

                    # Create a new transaction to add
                    else:
                        trans_input_no = 1
                        trans_input_item = ['abc']
                        trans_input = [trans_input_no, trans_input_item]

                        trans_output_no = 1
                        trans_output_output1 = ['efg', 5]
                        trans_output_item = [trans_output_output1]
                        trans_output = [trans_output_no, trans_output_item]
                        timestamp = time.time()
                        temptransaction = [
                            trans_input, trans_output, timestamp
                        ]
                        temp = str(temptransaction)
                        hashvalue = hashlib.sha256(
                            temp.encode('utf-8')).hexdigest()
                        newtransaction = [
                            hashvalue, trans_input, trans_output, timestamp
                        ]
                        transactions.append(newtransaction)

            timestamp = time.time()
            temp = str(incomno) + str(comid) + str(commember) + str(
                timestamp) + str(transactions)
            hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
            newblock = [
                incomno, comid, commember, timestamp, hashvalue, transactions
            ]
            json_block = json.dumps(newblock)

            senddata = {
                'messageid': hashvalue,
                'type': 'firstblock',
                'No': 1,
                'content': json_block
            }
            glovar.messageLock.acquire()
            glovar.MessageList.append(hashvalue)
            glovar.messageLock.release()
            broadMessage(senddata)

            self.logger.info('---------------------------------')
            logcontent = str(incomno) + ' :broadcast a block:' + str(hashvalue)
            self.logger.info(logcontent)

            # Change the corresponding global status
            for each in glovar.ComList:
                if comid == each[1]:
                    glovar.ComlistLock.acquire()
                    each[3]['genblock'] = 1
                    each[3]['blockhash'] = hashvalue
                    each[3]['newblock'].append(newblock)
                    glovar.ComlistLock.release()
                    # Check if there is another PoS in the same committee
                    for every in glovar.ComList:
                        if (every[0] == incomno and every[1] != comid):
                            # Send data to this PoS node process
                            each[5].acquire()
                            every[4].put(senddata)
                            each[5].release()
示例#9
0
文件: blockgen.py 项目: louis0121/pos
    def run(self):
        filename = self.logdirectory + 'Blockgenlog.txt'
        self.logger = logging.getLogger(str(self.cominfo[1]))
        self.logger.setLevel(level=logging.INFO)
        handler = logging.FileHandler(filename)
        handler.setLevel(logging.INFO)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

        incomno = self.cominfo[0]
        comid = self.cominfo[1]
        commember = self.cominfo[2]
        logcontent = 'Start committee ' + str(incomno)
        self.logger.info(logcontent)

        # Select a leader to generate block
        randomstring = "".join(str(commember))
        idchoose = int(
            hashlib.sha256(randomstring.encode('utf-8')).hexdigest(),
            16) % len(commember)

        logcontent = 'The ' + str(idchoose + 1) + ' member: ' + str(
            commember[idchoose]) + ' is chosen to generate a block'
        self.logger.info(logcontent)

        # Self is selected
        transactions = []
        if comid == commember[idchoose]:
            # Add transactions into the new block
            for each in glovar.ComList:
                if comid == each[1]:
                    # If the PoS node has received transactions
                    if len(each[3]['transactionlist']):
                        for every in each[3]['transactionlist']:
                            transactions.append(every)
                        each[3]['transactionlist'].clear()

                    # Create a new transaction to add
                    else:
                        trans_input_no = 1
                        trans_input_item = ['abc']
                        trans_input = [trans_input_no, trans_input_item]

                        trans_output_no = 1
                        trans_output_output1 = ['efg', 5]
                        trans_output_item = [trans_output_output1]
                        trans_output = [trans_output_no, trans_output_item]
                        timestamp = time.time()
                        temptransaction = [
                            trans_input, trans_output, timestamp
                        ]
                        temp = str(temptransaction)
                        hashvalue = hashlib.sha256(
                            temp.encode('utf-8')).hexdigest()
                        newtransaction = [
                            hashvalue, trans_input, trans_output, timestamp
                        ]
                        transactions.append(newtransaction)

            timestamp = time.time()
            temp = str(incomno) + str(comid) + str(commember) + str(
                timestamp) + str(transactions)
            hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
            newblock = [
                incomno, comid, commember, timestamp, hashvalue, transactions
            ]
            json_block = json.dumps(newblock)

            senddata = {
                'messageid': hashvalue,
                'type': 'firstblock',
                'No': 1,
                'content': json_block
            }
            # Wait for other Pos node to start up receive process
            time.sleep(5)
            glovar.messageLock.acquire()
            glovar.MessageList.append(hashvalue)
            glovar.messageLock.release()
            broadMessage(senddata)

            self.logger.info('---------------------------------')
            logcontent = str(incomno) + ' :broadcast a block:' + str(hashvalue)
            self.logger.info(logcontent)

            # Change the corresponding global status
            for each in glovar.ComList:
                if comid == each[1]:
                    glovar.ComlistLock.acquire()
                    each[3]['genblock'] = 1
                    each[3]['blockhash'] = hashvalue
                    each[3]['stage'] = 1
                    each[3]['newblock'].append(newblock)
                    glovar.ComlistLock.release()
                    # Check if there is another PoS in the same committee
                    for every in glovar.ComList:
                        if (every[0] == incomno and every[1] != comid):
                            # Send data to this PoS node process
                            glovar.ComlistLock.acquire()
                            every[4].put(senddata)
                            glovar.ComlistLock.release()

        # Get message from its queue belong to this PoS node
        for each in glovar.ComList:
            if comid == each[1]:
                while True:
                    try:
                        data = each[4].get_nowait()
                        #                        logcontent = 'Get a data'
                        #                        self.logger.info(logcontent)
                        #broadMessage(data)
                        self.dataHandle(data)
                    except queue.Empty:
                        time.sleep(0.05)

                    # Check if the committee has changed
                    if glovar.ComChange:
                        each[6] = 0
                        break
        # End the process
        logcontent = 'The process is ended.'
        self.logger.info(logcontent)
示例#10
0
文件: blockgen.py 项目: louis0121/pos
    def dataHandle(self, data):
        if data['type'] == 'transaction':
            #            logcontent = "Handle a transaction:" + str(data['messageid'])
            #            self.logger.info(logcontent)

            for each in glovar.ComList:
                if self.cominfo[1] == each[1]:
                    each[3]['transactionlist'].append(data['content'])

        elif data['type'] == 'firstblock':
            # Verify whether it is commited by the committee member
            if data['No'] == 1:
                #            logcontent = 'Handle a firstblock:' + str(data['messageid'])
                #            self.logger.info(logcontent)
                blockdata = json.loads(data['content'])

                # Verify if the node is in our committee
                if blockdata[1] in self.cominfo[2]:
                    logcontent = 'Verify a firstblock:' + str(
                        blockdata[4]) + ' from comid:' + str(
                            blockdata[1]) + ' in committee:' + str(
                                self.cominfo[0])
                    self.logger.info(logcontent)

                    # Change the corresponding global status
                    for each in glovar.ComList:
                        if self.cominfo[1] == each[1]:
                            # glovar.ComlistLock.acquire()
                            each[3]['newblock'].append(blockdata)
                            # glovar.ComlistLock.release()

                    # Send a commitment message
                    content = {
                        'blockhash': blockdata[4],
                        'incomno': blockdata[0],
                        'comid': self.cominfo[1],
                        'commit': 1
                    }
                    beforesend = {
                        'type': 'firstblock',
                        'No': 2,
                        'content': content
                    }
                    temp = str(beforesend)
                    hashvalue = hashlib.sha256(
                        temp.encode('utf-8')).hexdigest()
                    senddata = {
                        'messageid': hashvalue,
                        'type': 'firstblock',
                        'No': 2,
                        'content': content
                    }

                    glovar.messageLock.acquire()
                    glovar.MessageList.append(hashvalue)
                    glovar.messageLock.release()
                    broadMessage(senddata)
                    logcontent = 'Send a commitment for block:' + str(
                        senddata['content']['blockhash'])
                    self.logger.info(logcontent)

                    # Check if there is another PoS in the same committee
                    for each in glovar.ComList:
                        if each[0] == self.cominfo[
                                0] and each[1] != self.cominfo[1]:
                            each[5].acquire()
                            each[4].put(senddata)
                            each[5].release()

            elif data['No'] == 2:
                #                logcontent = 'Handle a commitment:' + str(data['messageid'])
                #                self.logger.info(logcontent)

                # Verify whether it is commited by the committee member
                if data['content']['comid'] in self.cominfo[2]:
                    logcontent = 'Verify a commitment for block:' + str(
                        data['content']['blockhash']) + ' from comid:' + str(
                            data['content']['comid'])
                    self.logger.info(logcontent)

                    for each in glovar.ComList:
                        if each[1] == self.cominfo[1]:
                            if each[3]['genblock']:
                                if data['content']['blockhash'] == each[3][
                                        'blockhash']:
                                    each[3]['commit'] += 1
                                    each[3]['commitlist'].append(
                                        data['content']['comid'])
                                    logcontent = 'Block:' + str(
                                        each[3]['blockhash']
                                    ) + ' receive a commit. Total:' + str(
                                        each[3]['commit'])
                                    self.logger.info(logcontent)

                                    # Receive enough commitment
                                    if (each[3]['commit'] >=
                                            glovar.Firstcommem // 2 + 1):
                                        logcontent = 'Receive enough commitment for blocblock:' + str(
                                            each[3]['blockhash'])
                                        self.logger.info(logcontent)
                                        self.broadFirstCommitBlock()
                                        self.addBlock(each[3]['newblock'][0])

##                            logcontent = 'Run a new round to Generate a block'
##                            self.logger.info(logcontent)

            elif data['No'] == 3:
                #                logcontent = 'Handle a commit firstblock:' + str(data['content']['block'][4])
                #                self.logger.info(logcontent)

                # Verify the commit firstblock
                listisin = True
                for each in data['content']['comlist']:
                    if each not in self.cominfo[2]:
                        listisin = False
                        break
                if listisin:
                    logcontent = 'Verified the commit firstblock:' + str(
                        data['content']['block'][4])
                    self.logger.info(logcontent)

                    for each in glovar.ComList:
                        if each[1] == self.cominfo[1]:
                            if len(each[3]['transactionlist']):
                                each[5].acquire()
                                temptransactions = []
                                for every in each[3]['transactionlist']:
                                    if every not in data['content']['block'][
                                            5]:
                                        temptransactions.append(every)
                                each[3][
                                    'transactionlist'] = temptransactions.copy(
                                    )
                                each[5].release()

                            self.addBlock(data['content']['block'])

            else:
                logcontent = "Unkown data with data['type']:firstblock"
                self.logger.info(logcontent)

        # Receive a commit secondblock
        elif data['type'] == 'secondblock' and data['No'] == 3:
            logcontent = 'Handle a commit secondblock:'
            self.logger.info(logcontent)

            for each in glovar.ComList:
                if each[1] == self.cominfo[1]:
                    if len(each[3]['transactionlist']):
                        each[5].acquire()
                        temptransactions = []
                        for every in each[3]['transactionlist']:
                            if every not in data['content']['block'][7]:
                                temptransactions.append(every)
                        each[3]['transactionlist'] = temptransactions.copy()
                        each[5].release()

            glovar.blockchainLock.acquire()
            if len(glovar.BLOCKCHAIN):
                if glovar.BLOCKCHAIN[len(glovar.BLOCKCHAIN) -
                                     1][1] != data['content']['block'][1]:
                    glovar.BLOCKCHAIN.append(data['content']['block'])
                    logcontent = 'Add a secondblock to the chain'
                    self.logger.info(logcontent)
            else:
                glovar.BLOCKCHAIN.append(data['content']['block'])
                logcontent = 'Add a secondblock to the chain'
                self.logger.info(logcontent)
            glovar.blockchainLock.release()

        else:
            logcontent = 'Handle an unkown data:' + str(data)
            self.logger.info(logcontent)
示例#11
0
    def comformation(self):
#        glovar.ComList.clear()

        # Inform other PoS node process to stop
        glovar.ComChange = 1
        notend = True
        while notend:
            notend = False
            for each in glovar.ComList:
                if each[6]:
                    notend = True
                    break

            time.sleep(0.05)

        glovar.ComList.clear()

#        glovar.broadLock.acquire()
#        broadnum = glovar.broadqueue.qsize()
#        glovar.broadqueue.queue.clear()
#        broadnumafter = glovar.broadqueue.qsize()
#        glovar.broadLock.release()
#
#        logcontent = "broadqueue number:" + str(broadnum) + "  braodqueue number after:" + str(broadnumafter)
#        self.logger.info(logcontent)
#
#        # Clear messages generated by last committees
#        glovar.msgLock.acquire()
#        msgnum = glovar.msgqueue.qsize()
#        glovar.msgqueue.queue.clear()
#        msgnumafter = glovar.msgqueue.qsize()
#        glovar.msgLock.release()
#        logcontent = "message queue number:" + str(msgnum) + " message queue after number:" + str(msgnumafter)
#        self.logger.info(logcontent)

        # Send the last block
        if len(glovar.BLOCKCHAIN):
            newblock = glovar.BLOCKCHAIN[len(glovar.BLOCKCHAIN)-1]
            beforesend = {'type':'syncblock','No':1,'content':newblock}
            temp = str(beforesend)
            hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
            senddata = {'messageid':hashvalue,'type':'syncblock','No':1,'content':newblock}
            glovar.messageLock.acquire()
            glovar.MessageList.append(newblock[1])
            glovar.messageLock.release()
            broadMessage(senddata)
            logcontent = "Send a syncblock:" + str(newblock[8])
            self.logger.info(logcontent)

        time.sleep(RANBROAD_TIME)

        cur_time = int(time.time())
        prev_time = cur_time - (cur_time % CLEAR_TIME)
        while True:
            cur_time = int(time.time())
            if cur_time > prev_time + CLEAR_TIME:
                break
            else:
                time.sleep(0.5)

        glovar.ComChange = 0
        self.logger.info('--------------------------------------------------')
        # Start committee formation
        random.seed()
        genrandom = random.uniform(0,1)
        glovar.ranLock.acquire()
        glovar.RanList.append(str(genrandom))
        glovar.ranLock.release()
        # self.logger.info('put random number to RanList.')

        content = {'genrandom':genrandom}
        beforesend = {'type':'comrandom','No':1,'content':content}
        temp = str(beforesend)
        hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
        senddata = {'messageid':hashvalue,'type':'comrandom','No':1,'content':content}

        glovar.messageLock.acquire()
        glovar.MessageList.append(hashvalue)
        glovar.messageLock.release()

#        glovar.broadLock.acquire()
#        broadnum = glovar.broadqueue.qsize()
#        glovar.broadqueue.queue.clear()
#        broadnumafter = glovar.broadqueue.qsize()
#        glovar.broadLock.release()

        broadMessage(senddata)
        logcontent = 'Send a random number: ' + str(genrandom)
        self.logger.info(logcontent)

        # Wait one or two RANBROAD_TIME duration for generating hashvalue
        time.sleep(RANBROAD_TIME)

        logcontent = 'Received random numbers: ' + str(len(glovar.RanList))
        self.logger.info(logcontent)
#        self.logger.info(glovar.RanList)

#        self.logger.info('Generate hash value of random numbers.')
        glovar.ranLock.acquire()
        randomstring = "".join(glovar.RanList)
        glovar.ranLock.release()

        hashvalue = int(hashlib.sha256(randomstring.encode('utf-8')).hexdigest(), 16)
        glovar.hashLock.acquire()
        glovar.HashList.append(hashvalue)
        if ( glovar.HashSeed == 0 or hashvalue < glovar.HashSeed ):
            logcontent = "Replace HashSeed:\n" +str(glovar.HashSeed) + \
                        " with hashvalue:\n" + str(hashvalue)
            self.logger.info(logcontent)
            glovar.HashSeed = hashvalue
        glovar.hashLock.release()


        content = {'ranhash':hashvalue,'ranlist':glovar.RanList}
        beforesend = {'type':'comrandom','No':2,'content':content}
        temp = str(beforesend)
        hashvalue = hashlib.sha256(temp.encode('utf-8')).hexdigest()
        senddata = {'messageid':hashvalue,'type':'comrandom','No':2,'content':content}

        glovar.messageLock.acquire()
        glovar.MessageList.append(hashvalue)
        glovar.messageLock.release()
        broadMessage(senddata)

        # Wait one or two RANBROAD_TIME duration for agree on the smallest hashvalue
        time.sleep(RANBROAD_TIME)

        logcontent = 'Received hashvalue list numbers: ' + str(len(glovar.HashList))
        self.logger.info(logcontent)
#        self.logger.info(glovar.HashList)
        logcontent = 'The final HashSeed is:\n' + str(glovar.HashSeed)
        self.logger.info(logcontent)

        # Generate random number to choose members for each committee
        nodenum = glovar.Firstcommem * glovar.Firstcomno + glovar.Secondcommem
        comnum = glovar.Firstcomno + 1
        random.seed(glovar.HashSeed)
        for i in range(nodenum):
            glovar.PosList.append(random.uniform(0,glovar.Stakesum))

        logcontent = 'PosList:' + str(len(glovar.PosList)) + '\n' + str(glovar.PosList)
        self.logger.info(logcontent)
#        logcontent = 'NodeId: ' + str(glovar.NodeId)
#        self.logger.info(logcontent)
#        logcontent = 'Stakemin: ' + str(glovar.Stakemin)
#        self.logger.info(logcontent)
#        logcontent = 'Stakemax: ' + str(glovar.Stakemax)
#        self.logger.info(logcontent)
#        logcontent = 'Firstcommem: ' + str(glovar.Firstcommem)
#        self.logger.info(logcontent)
#        logcontent = 'Firstcomno: ' + str(glovar.Firstcomno)
#        self.logger.info(logcontent)
#        logcontent = 'Secondcommem: ' + str(glovar.Secondcommem)
#        self.logger.info(logcontent)

        # Inform other PoS node process to stop
#        glovar.ComChange = 1
#        notend = True
#        while notend:
#            notend = False
#            for each in glovar.ComList:
#                if each[6]:
#                    notend = True
#                    break
#
#            time.sleep(0.05)
#
#        glovar.ComList.clear()
#        glovar.ComChange = 0

        # Record the status of committee
        for i in range (nodenum):
            if (glovar.PosList[i] > glovar.Stakemin and glovar.PosList[i] <= glovar.Stakemax):
                incomno = i // glovar.Firstcommem + 1
                if (incomno < comnum):
                    commember = glovar.PosList[(incomno-1)*glovar.Firstcommem:incomno*glovar.Firstcommem]
                else:
                    commember = glovar.PosList[(incomno-1)*glovar.Firstcommem:]

                newblock = []
                commitlist = []
                commitblocklist = []
                addfirstlist = []
                transactionlist = []
                secondcommitlist = []
                newsecondblock = []
                comstatus = {'genblock':0, 'blockhash':'0', 'stage':0, 'commit':0, 'commitlist':commitlist, \
                        'newblock':newblock, 'verify':0, 'commitblocklist':commitblocklist, \
                        'transactionlist':transactionlist, 'secondblockhash':'0', \
                        'secondcommit':0, 'secondcommitlist':secondcommitlist, \
                        'newsecondblock':newsecondblock, 'addfirstlist':addfirstlist}
                comnodequeue = queue.Queue()
                commemberLock = threading.Lock()
                process = 1
                cominfo = [incomno, glovar.PosList[i], commember, comstatus, comnodequeue, commemberLock, process]
                glovar.ComList.append(cominfo)

        self.logger.info('--------------------------------------------')
        if len(glovar.ComList):
            logcontent = 'Node is selected in committee:\n'
            for each in glovar.ComList:
                logcontent += str(each) + '\n'
            self.logger.info(logcontent)

        for each in glovar.ComList:
            # Run the node in Firstcommittee
            if each[0] <= glovar.Firstcomno:
                block_generation = BlockProcessing(each, self.logdirectory)
                block_generation.start()
            else:
                block_verify = VerifyProcessing(each, self.logdirectory)
                block_verify.start()

        # Clear global status
        glovar.ranLock.acquire()
        glovar.RanList.clear()
        glovar.ranLock.release()
        glovar.hashLock.acquire()
        glovar.HashSeed = 0
        glovar.HashList.clear()
        glovar.hashLock.release()
        glovar.PosList.clear()