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