class CoinpyDaemon(object): def __init__(self, args: Any) -> None: config = {} if args.addnode is not None: config['neighbors'] = [ PeerAddr((host, int(port))) for _, host, port in args.addnode ] config['gen'] = args.gen # config['gen_ext'] = args.genext if args.rpcbind is not None: config['rpcbind'] = args.rpcbind # node self.__io_loop = asyncio.get_event_loop() self.__io_loop.set_debug(True) _, host, port = args.bind self.__node = Node(self.__io_loop, addr=PeerAddr((host, port)), **config) self.__io_loop.run_until_complete(self.start()) self.__tasks = [self.__io_loop.create_task(self.__node.msg_handle())] # rpc server self.__rpc.run() # mining handler if config['gen']: self.__tasks.append( self.__io_loop.create_task(self.__node.block_mine_handle())) # greet neighbors self.__tasks.append( self.__io_loop.create_task( self.__node.commnad_send_bulk( GreetCommand(self.__node.last_block.height)))) # run daemon completed, pending = self.__io_loop.run_until_complete( asyncio.wait(self.__tasks)) async def start(self) -> None: logger.debug('starting daemon') self.__rpc = CoinpyDaemonRPCServer(self.__io_loop, self, **self.__node.config) await self.__node.start() async def stop(self) -> None: logger.debug('stopping daemon') self.__rpc.stop() # cancel tasks for task in self.__tasks: task.cancel() await task await self.__node.stop() self.__io_loop.stop() def stop_sync(self) -> None: # for rpc self.__tasks.append(self.__io_loop.create_task(self.stop()))