Conversation
|
It might actually be good to enable the DHT if it proves to not break things and then figure out the interop of the DHT with go-ipfs as we go. |
6a29c16 to
df424e5
Compare
|
Updated deps including all the latest changes in Bitswap. DHT tests in JS land are fine. Still no love between JS and Go 😢 |
|
CI is still not happy as well |
|
Is this PR still up to date? |
|
@hoffmabc it is as with regards to status, DHT is still a WIP. Lot's of work happening on js-libp2p land itself -- https://github.com/libp2p/js-libp2p --. Currently focused on libp2p/js-libp2p#159 |
|
Is there any prior docs I can read about the technical challenges involved in go <-> js DHT interop? |
|
Let's unblock this endeavour with the delegated routing as soon as 0.29.0 gets released. |
df424e5 to
5347ffd
Compare
|
@BazaarDog Those seem to be links to different tests. Does that mean that this PR here should already have the go interop baked in and just the tests are seperate? |
|
@rmisio this PR should be interoperable with go-ipfs |
|
I can't seem to get the dht working right between two ipfs-js nodes: I could verify that the node that puts the item in the dht is able to retrieve it. But, a different node cannot: The main error I seem to get is I can confirm via FWIW, the web nodes I'm using are each connected to a ipfs-go node acting as a relay. Not sure if that has anything to do with anything here :) |
|
What's the status of getting this merged + functional? Looking to use this for faster sync by sharing db's over ipfs for AugurProject/augur#771 |
|
Hey all! This PR is interoperable with the |
| **Please read this:** DHT (automatic content discovery) and Circuit Relay (pierce through NATs and dial between any node in the network) are two fundamental pieces that are not finalized yet. There are multiple applications that can be built without these two services but nevertheless they are fundamental to get that magic IPFS experience. If you want to track progress or contribute, please follow: | ||
|
|
||
| - DHT: https://github.com/ipfs/js-ipfs/pull/856 | ||
| - ✅ Relay: https://github.com/ipfs/js-ipfs/pull/1063 |
| - `pubsub` (boolean): Enable libp2p pub-sub. (Default: `false`) | ||
| - `ipnsPubsub` (boolean): Enable pub-sub on IPNS. (Default: `false`) | ||
| - `sharding` (boolean): Enable directory sharding. Directories that have many child objects will be represented by multiple DAG nodes instead of just one. It can improve lookup performance when a directory has several thousand files or more. (Default: `false`) | ||
| - `dht` (boolean): Enable KadDHT. **This is currently not interoperable with `go-ipfs`.** |
There was a problem hiding this comment.
Will the DHT start automatically in the browser too?
There was a problem hiding this comment.
In the current state of this PR it is starting automatically in both browser and node. Do you think we should start by having only node.js nodes first?
There was a problem hiding this comment.
I would recommend to start with node only and look at adding it to the browser as a default later, if ever. Until we get more performance benchmarking for the browser I'm hesitant to just turn it on there for everyone.
There was a problem hiding this comment.
yeah, that's a good point!
There was a problem hiding this comment.
OK, so, I'm half inclined to just enable it in the browser by default, expose ourselves to the issues and get them fixed asap. That said, since this is such a big feature perhaps not having it enabled by default in the browser initially will give us some scope to test it out first and fix the bigger issues, so that we don't expose all our users to the bugs and make everyone mad.
We do need a way to enable/disable it though - if the dht config option is being removed from EXPERIMENTAL, is it being added to the top level?
|
|
||
| handler (argv) { | ||
| } | ||
| } |
There was a problem hiding this comment.
Is the DHT full implemented on http api and CLI as well? Mind updating https://github.com/ipfs/ipfs/blob/master/IMPLEMENTATION_STATUS.md#dht ?
src/core/components/dht.js
Outdated
| } catch (err) { | ||
| log.error(err) | ||
|
|
||
| return setImmediate(() => callback(errcode(err, 'ERR_INVALID_CID'))) |
There was a problem hiding this comment.
Wasn't there a push to change setImmediate for nextTick?
src/core/components/dht.js
Outdated
| if (typeof opts === 'function') { | ||
| callback = opts | ||
| opts = {} | ||
| return setImmediate(() => callback(errcode(err, 'ERR_INVALID_CID'))) |
src/core/components/libp2p.js
Outdated
| }, | ||
| EXPERIMENTAL: { | ||
| dht: get(options, 'EXPERIMENTAL.dht', false), | ||
| dht: !(get(options, 'local', false)), |
There was a problem hiding this comment.
We have an option (local currently) that aims to:
Run offline. Do not connect to the rest of the network but provide local API.
Regarding this, go-ipfs changed recently this option name to offline. So, I created a PR now for renaming this option to offline #1850.
Once it is merged, I will rebase this PR and, if we go with DHT enabled by default in libp2p config, I will change this logic to not add the dht to the libp2p modules, if we are running offline.
src/core/runtime/libp2p-browser.js
Outdated
| }, | ||
| EXPERIMENTAL: { | ||
| dht: false, | ||
| dht: true, |
There was a problem hiding this comment.
No need anymore, right?
There was a problem hiding this comment.
In the libp2p side, it is still marked as experimental. I am totally up to make it enabled by default and running if libp2p receives the DHT in the modules object.
Should we release a new version of libp2p removing the experimental flag now? If you all agree, I will make the PR later today.
cc @jacobheun
There was a problem hiding this comment.
Should we release a new version of libp2p removing the experimental flag now? If you all agree, I will make the PR later today.
I agree 👍 💯
There was a problem hiding this comment.
I also agree, set it free!
src/core/runtime/libp2p-nodejs.js
Outdated
| }, | ||
| EXPERIMENTAL: { | ||
| dht: false, | ||
| dht: true, |
There was a problem hiding this comment.
No need anymore, right?
src/http/api/resources/dht.js
Outdated
| }).code(500) | ||
| } | ||
|
|
||
| reply({}) |
There was a problem hiding this comment.
Why send back an empty objective?
| - `pubsub` (boolean): Enable libp2p pub-sub. (Default: `false`) | ||
| - `ipnsPubsub` (boolean): Enable pub-sub on IPNS. (Default: `false`) | ||
| - `sharding` (boolean): Enable directory sharding. Directories that have many child objects will be represented by multiple DAG nodes instead of just one. It can improve lookup performance when a directory has several thousand files or more. (Default: `false`) | ||
| - `dht` (boolean): Enable KadDHT. **This is currently not interoperable with `go-ipfs`.** |
There was a problem hiding this comment.
OK, so, I'm half inclined to just enable it in the browser by default, expose ourselves to the issues and get them fixed asap. That said, since this is such a big feature perhaps not having it enabled by default in the browser initially will give us some scope to test it out first and fix the bigger issues, so that we don't expose all our users to the bugs and make everyone mad.
We do need a way to enable/disable it though - if the dht config option is being removed from EXPERIMENTAL, is it being added to the top level?
src/cli/commands/dht/find-peer.js
Outdated
| const peers = await ipfs.dht.findPeer(peerID) | ||
| const addresses = peers.multiaddrs.toArray().map((ma) => ma.toString()) | ||
|
|
||
| print(addresses) |
There was a problem hiding this comment.
print is just console.log which will give you output like:
[ '/ip4/127.0.0.1/tcp/4001',
'/ip4/169.254.83.88/tcp/4001',
'/ip4/192.168.1.95/tcp/4001' ]In comparison go-ipfs outputs:
$ ipfs dht findpeer QmZMxNdpMkewiVZLMRxaNxUeZpDUb34pWjZ1kZvsd16Zic
/ip6/2001:19f0:5:66d1::/tcp/4001
/ip4/149.28.228.162/tcp/33154
/ip4/45.77.150.82/tcp/4001
/ip6/::1/tcp/4001
/ip6/2001:19f0:5:5d40:5400:1ff:fec1:ce94/tcp/4001
/ip4/127.0.0.1/tcp/4001
/ip4/149.28.228.162/tcp/4001
/ip4/127.0.0.1/tcp/8081/ws
src/cli/commands/dht/provide.js
Outdated
| }, | ||
|
|
||
| handler ({ ipfs, key, resolve }) { | ||
| // TODO add recursive option |
There was a problem hiding this comment.
Please pass this option to ipfs.dht.provide so it can throw and inform the user the option is not implemented yet.
src/core/components/libp2p.js
Outdated
| }, | ||
| dht: { | ||
| kBucketSize: get(options, 'dht.kBucketSize', 20), | ||
| enabled: get(options, 'dht.enabled', true) && !(get(options, 'local', false)), |
| const some = require('async/some') | ||
| const eachOf = require('async/eachOf') | ||
| const someSeries = require('async/someSeries') | ||
| const eachOfSeries = require('async/eachOfSeries') |
There was a problem hiding this comment.
Using some is making a lot of parallel dht find and connect requests.
So, everything will get queried even if we find the target node, as the find takes longer than initiating the requests.
In the long run, we should refactor the pin-set, in order to try to parallelize some operations, but this is the safest option currently.
src/http/api/resources/dht.js
Outdated
| arg: Joi.string().required() | ||
| }).unknown() | ||
| }, | ||
| handler: (request, reply) => { |
There was a problem hiding this comment.
These handlers now need to change for Hapi 18 - please shout if you have any questions!



This PR is the second part of the DHT integration in js-ipfs
Remaining tasks
Main work tracker: libp2p/js-libp2p-kad-dht#1
Integrate libp2p-ipfs-browserwill only add DHT there after Relay is inNeeds the following PRs:
js-libp2p@0.24.0libp2pnew releaseBlocked PRs: