Go IPFS v0.4.16 Release Notes

Release Date: 2018-07-13 // almost 6 years ago
  • ๐Ÿš€ Ipfs 0.4.16 is a fairly small release in terms of changes to the ipfs codebase, but it contains a huge amount of changes and improvements from the libraries we depend on, notably libp2p.

    ๐Ÿš€ This release includes small a repo migration to account for some changes to the ๐Ÿ”ง DHT. It should only take a second to run but, depending on your configuration, you may need to run it manually.

    You can run a migration by either:

    1. Selecting "Yes" when the daemon prompts you to migrate.
    2. Running the daemon with the --migrate=true flag.
    3. Manually running the migration.

    Libp2p

    This version of ipfs contains the changes made in libp2p from v5.0.14 through v6.0.5. In that time, we have made significant changes to the codebase to allow for easier integration of future transports and modules along with the usual ๐ŸŽ performance and reliability improvements. You can find many of these ๐Ÿ‘Œ improvements in the libp2p 6.0 release blog post.

    ๐Ÿ”จ The primary motivation for this refactor was adding support for network ๐Ÿ‘ transports like QUIC that have built-in support for encryption, authentication, ๐Ÿ”’ and stream multiplexing. It will also allow us to plug-in new security transports (like TLS) without hard-coding them.

    For example, our QUIC transport currently works, and can be plugged into libp2p manually (though note that it is still experimental, as the upstream spec is still in flux). Further work is needed to ๐Ÿ‘‰ make enabling this inside ipfs easy and not require recompilation.

    On the user-visible side of things, we've improved our dialing logic and timeouts. We now abort dials to local subnets after 5 seconds and abort all dials if the TCP handshake takes longer than 5 seconds. This should ๐ŸŽ significantly improve performance in some cases as we limit the number of ๐Ÿ“ฑ concurrent dials and slow dials to non-responsive peers have been known to clog the dialer, blocking dials to reachable peers. Importantly, this should improve ๐ŸŽ DHT performance as it tends to spend a disproportional amount of time connecting to peers.

    We have also made a few noticeable changes to the DHT: we've significantly ๐Ÿ‘Œ improved the chances of finding a value on the DHT, tightened up some of our ๐Ÿ›  validation logic, and fixed some issues that should reduce traffic to nodes โš™ running in dhtclient mode over time.

    ๐Ÿ‘€ Of these, the first one will likely see the most impact. In the past, when putting a value (e.g., an IPNS entry) into the DHT, we'd try to put the value to K peers (where K for us is 20). However, we'd often fail to connect to many of these peers so we'd end up putting the value to significantly fewer than K peers. We now try to put the value to the K peers we can actually connect to.

    ๐Ÿ›  Finally, we've fixed JavaScript interoperability in go-multiplex, the one stream muxer that both go-libp2p and js-libp2p implement. This should significantly ๐Ÿ‘Œ improve go-libp2p and js-libp2p interoperability.

    Multiformats

    We are also changing the way that people write 'ipfs' multiaddrs. Currently, ipfs multiaddrs look something like /ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ. However, calling them 'ipfs' multiaddrs is a bit misleading, as this is actually the multiaddr of a libp2p peer that happens to run ipfs. Other protocols built on libp2p right now still have to use multiaddrs that say 'ipfs', even if they have nothing to do with ipfs. Therefore, we are renaming them to 'p2p' multiaddrs. Moving forward, these addresses will be written as: /ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ.

    ๐Ÿ“œ This release adds support for parsing both types of addresses (.../ipfs/... and .../p2p/...) into the same network format, and the network format is ๐Ÿš€ remaining exactly the same. A future release will have the ipfs daemon switch to ๐Ÿ–จ printing out addresses this way once a large enough portion of the network โฌ†๏ธ has upgraded.

    N.B., these addresses are not related to IPFS file names (/ipfs/Qm...). Disambiguating the two was yet another motivation to switch the protocol name to /p2p/.

    IPFS

    On the ipfs side of things, we've started embedding public keys inside IPNS 0๏ธโƒฃ records and have enabled the Git plugin by default.

    Embedding public keys inside IPNS records allows lookups to be faster as we only need to fetch the record itself (and not the public key separately). It also ๐Ÿ›  fixes an issue where DHT peers wouldn't store a record for a peer if they didn't ๐Ÿ›  have their public key already. Combined with some of the DHT and dialing fixes, ๐ŸŽ this should improve the performance of IPNS (once a majority of the network โšก๏ธ updates).

    ๐Ÿ— Second, our public builds now include the Git plugin (in past builds, you could โž• add it yourself, but doing so was not easy). With this, ipfs can ingest and operate over Git repositories and commit graphs directly. For more information ๐Ÿ‘€ on this, see the go-ipld-git repo.

    ๐Ÿ›  Finally, we've included many smaller bugfixes, refactorings, improved ๐Ÿ“š documentation, and a good bit more. For the full details, see the changelog below.