Пример #1
0
 def BN(self, data):  # request for block (n)
     """Block(n)
     Sends the nth block from mainchain.
     :return:
     """
     if int(data) <= self.factory.chain.m_blockheight():
         logger.info(
             '<<<Sending block number %s %s bytes to node: %s', int(data),
             len(
                 helper.json_bytestream(
                     self.factory.chain.m_get_block(int(data)))),
             self.transport.getPeer().host)
         self.transport.write(
             self.wrap_message(
                 'BK',
                 helper.json_bytestream_bk(
                     self.factory.chain.m_get_block(int(data)))))
     else:
         if int(data) >= self.factory.chain.m_blockheight():
             logger.info(
                 'BN for a blockheight greater than local chain length..')
         else:
             logger.info(
                 'BN request without valid block number %s - closing connection',
                 str(data))
             self.transport.loseConnection()
     return
Пример #2
0
 def send_block(self, blocknumber, transport, wrap_message):
     if blocknumber <= self.chain.height():
         transport.write(wrap_message('PB', json_bytestream(self.chain.m_get_block(blocknumber))))
     elif blocknumber in self.blocks:
         tmp = {blocknumber: []}
         blockStateBuffer = self.blocks[blocknumber]
         tmp[blocknumber].append(blockStateBuffer[0].block)
         transport.write(wrap_message('PBB', json_encode_complex(tmp)))
Пример #3
0
 def send_stake_block(self, block_obj):
     logger.info('<<<Transmitting POS created block %s %s',
                 str(block_obj.blockheader.blocknumber),
                 block_obj.blockheader.headerhash)
     for peer in self.peer_connections:
         peer.transport.write(
             self.protocol.wrap_message('S4', json_bytestream(block_obj)))
     return
Пример #4
0
 def m_info_block(self, n):
     if n > self.m_blockheight():
         logger.info('No such block exists yet..')
         return False
     b = self.m_get_block(n)
     logger.info(('Block: ', b, str(b.blockheader.blocknumber)))
     logger.info(('Blocksize, ', str(len(json_bytestream(b)))))
     logger.info(('Number of transactions: ', str(len(b.transactions))))
     logger.info(('Validates: ', b.validate_block(self)))
Пример #5
0
    def LB(self):  # request for last block to be sent
        """
        Last BLock
        Sends the last block from the main chain.
        :return:
        """
        logger.info('<<<Sending last block %s %s bytes to node %s', self.factory.chain.m_blockheight(),
                    str(len(helper.json_bytestream(self.factory.chain.m_get_last_block()))),
                    self.transport.getPeer().host)

        self.transport.write(self.wrap_message('BK', helper.json_bytestream_bk(self.factory.chain.m_get_last_block())))
        return
Пример #6
0
    def search_txhash(self, txhash):  # txhash is unique due to nonce.
        err = {
            'status': 'Error',
            'error': 'txhash not found',
            'method': 'txhash',
            'parameter': txhash
        }
        for tx in self.transaction_pool:
            if tx.txhash == txhash:
                logger.info('%s found in transaction pool..', txhash)
                tx_new = copy.deepcopy(tx)
                tx_new.block = 'unconfirmed'
                tx_new.hexsize = len(json_bytestream(tx_new))
                tx_new.status = 'ok'
                return json_print_telnet(tx_new)

        try:
            txn_metadata = self.state.db.get(txhash)
        except:
            logger.info(
                '%s does not exist in memory pool or local blockchain..',
                txhash)
            return json_print_telnet(err)

        json_tx = json.loads(txn_metadata[0])
        if json_tx['subtype'] == transaction.TX_SUBTYPE_TX:
            tx = SimpleTransaction().json_to_transaction(txn_metadata[0])
        elif json_tx['subtype'] == transaction.TX_SUBTYPE_COINBASE:
            tx = CoinBase().json_to_transaction(txn_metadata[0])
        tx_new = copy.deepcopy(tx)
        tx_new.block = txn_metadata[1]
        tx_new.timestamp = txn_metadata[2]
        tx_new.confirmations = self.m_blockheight() - txn_metadata[1]
        tx_new.hexsize = len(json_bytestream(tx_new))
        tx_new.amount = tx_new.amount / 100000000.000000000
        if json_tx['subtype'] == transaction.TX_SUBTYPE_TX:
            tx_new.fee = tx_new.fee / 100000000.000000000
        logger.info('%s found in block %s', txhash, str(txn_metadata[1]))
        tx_new.status = 'ok'
        return json_print_telnet(tx_new)
Пример #7
0
    def f_write_m_blockchain(self):
        blocknumber = self.m_blockchain[-1].blockheader.blocknumber
        file_epoch = int(blocknumber // config.dev.blocks_per_chain_file)
        writeable = self.m_blockchain[-config.dev.disk_writes_after_x_blocks:]
        logger.info('Appending data to chain')

        with open(self.get_chaindatafile(file_epoch), 'ab') as myfile:
            for block in writeable:
                jsonBlock = bytes(json_bytestream(block), 'utf-8')
                compressedBlock = bz2.compress(jsonBlock, config.dev.compression_level)
                pos = myfile.tell()
                blockSize = len(compressedBlock)
                self.block_framedata[block.blockheader.blocknumber] = BlockFrame(pos, blockSize)
                myfile.write(compressedBlock)
                myfile.write(config.dev.binary_file_delimiter)

        del self.m_blockchain[:-1]
Пример #8
0
    def f_write_m_blockchain(self):
        blocknumber = self.m_blockchain[-1].blockheader.blocknumber
        suffix = int(blocknumber // config.dev.blocks_per_chain_file)
        writeable = self.m_blockchain[-config.dev.disk_writes_after_x_blocks:]
        logger.info('Appending data to chain')

        with open(self.get_chaindatafile(suffix), 'ab') as myfile:
            for block in writeable:
                jsonBlock = json_bytestream(block)
                compressedBlock = bz2.compress(jsonBlock,
                                               config.dev.compression_level)
                pos = myfile.tell()
                blockSize = len(compressedBlock)
                self.update_block_metadata(block.blockheader.blocknumber, pos,
                                           blockSize)
                myfile.write(compressedBlock)
                myfile.write(config.dev.binary_file_delimiter)

        del self.m_blockchain[:-1]
        gc.collect()
        return