Exemple #1
0
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()))