def create_ethereum_client(uri, timeout=60, *, loop=None):
    """Create client to ethereum node based on schema.

    :param uri: Host on ethereum node
    :type uri: str

    :param timeout: An optional total time of timeout call
    :type timeout: int

    :param loop: An optional *event loop* instance
                 (uses :func:`asyncio.get_event_loop` if not specified).
    :type loop: :ref:`EventLoop<asyncio-event-loop>`

    :return: :class:`BaseAsyncIOClient` instance.
    """
    if loop is None:
        loop = asyncio.get_event_loop()

    presult = urlparse(uri)
    if presult.scheme in ('ipc', 'unix'):
        reader, writer = yield from asyncio.open_unix_connection(presult.path,
                                                                 loop=loop)
        return AsyncIOIPCClient(reader, writer, uri, timeout, loop=loop)
    elif presult.scheme in ('http', 'https'):
        tls = presult.scheme[-1] == 's'
        netloc = presult.netloc.split(':')
        host = netloc.pop(0)
        port = netloc.pop(0) if netloc else (443 if tls else 80)
        return AsyncIOHTTPClient(host, port, tls, timeout, loop=loop)
    else:
        raise RuntimeError('This scheme does not supported.')