Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IPIP-342: Ambient Discovery of Content Routers #342

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
Open
294 changes: 294 additions & 0 deletions IPIP/0342-content-router-discovery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,294 @@
# IPIP 0342: Content Router Ambient Discovery
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since I can't expose a partial index without being punished, would this be more correct?

Suggested change
# IPIP 0342: Content Router Ambient Discovery
# IPIP 0342: IPNI Content Router Ambient Discovery


- Start Date: 2022-11-11
- Related Issues:
- https://hackmd.io/bh4-SCWfTBG2vfClG0NUFg
- https://github.com/ipfs/kubo/issues/9150
- https://github.com/filecoin-project/storetheindex/issues/823

## Summary

The Interplanetary stack has slowly opened itself to support extensibility of
the content routing subsystem. This extensibility is used today by network
indexers, like https://cid.contact/, to bridge content from large providers
that cannot practically provide all content to the IPFS DHT. A missing piece
of this story is that there is not a process by which IPFS nodes can discover
these alernative content routing systems automatically. This IPIP proposes
a mechanism by which IPFS nodes can discover and make use of content routing
systems.

## Motivation

There is currently not a process by which IPFS nodes can discover alernative
content routing systems automatically. This has led to a reliance on
centralized systems, like the hydra boosters, to fill the gap and offer
content only available in network indexer to current IPFS nodes. This strategy
willscott marked this conversation as resolved.
Show resolved Hide resolved
is also insufficient long term because:
1. It limits speed to the use of a globally distributed kademlia DHT
2. It is insufficient for providing content in applications where content grows
super-linearly to peers, such that the burden on a traditional DHT would
become unsustainable.


## Detailed design

