def GetObject(self, request: xrd_pb2.GetObjectReq, context) -> xrd_pb2.GetObjectResp: logger.debug("[PublicAPI] GetObject") answer = xrd_pb2.GetObjectResp() answer.found = False # FIXME: We need a unified way to access and validate data. query = bytes( request.query ) # query will be as a string, if Q is detected convert, etc. try: if AddressState.address_is_valid(query): if self.xrdnode.get_address_is_used(query): address_state = self.xrdnode.get_optimized_address_state( query) if address_state is not None: answer.found = True answer.address_state.CopyFrom(address_state.pbdata) return answer except ValueError: pass transaction_block_number = self.xrdnode.get_transaction(query) transaction = None blockheader = None if transaction_block_number: transaction, block_number = transaction_block_number answer.found = True block = self.xrdnode.get_block_from_index(block_number) blockheader = block.blockheader.pbdata timestamp = block.blockheader.timestamp else: transaction_timestamp = self.xrdnode.get_unconfirmed_transaction( query) if transaction_timestamp: transaction, timestamp = transaction_timestamp answer.found = True if transaction: txextended = xrd_pb2.TransactionExtended( header=blockheader, tx=transaction.pbdata, addr_from=transaction.addr_from, size=transaction.size, timestamp_seconds=timestamp) answer.transaction.CopyFrom(txextended) return answer # NOTE: This is temporary, indexes are accepted for blocks try: block = self.xrdnode.get_block_from_hash(query) if block is None or (block.block_number == 0 and block.prev_headerhash != config.user.genesis_prev_headerhash): query_str = query.decode() query_index = int(query_str) block = self.xrdnode.get_block_from_index(query_index) if not block: return answer answer.found = True block_extended = xrd_pb2.BlockExtended() block_extended.header.CopyFrom(block.blockheader.pbdata) block_extended.size = block.size for transaction in block.transactions: tx = Transaction.from_pbdata(transaction) extended_tx = xrd_pb2.TransactionExtended( tx=transaction, addr_from=tx.addr_from, size=tx.size, timestamp_seconds=block.blockheader.timestamp) block_extended.extended_transactions.extend([extended_tx]) answer.block_extended.CopyFrom(block_extended) return answer except Exception: pass return answer
def GetTransactionsByAddress( self, request: xrd_pb2.GetTransactionsByAddressReq, context) -> xrd_pb2.GetTransactionsByAddressResp: logger.debug("[PublicAPI] GetTransactionsByAddress") return self.xrdnode.get_transactions_by_address( request.address, request.item_per_page, request.page_number)
def handleEvent(self, event): # NOTE: This function usually runs in the context of a C++ thread if event.type == SOLUTION: logger.debug('handleEvent - TRY LOCK') if not self.lock.acquire(blocking=False): logger.debug('handleEvent - SKIP') return False try: logger.debug('handleEvent - LOCKED') logger.debug('Solution Found %s', event.nonce) logger.info('Hash Rate: %s H/s', self.hashRate()) cloned_block = copy.deepcopy(self._mining_block) cloned_block.set_nonces(self._dev_config, event.nonce, 0) logger.debug("Blob %s", cloned_block) logger.info('Block #%s nonce: %s', cloned_block.block_number, event.nonce) self.pre_block_logic(cloned_block) except Exception as e: logger.warning("Exception in solutionEvent") logger.exception(e) finally: logger.debug('handleEvent - UNLOCK') self.lock.release() return True
def main(): args = parse_arguments() xrd_dir_post_fix = '' copy_files = [] if args.network_type == 'testnet': config.dev.hard_fork_heights[0] = config.dev.testnet_hard_fork_heights[0] # Hard Fork Block Height For Testnet xrd_dir_post_fix = '-testnet' package_directory = os.path.dirname(os.path.abspath(__file__)) copy_files.append(os.path.join(package_directory, 'network/testnet/genesis.yml')) copy_files.append(os.path.join(package_directory, 'network/testnet/config.yml')) logger.debug("=====================================================================================") logger.info("xrd Path: %s", args.xrd_dir) config.user.xrd_dir = os.path.expanduser(os.path.normpath(args.xrd_dir) + xrd_dir_post_fix) config.create_path(config.user.xrd_dir, copy_files) config.user.load_yaml(config.user.config_path) if args.mining_thread_count is None: args.mining_thread_count = config.user.mining_thread_count logger.debug("=====================================================================================") config.create_path(config.user.wallet_dir) mining_address = None ntp.setDrift() logger.info('Initializing chain..') persistent_state = State() if args.mocknet: args.debug = True config.user.mining_enabled = True config.user.mining_thread_count = 1 config.user.mining_pause = 500 config.dev.pbdata.block.block_timing_in_seconds = 1 config.user.genesis_difficulty = 2 # Mocknet mining address # Q01050058bb3f8cb66fd90d0347478e5bdf3a475e82cfc5fe5dc276500ca21531e6edaf3d2d0f7e # Mocknet mining hexseed # 010500dd70f898c2cb4c11ce7fd85aa04554e41dcc46569871d189a3f48d84e2fbedbe176695e291e9b81e619b3625c624cde6 args.mining_address = 'Q01050058bb3f8cb66fd90d0347478e5bdf3a475e82cfc5fe5dc276500ca21531e6edaf3d2d0f7e' if args.debug: logger.warning("FAULT HANDLER ENABLED") faulthandler.enable() if config.user.mining_enabled: mining_address = get_mining_address(args.mining_address) if not mining_address: logger.warning('Invalid Mining Credit Wallet Address') logger.warning('%s', args.mining_address) return False chain_manager = ChainManager(state=persistent_state) if args.measurement > -1: chain_manager.get_measurement = MagicMock(return_value=args.measurement) chain_manager.load(Block.deserialize(GenesisBlock().serialize())) xrdnode = xrdNode(mining_address=mining_address) xrdnode.set_chain_manager(chain_manager) set_logger.set_logger(args, xrdnode.sync_state) ####### # NOTE: Keep assigned to a variable or might get collected admin_service, grpc_service, mining_service, debug_service = start_services(xrdnode) xrdnode.start_listening() xrdnode.start_pow(args.mining_thread_count) logger.info('xrd blockchain ledger %s', config.dev.version) if config.user.mining_enabled: logger.info('Mining/staking address %s using %s threads (0 = auto)', 'Q' + bin2hstr(mining_address), args.mining_thread_count) elif args.mining_address or args.mining_thread_count: logger.warning('Mining is not enabled but you sent some "mining related" param via CLI') reactor.run()
def startedConnecting(self, connector): logger.debug('Started connecting: %s', connector)
def clientConnectionFailed(self, connector, reason): logger.debug('connection failed: %s', reason)
def clientConnectionLost(self, connector, reason): # noqa logger.debug('connection lost: %s', reason)