Add opt-in support for filtering specific network transports and/or transfer protocols to the Delegated Routing v1 HTTP endpoints via HTTP GET parameters.
IPFS aims to allow ubiquitous data exchange across different runtimes and platforms. One of the most challenging aspects of this goal is the diversity of network conditions and capabilities across different environments. Web browsers have a very limited network stack, and most web browsers do not support the full range of network transport protocols that are commonly used in other IPFS implementations.
The Delegated Routing v1 API empowers resource constrained clients like web browsers by significantly reducing the number of network connections necessary to fetch content addressed data directly from provider peers.
However, there are many cases where most of the results from the Delegated Routing v1 API are not actionable by clients, because the client does not support either the network transport protocol or the transfer protocol of the provider.
For instance, web browsers are limited to a specific set of network transport protocols, namely HTTPS, Secure WebSockets, WebTransport (emerging), and WebRTC. Consequently, providing information about providers that exclusively support TCP and/or UDP is not beneficial for browser-based clients, as they are unable to utilize such connections.
Moreover, Helia, the most actively maintained browser IPFS implementation, supports block retrieval by CID with Bitswap and Trustless Gateways, but does not support Graphsync.
This means that returning providers that only support raw TCP, raw UDP/QUIC, or Graphsync from the Delegated Routing API is not useful for browser clients, and results in unnecessary network traffic for browser clients.
The term "transport" is overloaded in the IPFS ecosystem.
In the context of this IPIP, we refer to the network layer transport protocol, e.g. TCP, QUIC, WebTransport, as "network transport protocol" to avoid ambiguity.
"Transfer protocol" refers to data transfer protocols, i.e. content-addressed block retrieval protocols, e.g. Bitswap, Graphsync, HTTP.
The proposed change is to add a ?filter-addrs
parameter to the GET /routing/v1/providers/{cid}
and GET /routing/v1/peers/{peer-id}
endpoints of [http-routing-v1]:
?filter-addrs=<comma-separated-list>
optional parameter to GET /routing/v1/providers/{CID}
that indicates which network transports to return by filtering the multiaddrs in the Addrs
field of the Peer schema.filter-addrs
parameter is a comma-separated list of network transport protocol name strings as defined in the multiaddr protocol registry, e.g. ?filter-addrs=webtransport
.unknown
can be be passed to include providers whose multiaddrs are unknown, e.g. ?filter-addrs=unknown
. This allows filtering providers whose multiaddrs are unknown at the time of filtering.!
, e.g. to skip IPv6 and QUIC addrs: ?filter-addrs=!ip6,!quic-v1
. Note that negative filtering is done by checking if the protocol name does not appear in any of the multiaddrs (logical AND).The proposed change is to add a ?filter-protocols
parameter to the GET /routing/v1/providers/{cid}
and GET /routing/v1/peers/{peer-id}
endpoints of [http-routing-v1]:
?filter-protocols=<comma-separated-list>
optional parameter to GET /routing/v1/providers/{CID}
to filter providers based on the Protocol
field of the Peer schema.filter-protocols
parameter is a comma-separated list of transfer protocol names, e.g. ?filter-protocols=transport-bitswap
.unknown
name can be be passed to include providers whose transfer protocol list is empty (unknown), e.g. ?filter-protocols=unknown
. This allows for including providers returned from the DHT that do not contain explicit transfer protocol information.Protocols
array (logical OR).filter-addrs
where only the multiaddrs that pass the filter are returned)Even though some of existing IPFS transfer protocol names start with transport
, e.g. transport-bitswap
, transport-graphsync-filecoinv1
, and transport-ipfs-gateway-http
, they should not to be confused with the network transport protocols used in peer addresses, which are filtered using the filter-addrs
parameter.
unknown
can be passed to filter-protocols
to include such providers.unknown
can be passed to filter-addrs
to include such providers.?filter-addrs=webtransport&filter-protocols=transport-bitswap
will return providers that support bitswap and have a webtransport multiaddr.By filtering out providers that do not support the desired network transport protocol and/or transfer protocol, the client can reduce the traffic necessary in order to fetch the data.
Moreover, it makes it much easier to determine whether there are any browser-usable providers for a given CID, which is a common use case for clients.
This should not effect existing clients or servers.
The default behavior when ?filter-addrs
and ?filter-protocols
is not passed is left unspecified, this IPIP is limited to opt-in behavior.
Copyright and related rights waived via CC0.