This spec is designed for the ability of IPFS nodes to automatically discover
and make use of 'content routers'. Content routers are services which are able
to fulfill libp2p's [ContentRouting](https://github.com/libp2p/go-libp2p/blob/master/core/routing/routing.go#L26)
lidel marked this conversation as resolved.
Show resolved Hide resolved
API. These routers currently are considered to directly support queries using
the protocols specified by
[IPIP-337](https://github.com/ipfs/specs/pulls)
lidel marked this conversation as resolved.
Show resolved Hide resolved
and/or
[IPIP-327](https://github.com/ipfs/specs/pull/327).
Copy link
Member

@lidel lidel Nov 18, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to either decide which one is the future, or document how client decides which one to use for sending requests.
IF we do the latter, including content type along with the router URL is the way to go: Reframe endpoint is application/vnd.ipfs.rpc[..]; version=n.


In addition, this protocol expects that content routers that may be considered
for auto-configuration/discovery by IPFS nodes will have knowledge of the
entire CID space - in other words a delegation to such a router may be
considered 'exhaustive'.
Copy link
Contributor

@guseggert guseggert Nov 30, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How does this happen? What kind of consistency SLAs should routers have, and how can they achieve it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd like to say 'that's outside of this direct IPIP' - in that if routers fail to be consistent they would risk loosing priority.

In practice:

  • indexers follow the list of providers from other indexers so that the constituents they follow are consistent
  • they gossip announcements they see to each other so new updates are propagated between them
  • [in progress] they can come to snapshot consensus periodically over a vector of providers & latest advertisements.


### 0. content-router discovery state tracking

Nodes will conceptually track a registry about known content routers.
This registry will be able to understand for a given content router two
properties:
* reliability - how many good vs bad responses has this router responded
willscott marked this conversation as resolved.
Show resolved Hide resolved
with. This statistic should be windowed, such that the client can calculate
it in terms of the last week or month. This will in practice be stored as
daily buckets of successful and unsuccessful queries against a router, where
success indicates that the router was queried, and the data was subsequently
retrieved from a node returned as a provider by that router.
* performance - how quickly does this router respond.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this metric also windowed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this would be windowed. I was imagining a window of ~ "last week" by default, but this seems like a good candidate to evaluate through simulation.


This protocol expects nodes to be able to keep reliability (a metric
capturing both availability and correctness) separate from performance
for the purpose of propagating content routing information.

In addtion, nodes may wish to track the most recent time they have learned
content routing information from the other peers they are and have been
connected with.

Conceptually, propagation of content routers will look like nodes gossiping
their knowledge of router existance to each other. Initially, we expect that
the current topology will look a bit more like a feedback loop over a
bipartite graph - where one side of the graph is the set of general purpose
IPFS nodes, and the other side are the bootstrap and core-infrastructural
nodes with high connectivity in the network.

### 1. content-routing as a libp2p protocol
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the expected plan for this to work with browser-based nodes? Are they supposed to fallback to one of your rejected alternatives (e.g. hardcoded nodes, hardcoded bootstrap nodes, advertising in the DHT, advertising in the Indexers, ...)?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suspect the idea is for /dnsaddr/bootstrap.libp2p.io (or any other bootstrapper set by JS user, as long its /webtransport or /wss) to speak this new protocol, avoiding hardcoding anything new.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what prevents them from participating in this protocol as described?
browser nodes will need to contact to other existing nodes, as they do today. they would learn about the existence of content routers through those same channels via the new protocol, and could then make use of them.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what prevents them from participating in this protocol as described?

CORS. If the only type of router this protocol returns is HTTP URL, then by default JS-IPFS running on a website won't be able to read data via cross-origin requests to the discovered router due to CORS limitations.

We have two ways of solving the problem:

  1. (easy spec fix) Add a paragraph that requires https:// servers returned by this discovery protocol to to ALWAYS have Access-Control-Allow-Origin: * etc set up
  2. (more involved) Create libp2p version of IPIP-337: Delegated Content Routing HTTP API #337 that browser peers could use over existing /wss or /webtransport listeners. Another argument Why IPFS needs Delegated Routing over libp2p.


IPFS nodes will advertise and coordinate discover of content routers using a
new libp2p protocol advertised as "/ipfs/content-router-discovery/1.0.0".
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As things currently are the name, purpose, or formatting of this protocol seem off. This relates to some of the middle-ground in this discussion between @willscott and @ajnavarro
with #342 (comment) and #342 (comment) around content routing.

High level:

  1. This currently seems to be specifically for IPNI routers so at best this is /ipfs/ipni-discovery/1.0.0
  2. I can guarantee with 100% certainty that there will be people who want additional content routing systems than /ipfs/kad/1.0.0 and the IPNI protocol. However, the model of this discovery system works for any system that has a set of endpoints which are supposed to be able to locate all data within the system (e.g. delegated routing endpoints for /ipfs/kad/1.0.0, IPNI endpoints, delegated routing endpoints for BitTorrent's mainline DHT, etc.). If you want it to be generic enough to cover that then there needs to be some name/identifier for the system you want (e.g. asking for bloom filters or peers specific to a given routing system)

If we leave this as IPNI only, ok 🤷. However, almost the same logic is going to be needed for browser nodes trying to leverage multiple delegated routing endpoints so they'll either up defaulting back to one of the "rejected options" here (e.g. hard coding them or DHT discovery) or reimplementing this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This currently seems to be specifically for IPNI routers so at best this is /ipfs/ipni-discovery/1.0.0

this is for discovery of content routers per the delegated content router API - what about this is IPNI specific?

Copy link
Member

@lidel lidel Nov 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The requirement (implied by the proposed reputation scoring) of keeping track of all CIDs in existence makes this sound like an IPNI-specific proposal. Who else would keep the whole index if not "InterPlanetary Network Indexer" (even if it is a composite/reverse proxy one)?

Due to this, renaming it to /ipni-discovery/ calls it what it is and avoids undesired feature creep.

Alternatives:

  • make this more generic, /router-discovery/: extend the lookup spec to include explicit type of router (for now all lookups will be IPNIs, but allows us to expand this in the future, as suggested). I see this being useful for gossiping/discovering things like IPNS, peer routers, or even DoH, DoT DNS resolvers.
  • having different router types allows us to have different reputation systems, which may be a way for future/separate support routers which have only a partial view of entire CID space

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm confused as to how the current draft addresses the issues here:

will have knowledge of the entire CID space

This line (from the spec) seems problematic even in the IPNI case. IPNI != the entire CID space which starts to make implementations complicated. The idea that one routing system is going to cover every use case is IMO not the way to go (and also the reason why there's even discussion of a delegated content routing API rather than just an IPNI API).


An example issue is to say we have 4 routers:

  1. cid.contact (IPNI)
  2. FilSwan (IPNI)
  3. routing.delegate.ipfs.io (proxies DHT + IPNI)
  4. ipfsdht.delegate.ipfs.io (proxies DHT, this is the only one that doesn't exist today, but certainly could)

While router 3 provides strictly more information than routers 1 or 2 it's also likely to be slower than them. It seems optimal to either contact 3 or contact 1/2 + 4 in parallel. For a node running its own DHT client would contact routers 1 or 2 and never contact 4. However, a naïve implementation may just result in all requests going through router 3 as it has the most CIDs covered which is not good. Perhaps a classification algorithm would be able to tease-out the optimizations here without further protocol adjustments, but that seems like a lot of complexity that could be alleviated by a small protocol adjustment.

This case also seems more problematic than the one that's been resolved by flagging router "type" like content-routing, peer-routing, etc. since support for a given API (content/peer routing) can be discovered with a single query to the endpoint whereas this requires a bunch of code complexity.

This seems like it'd be largely resolvable based on allowing users to query and return a set of named routing systems, or just calling this the "IPNI discovery system" so that routers like 3 + 4 know not to participate. I'd rather the former, but understand the latter.

While I wouldn't be surprised if down the road we also ended up requiring some of that ML-style classification code anyway I suspect walking down that path now is premature and likely to cause us problems.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • It seems like there's a lot of complexity in expressing this 'composition complexity' either directly or through classification. we don't have this problem today so I would prefer to defer this sort of grammar to a subsequent IPIP - you worry that 3 would do better than the others, but I would argue that would be incentive for the IPNI team to build what i think you have previously called 'radar' to incorporate DHT results into IPNI such that 1,2,3 are all equal :)

  • As you say, "IPNI != the entire CID space". I think it's a mistake to limiting our framing of this to an "IPNI discovery system" when it is simply discovering 'the most complete' available content routers. We're trying to be inclusive/general here - and I don't see huge harm in calling this content routers.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't have this problem today

I guess it depends what you mean by "today". I would like libraries like https://github.com/libp2p/js-libp2p-delegated-content-routing to switch to the latest content routing API (or have alternative which have switched) at which point js-libp2p in browsers should be able to leverage both the DHT and IPNI to get data from any peer that speaks wss/webtransport/webrtc.

Ideally they could use this protocol for discovery rather than hardcoding a DHT resolution endpoint.

@lidel could probably speak more about desired timings here.

but I would argue that would be incentive for the IPNI team to build what i think you have previously called 'radar' to incorporate DHT results into IPNI such that 1,2,3 are all equal :)

That's cool and would certainly resolve at least this use case 😄.


We're trying to be inclusive/general here
❤️

I think it's a mistake to limiting our framing of this to an "IPNI discovery system" when it is simply discovering 'the most complete' available content routers.

That's an interesting framing. By pushing for the "most complete set" it seems like you're essentially trying to get routers to compete for attention and content and make it so that only a single request to a single system needs to happen for clients to get what they need. If this is how the system evolves this is very nice to client machines.

However, if routers try and cut costs or code complexity by serving more-specific data (e.g. only data advertised over a specific pubsub channel, only data put in the IPFS Public DHT, only data from the BitTorrent network, ...) then the client code could start becoming problematic as it tries to figure out who to ask, without spamming all the routers.

I'm more cautious in advocating for the latter, but could see this go either way 😅. As long as the more immediate case around DHT + IPNI data being available to browser nodes is covered I'm happy 😄.

Copy link
Member

@lidel lidel Nov 29, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 that delegated DHT is the core use case for IPFS on Web Platform (JS in HTML in web browser), at least mid-term, because self-hosted user data is (at least for now) on DHT, and rarely on IPNI (which becomes the way for big paid providers to handle announcement of huge number of CIDs).

  • The gist of https://github.com/libp2p/js-libp2p-delegated-content-routing story is that is uses /api/v0/dht from Kubo RPC and we want to move away from that model.
  • Switching to HTTP API at routing.delegate.ipfs.io (proxies DHT + IPNI) is an easy win, and we would want to do this ASAP.
  • Having ambient discovery via bootstrap nodes talking /wss and /webtransport will allow for basic resiliency / redundancy


The protocol will follow a request-response model.
A node will open a stream on the protocol when it wants to discover new
content routers it does not already know.
willscott marked this conversation as resolved.
Show resolved Hide resolved
The node wants to request the best set of known content routers from it's peer
that it does not already know. The query will make use of a bloom filter to
support this prioritization without leaking the exact list of known content
routers that the client already knows.

* The size of the bloom filter is chosen by the client. It is sized such
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately GitHub doesn't allow threads not tied to a line, but wanted to add some thoughts to this discussion #342 (comment) in a way that responses would be easy to trace.

  1. Per @ajnavarro's comment IPIP-342: Ambient Discovery of Content Routers #342 (comment) I too find it a little hard to believe that there will be so many routers each providing full replicas of all data tracked by IPNI that a bloom filter would be required given that running these servers is expensive and incentivization is IIUC mostly TBD (I think @guseggert had some napkin math here showing the large costs around storing 10^15 CIDs even if we exclude bandwidth costs). That being said this is #not-this-ipips-problem. If the IPNI team thinks thousands of nodes all over the world will spring up hosting PBs of data and that lack of consistency between replicas isn't going to cause problems with the evaluation criteria that clients use that problem seems to live elsewhere.
  2. Whether or not IPIP-322: Content Routing Hints #322 is a good/bad idea is also #not-this-ipips-problem since this describes how to find routers for a given content routing system (i.e. IPNI) not whether it should be passable as a hint.
    • As an aside my 2c is that you've got to be careful here to not break IPLD properties if you go this route as I've flagged in IPIP-322: Content Routing Hints #322, however it's potentially useful to add hints as long as they're not mandatory.

that it has a greater than 99% certainly that it will receive a useful
response. The maximum size of a query may be capped by the server, but can be
effectively considered to be under 10kb.
* The client will hash it's known content routers into the bloom filter
to set bits in the filter at the locations to which these known routers
hash.
* The server will have a parameter for a number of servers it wants to return
to content discovery queries. By default this will be 10. (This default is
picked as the result of modeling router propagation). It will iterate through
it's list of known content routers, hashing them against the bloom filter and
selecting the top routers that are not already known to the client. It will
return this list, along with it's reliability score for each. This response
is structured as a list, conceptually:
```json
[
["https://cid.contact/", 0.95],
["https://dev.cid.contact/", 0.90],
]
```

### 2. probing of the discovery protocol

A node will probe it's connected peers for content routing updates in two
situations:

1. When it needs to perform a content routing query, and has not
successfully performed a sync in over a day.
2. When it's auto-nat status indicates it is eligible to be a DHT server, and
it has not successfully performed a synce in over a day.
willscott marked this conversation as resolved.
Show resolved Hide resolved

These parameters are also set through modeling.

To perform a probe, the node will consider the set of peers it is currently
connected to. It will order peers. The specific ordering is left to the
node, but it should strive for diversity - an example ordering would be to
rank peers by how recently a content routing discovery query has been make
to that peer, with tie breaking preference for LAN nodes and for nodes
with explicit peering agreements.

Other factors that may be considered include:
* Reputation of the peer, including how long it has been connected and if it
has served useful content in the past.
* Latency / ping time of the peer.

### 3. selection of routers
Copy link
Member

@lidel lidel Jun 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note to self: this section of the spec should be more specific about "bare minimum reputation system", and provide enough for implementer to do the right thing, and not say clients do "as they wish".

Expected probing behavior (or lack of it) on non-client services like bootstrappers should also be specified.

Copy link
Member

@lidel lidel Jun 14, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


Nodes are free to make content routing queries across content routing
systems they are aware of as they wish. An example strategy balancing
user experience and discovery is described.

The node maintains two thresholds:
* good (reliability > 99%, performance < 100ms)
* uncertain (queries < 5)

Content routers meeting the good reliability threshold are ordered by
performance. the top one is queried, as is an 'uncertain' router if
one exists.

These threshold values are maintained for a year for the purposes
of local selection.
They are maintained for a month for the purpose of admitting
knowledge of routers to others - so a client will no longer set bits for
routers it is aware of but which do not meet it's threshold for 'good'
after a month. If peers then subseuqently respond with these nodes
on discovery probes, the local node may use that to consider the
node as again 'uncertain' and attempt additional probes against it less than
a year later.

Nodes which participate as DHT servers should also consider if they
are being used only in an infrastructural capacity. If they are
receiving content routing requests from other peers, but there have been
no direct requests from the node itself that can be used to move
known content routers past the 'uncertain' threshold, the node may
choose to issue content routing queries for a fraction of the DHT
lookup queries it receives as a way to maintain a more accurate
table of content routers.

## Test fixtures

TK is a CID currently only available through the content routing system,
lidel marked this conversation as resolved.
Show resolved Hide resolved
and not through the IPFS DHT. This is a piece of content that can be queried
to validate the presence of alternative content routing systems.
willscott marked this conversation as resolved.
Show resolved Hide resolved

## Design rationale

As expressed in the motivation section, we need to design a system through
which nodes can discover content routers without a centralized point of
failure, and can use these routers to improve user performance for content
routing to levels faster than the current DHT.

This design is self-contained - it does not require standing up additional
infrastructure or making additional connections for discovery but rather
gossips routers over existing peer connections.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is the first time gossip is mentioned. Should we be more specific in the Detailed design section about the protocol and how nodes will be interconnected?


The design limits the ability of an adversary to impact user experience:
1. it does not propose at this stage to replace DHT queries, but only to
supplement them with content routing queries, which minimized user
noticable impact.
2. nodes will only propagate content routers they believe to work,
limiting the spread of spam / unavailable content routers to the directly
connected peers of an adversary.

With the exception of LAN tables, the other connections made by IPFS
nodes do not have geographic locality. As a result, performance is
separated in the tracking of content routers because it will not be
effective as a ranking factor in the non-geographically-aware
gossip system described here. As an optimization, nodes may choose to
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gossiping should be geographically-aware and happen only between peers that are geographically close to each other. Otherwise, I may share a content router that is geographically close from me, but it will be too slow for you, and you won't use it at all.
So sharing content routers with geographically far peers becomes irrelevant, as long as we had enough content routers and that they are distributed around the globe.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we believe ipfs nodes will generally have enough knowledge to ambiently identify which peers are geographically close to them?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A peer knows the RTT between itself and all of its directly connected peers. I would argue that a node cannot learn useful information about new content routers from a node that is 150+ms away from itself (except if it is in a desert). Hence nodes could gossip about content routers only with their closest nodes (in ping distance).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

libp2p/specs#413 (GossipSub v1.2) would probably solve this, since it's all about minimising latency

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we could use the same modeling / structure as gossip sub, but this is meant to be pull-based rather than push based. I have concerns about dropping in GossipSub directly.

Copy link
Member

@lidel lidel Nov 29, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, routers identified with DNS names (cid.contact) could use things like Anycast to ensure the client is routed to the closest one. (I believe we already do that for ipfs.io gateway..). Meaning, reports about "the same router" may be actually about different instance entirely. At the very least, spec should note that distance between peers should impact a router's score evaluation.

prioritize 'fast' content routers when responding to queries from peers
where sharded latency observations may be relevant. For example:
* Peers on the local LAN
* Peers in the local /16 IPv4 subnet
* Peers with observed latency less than 25ms

### User benefit

- Users will benefit from faster discovery of content providers.
- Users will also benefit from access to more CIDs than they currently do through
queries limited to the IPFS DHT
- Router discovery and reputation mechanism improves relisience.
- IPFS user agents will not be tied to static set of hard-coded HTTP endpoints
that may stop working at any time.
- Users will benefit from replacing misbehaving (censorship, DoS, hardware
failure) routers with useful ones without having to upgrade their software.


### Compatibility

Nodes which do not upgrade to support this IPIP will be limited to the sub-set of
content available in the DHT. this will potentially degrade over time as more
large providers limit their publishing per the [IPNI](https://github.com/ipni)
ingestion protocol.

Nodes may limit their complexity through a hard-coded list of known content
routers, essentially limiting their implementation to design section 3 of this
IPIP. This comes at a price: (1) hard-coded routers become easy targets
for denial of service attacks, decreasing the resilliency of the entire setup;
(2) nodes risk being out of date and to offer sub-optimal performance through their
failure to discover additional near-by content routing instances.

### Security

TODO: this section provides a rough sketch of arguments, but has not been fully
developed into prose at this time. At present, it is most useful for
comments and suggestions of other security considerations that should be
included as this draft develops.

#### 1. Malicious Content Routers
##### a. Providing Bad Content Routing Records

* records under double hashing are signed, so can't provide a record for a real peer
* if you provide non-working records, you are down-ranked

##### b. Availability Attacks / failing to provide records

* if list of records insufficient, client will get more from other providers in subsequent queries, leading to downranking

#### 2. Exposure of IPFS Clients (enumeration of network participants)

* a new provider is only visible to directly connected peers. they only forward it to peers asking them if it meets their bar
for reliability. This means propogation through the network is only posisble for routers that behave correctly.
* because clients only propagate their 'top' routers, latency is also relevant, and with sufficient number of routers, the would only
willscott marked this conversation as resolved.
Show resolved Hide resolved
propagate in their local geographic area before becoming uncompetitive on latencyk

### Alternatives

#### Ambient discovery in the style of circuit relays

Circuit relays are discovered ambiently by nodes during protocol enumeration.
When connecting with another libp2p node, IPFS nodes will probe
supported protocols. If they notice circut relay support at this time, they
make use of such aggregated knowledge when making connections needing the
support of relays.

This is not considered sufficient for content routing, because most content
routers will not act as general peers within the IPFS mesh, so they would
not be directly discovered. Instead, the gossip discovery protocol is
ambiently discovered in much the same way as circuit relays.

#### Advertisement in the DHT
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The good things about advertising using the DHT are:

  • Network that is already there, no need to create a new protocol to "provide" new providers instead of CIDs.
  • You can provide associating your provider with a specific root CID content. I seriously doubt that all providers will be eager to provide all CIDS in the universe.


This suffers from one of two problems depending on tuning: Either it results in
a global list that all clients see new providers, or it takes an inordinant
amount of querying before a client happens to run into a provider, leading to
degraded experiences for most clients. The single global list that a provider
can automatically add itself to leads to issues for how to mitigate an
enumeration of all network participants by a malicious content router.

Pros:
* Network is already there, no need to create a new protocol to "provide" new providers instead of CIDs.
* You could potentially associate a provider with a specific root CID content.
Cons:
willscott marked this conversation as resolved.
Show resolved Hide resolved
* Nodes cannot drop use of the DHT / other content routing options always are 'second tier'.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't really the case. Even with this proposal you still need a bootstrap node somewhere to get going (e.g. a /ipfs/kad/1.0.0 bootstrapper, or someone supporting this libp2p protocol). For IPNI you could advertise to IPNI as well and you'd be fine. Perhaps a more accurate con is that this gives less of that subjective information that may/may not come in handy.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the alternative of other content routers being found in the DHT, which is what this alternative is trying to describe, does mean that no ipfs node could be run without kad dht code for DHT lookups. Being a DHT participant is more complexity than just having libp2p code to be able to connect to other peers, and at least my understanding of what's being proposed in this alternative is that it is intertwined with the DHT and not equivalent to hardcoded bootstrap nodes through which content routers can be learned.



#### Static list of known routers distributed with IPFS clients

This has worked for the current IPFS bootstrap node, but leads to the need for
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed that IPNI (and delegated routers in general) are different from /ipfs/kad/1.0.0 in that the DHT has a discovery mechanism built in once there is bootstrapping and currently IPNI does not. However, any implementation is going to still need some level of hard-coding to get going here and having additional discovery is needed.

policies around how to decide which content routers will be included in such a
list, and fails to evolve efficiently as new content routers are added to the
system.

### Copyright

Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).