async def open(self) -> 'NodePool':
        """
        Explicit entry. Opens pool as configured, for later closure via close().
        Creates pool if it does not yet exist, using configured genesis transaction file.
        For use when keeping pool open across multiple calls.

        Raise any AbsentPool if node pool ledger configuration is not available.

        :return: current object
        """

        LOGGER.debug('NodePool.open >>>')

        await pool.set_protocol_version(self.protocol.indy())
        LOGGER.info('Pool ledger %s set protocol %s', self.name, self.protocol)

        try:
            self._handle = await pool.open_pool_ledger(self.name, json.dumps(self.config))
        except IndyError as x_indy:
            if x_indy.error_code == ErrorCode.PoolLedgerNotCreatedError:
                LOGGER.debug('NodePool.open <!< Absent node pool %s ledger configuration', self.name)
                raise AbsentPool('Absent node pool {} ledger configuration'.format(self.name))
            LOGGER.debug(
                'NodePool.open <!< cannot open node pool %s: indy error code %s',
                self.name,
                x_indy.error_code)
            raise

        LOGGER.debug('NodePool.open <<<')
        return self