rs-ipfs / rust-ipfs

The InterPlanetary File System (IPFS), implemented in Rust.
Apache License 2.0
1.27k stars 165 forks source link

ipfs-http: manual testability or discoverability #402

Open koivunej opened 4 years ago

koivunej commented 4 years ago

This was cut from the v0.2.0 release for present time constraints however making ipfs-http more accessible as "the" ipfs binary would make the project more accessible to anyone just wanting to try it out. At the moment I see the following obstacles:

The tutorial could be simple one which would show how to interact using go-ipfs CLI with the ipfs-http, something along the lines of:

  1. install rust (link to book)
  2. clone repo
  3. cargo run -p ipfs-http -- init
  4. cargo run -p ipfs-http -- daemon
  5. in other terminal: IPFS_PATH=~/.rust-ipfs go-ipfs-binary-somewhere id

ipfs-http supporting only the init --profile test --bits b where b >= 2048 would be quite easy to fix so that it would support init and init --bits b where b >= 2048 by adding a profile abstraction or even a simple if-tornado in place of: https://github.com/rs-ipfs/rust-ipfs/blob/722d41a0864148e15721e1bca39e045ca13ce510/http/src/config.rs#L68-L74

(I haven't really looked at go-ipfs init profiles, they might have more in-depth features but the "test or default" would most likely be enough here.)

The ipfs::config::BOOTSTRAP_NODES would need to be populated whenever in this "default" or not given profile along with listening address of /ip4/0.0.0.0/tcp/4004. Also the http API port would need to be specified as it is quite frustrating to copy and paste the multiaddr from the stdout produced by cargo run -p ipfs-http -- daemon and convert it to normal address for curl by hand. The ipfs-http::config::CompatConfigFile does not currently have any field(s) for configuring the API listening address. The API listening address needs to remain random for the --profile test usage in conformance tests.

The "a bit incompatible" can be seen by trying to go-ipfs-0.6 add stuff in; I was being too conservative here and go-ipfs probably uses just small variation to "file" as the field name: https://github.com/rs-ipfs/rust-ipfs/blob/722d41a0864148e15721e1bca39e045ca13ce510/http/src/v0/root_files/add.rs#L148-L153

The repo directory set by default is just wrong: we are not aiming for repo compatibility and as such, the we should be following js-ipfs lead and use ~/.rust-ipfs by default (js-ipfs uses ~/.jsipfs).

This has many parts and is well suited to be implemented in quite atomic PRs. If you are interested in working on any part of this, please leave a comment below.

koivunej commented 4 years ago

Above I mentioned the [swarm] listening address of 0.0.0.0:4004 with the logic of: go-ipfs uses 4001, js-ipfs takes over 4002 and 4003, so unless I missed something this should be free in the ipfs sphere.

koivunej commented 4 years ago

The #406 made the ipfs::config module pub, which is a small step towards init without --profile test, even if it is perhaps not the best idea to reference the list of bootstrap peer(s) in a real world application.