All Versions
Latest Version
Avg Release Cycle
36 days
Latest Release

Changelog History
Page 4

  • v0.4.23-rc1

    January 18, 2020
  • v0.4.22 Changes

    July 22, 2019

    πŸš‘ We're releasing a PATCH release of go-ipfs based on 0.4.21 containing some critical fixes.

    The IPFS network has scaled to the point where small changes can have a wide-reaching impact on the entire network. To keep this situation from escalating, we've put a hold on releasing new features until we can improve our πŸš€ release process πŸš€ (which we've trialed in this release) and testing procedures.

    πŸš€ This release includes fixes for the following regressions:

    1. A major bitswap throughput regression introduced in 0.4.21 (ipfs/go-ipfs#6442). πŸ‘€ 2. High bitswap CPU usage when connected to many (e.g. 10,000) peers. See ipfs/go-bitswap#154.
    2. The local network discovery service sometimes initializes before the networking module, causing it to announce the wrong addresses and sometimes complain about not being able to determine the IP address (ipfs/go-ipfs#6415).

    πŸ›  It also includes fixes for:

    πŸ“Œ 1. Pins not being persisted after ipfs block add --pin (ipfs/go-ipfs#6441).

    1. Panic due to concurrent map access when adding and listing pins at the same time (ipfs/go-ipfs#6419). πŸ“Œ 3. Potential pin-set corruption given a concurrent ipfs repo gc and ipfs pin rm (ipfs/go-ipfs#6444). πŸ— 4. Build failure due to a deleted git tag in one of our dependencies (ipfs/go-ds-badger#64).

    Thanks to:

  • v0.4.22-rc1 Changes

    July 22, 2019

    Track progress on #6506.

  • v0.4.21 Changes

    May 30, 2019

    πŸš‘ We're happy to announce go-ipfs 0.4.21. This release has some critical bug fixes ⬆️ and a handful of new features so every user should upgrade.

    πŸ›  Key bug fixes:

    • Too many open file descriptors/too many peers (#6237).
    • βž• Adding multiple files at the same time doesn't work (#6254).
    • CPU utilization spikes and then holds at 100% (#5613).

    Key features:

    • πŸ‘ Experimental TLS1.3 support (to eventually replace secio).
    • 🐎 OpenSSL support for SECIO handshakes (performance improvement).

    IMPORTANT: This release fixes a bug in our security transport that could potentially drop data from the channel. Note: This issue affects neither the privacy nor the integrity of the data with respect to a third-party attacker. Only the peer sending us data could trigger this bug.

    ⬆️ ALL USERS MUST UPGRADE. We intended to introduce a feature this release that, unfortunately, reliably triggered this bug. To avoid partitioning πŸš€ the network, we've decided to postpone this feature for a release or two.

    Specifically, we're going to provide a minimum one month upgrade period. After πŸš€ that, we'll start testing the impact of deploying the proposed changes.

    ⬆️ If you're running the mainline go-ipfs, please upgrade ASAP. If you're building ⬆️ a separate app or working on a forked go-ipfs, make sure to upgrade to at least v0.0.3.


    First off, we'd like to give a shout-out to all contributors that participated πŸš€ in this release (including contributions to ipld, libp2p, and multiformats):

    Contributor Commits Lines Β± Files Changed
    Steven Allen 220 +6078/-4211 520
    Łukasz Magiera 53 +5039/-4557 274
    vyzo 179 +2929/-1704 238
    RaΓΊl Kripalani 44 +757/-1895 134
    hannahhoward 11 +755/-1005 49
    πŸ‘€ Marten Seemann 16 +862/-203
    keks 10 +359/-110 12
    Jan Winkelmann 8 +368/-26 16
    Jakub Sztandera 4 +361/-8 7
    Adrian Lanzafame 1 +287/-18 5
    Erik Ingenito 4 +247/-28 8
    Reid 'arrdem' McKenzie 1 +220/-20 3
    Yusef Napora 26 +98/-130 26
    Michael Avila 3 +116/-59 8
    Raghav Gulati 13 +145/-26 13
    tg 1 +41/-33 1
    Matt Joiner 6 +41/-30 7
    Cole Brown 1 +37/-25 1
    Dominic Della Valle 2 +12/-40 4
    Overbool 1 +50/-0 2
    Christopher Buesser 3 +29/-16 10
    myself659 1 +38/-5 2
    Alex Browne 3 +30/-8 3
    jmank88 1 +27/-4 2
    Vikram 1 +25/-1 2
    MollyM 7 +17/-9 7
    Marcin Rataj 1 +17/-1 1
    requilence 1 +11/-4 1
    Teran McKinney 1 +8/-2 1
    Oli Evans 1 +5/-5 1
    Masashi Salvador Mitsuzawa 1 +5/-1 1
    chenminjian 1 +4/-0 1
    Edgar Lee 1 +3/-1 1
    Dirk McCormick 1 +2/-2 2
    ia 1 +1/-1 1
    Alan Shaw 1 +1/-1 1

    πŸ› Bug Fixes And Enhancements

    πŸš‘ This release includes quite a number of critical bug fixes and 🐎 performance/reliability enhancements.

    Error when adding multiple files

    πŸš€ The last release broke the simple command ipfs add file1 file2. It turns out βœ… we simply lacked a test case for this. Both of these issues (the bug and the βœ… lack of a test case) have now been fixed.


    πŸ›  As noted above, we've fixed a bug that could cause data to be dropped from a SECIO connection on read. Specifically, this happens when:

    1. The capacity of the read buffer is greater than the length.
    2. The remote peer sent more than the length but less than the capacity in a single secio "frame".

    In this case, we'd fill the read buffer to it's capacity instead of its length.

    Too many open files, too many peers, etc.

    Go-ipfs automatically closes the least useful connections when it accumulates too many connections. Unfortunately, some relayed connections were blocking in Close(), halting the entire process.

    Out of control CPU usage

    πŸš€ Many users noted out of control CPU usage this release. This turned out to be a long-standing issue with how the DHT handled provider records (records recording which peers have what content):

    1. It wasn't removing provider records for content until the set of providers completely emptied. ⚑️ 2. It was loading every provider record into memory whenever we updated the set of providers.

    Combined, these two issues were trashing the provider record cache, forcing the DHT to repeatedly load and discard provider records.

    More Reliable Connection Management

    Go-ipfs has a subsystem called the "connection manager" to close the least-useful connections when go-ipfs runs low on resources.

    Unfortunately, other IPFS subsystems may learn about connections before the connection manager. Previously, if some IPFS subsystem tried to mark a connection as useful before the connection manager learned about it, the connection manager would discard this information. We believe this was causing #6271. It no longer does that.

    πŸ‘Œ Improved Bitswap Connection Management

    Bitswap now uses the connection manager to mark all peers downloading blocks as important (while downloading). Previously, it only marked peers from which it was downloading blocks.

    ⬇️ Reduced Memory Usage

    πŸš€ The most noticeable memory reduction in this release comes from fixing connection closing. However, we've made a few additional improvements:

    • πŸ‘€ Bitswap's "work queue" no longer remembers every peer it has seen indefinitely.
    • The peerstore now interns protocol names.
    • The per-peer goroutine count has been reduced.
    • The DHT now wastes less memory on idle peers by pooling buffered writers and returning them to the pool when not actively using them.
    Increased File Descriptor Limit

    0️⃣ The default file descriptor limit has been raised to 8192 (from 2048). Unfortunately, go-ipfs behaves poorly when it runs out of file descriptors and it uses a lot of file descriptors.

    Luckily, most modern kernels can handle thousands of file descriptors without any difficulty.

    ⬇ Decreased Connection Handshake Latency

    Libp2p now shaves off a couple of round trips when initiating connections by beginning the protocol negotiation before the remote peer responds to the πŸŽ‰ initial handshake message.

    In the optimal case (when the target peer speaks our preferred protocol), this ⬇️ reduces the number of handshake round-trips from 6 to 4 (including the TCP handshake).


    πŸ›  This release brings no new commands but does introduce a few changes, bugfixes, and enhancements. This section is hardly complete but it lists the most πŸ”” noticeable changes.

    πŸš€ Take note: this release also introduces a few breaking changes.

    πŸ—„ [DEPRECATION] The URLStore Command Deprecated

    πŸ—„ The experimental ipfs urlstore command is now deprecated. Please use ipfs add --nocopy URL instead.

    [BREAKING] The DHT Command Base64 Encodes Values

    When responding to an ipfs dht get command, the daemon now encodes the returned value using base64. The ipfs command will automatically decode this value before returning it to the user so this change should only affect those using the HTTP API directly.

    Unfortunately, this change was necessary as DHT records are arbitrary binary blobs which can't be directly stored in JSON strings.

    0️⃣ [BREAKING] Base32 Encoded v1 CIDs By Default

    0️⃣ Both js-ipfs and go-ipfs now encode CIDv1 CIDs using base32 by default, instead of base58. Unfortunately, base58 is case-sensitive and doesn't play well with πŸ‘€ browsers (see #4143.

    Human Readable Numbers

    πŸ‘ The ipfs bitswap stat and and ipfs object stat commands now support a --humanize flag that formats numbers with human-readable units (GiB, MiB, etc.).

    πŸ‘Œ Improved Errors

    πŸš€ This release improves two types of errors:

    1. Commands that take paths/multiaddrs now include the path/multiaddr in the error message when it fails to parse.
    2. ipfs swarm connect now returns a detailed error describing which addresses were tried and why the dial failed.
    Ping Improvements

    πŸ›  The ping command has received some small improvements and fixes:

    1. It now exits with a non-zero exit status on failure.
    2. It no longer succeeds with zero successful pings if we have a zombie but non-functional connection to the peer being pinged (#6298). 🚀 3. It now prints out the average latency when canceled with ^C (like the unix ping command).
    πŸ‘Œ Improved Help Text

    Go-ipfs now intelligently wraps help text for easier reading. On an 80 character wide terminal,


      ipfs add <path>... - Add a file or directory to ipfs.
      ipfs add [--recursive | -r] [--dereference-args] [--stdin-name=<stdin-name>] [
    --hidden | -H] [--quiet | -q] [--quieter | -Q] [--silent] [--progress | -p] [--t
    rickle | -t] [--only-hash | -n] [--wrap-with-directory | -w] [--chunker=<chunker
    > | -s] [--pin=false] [--raw-leaves] [--nocopy] [--fscache] [--cid-version=<cid-
    version>] [--hash=<hash>] [--inline] [--inline-limit=<inline-limit>] [--] <path>
      <path>... - The path to a file to be added to ipfs.
      -r,               --recursive           bool   - Add directory paths recursive
      --dereference-args                      bool   - Symlinks supplied in argument
    s are dereferenced.
      --stdin-name                            string - Assign a name if the file sou
    rce is stdin.
      -H,               --hidden              bool   - Include files that are hidden
    . Only takes effect on recursive add.
      -q,               --quiet               bool   - Write minimal output.
      -Q,               --quieter             bool   - Write only final hash.
      --silent                                bool   - Write no output.
      -p,               --progress            bool   - Stream progress data.
      -t,               --trickle             bool   - Use trickle-dag format for da
    g generation.
      -n,               --only-hash           bool   - Only chunk and hash - do not 
    write to disk.
      -w,               --wrap-with-directory bool   - Wrap files with a directory o
      -s,               --chunker             string - Chunking algorithm, size-[byt
    es] or rabin-[min]-[avg]-[max]. Default: size-262144.
      --pin                                   bool   - Pin this object when adding. 
    Default: true.
      --raw-leaves                            bool   - Use raw blocks for leaf nodes
    . (experimental).
      --nocopy                                bool   - Add the file using filestore.
     Implies raw-leaves. (experimental).
      --fscache                               bool   - Check the filestore for pre-e
    xisting blocks. (experimental).
      --cid-version                           int    - CID version. Defaults to 0 un
    less an option that depends on CIDv1 is passed. (experimental).
      --hash                                  string - Hash function to use. Implies
     CIDv1 if not sha2-256. (experimental). Default: sha2-256.
      --inline                                bool   - Inline small blocks into CIDs
    . (experimental).
      --inline-limit                          int    - Maximum block size to inline.
     (experimental). Default: 32.


      ipfs add <path>... - Add a file or directory to ipfs.
      ipfs add [--recursive | -r] [--dereference-args] [--stdin-name=<stdin-name>]
               [--hidden | -H] [--quiet | -q] [--quieter | -Q] [--silent]
               [--progress | -p] [--trickle | -t] [--only-hash | -n]
               [--wrap-with-directory | -w] [--chunker=<chunker> | -s] [--pin=false]
               [--raw-leaves] [--nocopy] [--fscache] [--cid-version=<cid-version>]
               [--hash=<hash>] [--inline] [--inline-limit=<inline-limit>] [--]
      <path>... - The path to a file to be added to ipfs.
      -r, --recursive            bool   - Add directory paths recursively.
      --dereference-args         bool   - Symlinks supplied in arguments are
      --stdin-name               string - Assign a name if the file source is stdin.
      -H, --hidden               bool   - Include files that are hidden. Only takes
                                          effect on recursive add.
      -q, --quiet                bool   - Write minimal output.
      -Q, --quieter              bool   - Write only final hash.
      --silent                   bool   - Write no output.
      -p, --progress             bool   - Stream progress data.
      -t, --trickle              bool   - Use trickle-dag format for dag generation.
      -n, --only-hash            bool   - Only chunk and hash - do not write to
      -w, --wrap-with-directory  bool   - Wrap files with a directory object.
      -s, --chunker              string - Chunking algorithm, size-[bytes] or
                                          rabin-[min]-[avg]-[max]. Default:
      --pin                      bool   - Pin this object when adding. Default:
      --raw-leaves               bool   - Use raw blocks for leaf nodes.
      --nocopy                   bool   - Add the file using filestore. Implies
                                          raw-leaves. (experimental).
      --fscache                  bool   - Check the filestore for pre-existing
                                          blocks. (experimental).
      --cid-version              int    - CID version. Defaults to 0 unless an
                                          option that depends on CIDv1 is passed.
      --hash                     string - Hash function to use. Implies CIDv1 if
                                          not sha2-256. (experimental). Default:
      --inline                   bool   - Inline small blocks into CIDs.
      --inline-limit             int    - Maximum block size to inline.
                                          (experimental). Default: 32.

    πŸ”‹ Features

    πŸš€ This release is primarily a bug fix release but it still includes two nice πŸ”‹ features from libp2p.

    πŸ‘ Experimental TLS1.3 support

    πŸ‘ Go-ipfs now has experimental TLS1.3 support. Currently, libp2p (IPFS's networking library) uses a custom TLS-like protocol we call SECIO. However, the πŸ”’ conventional wisdom concerning custom security transports is "just don't" so we are working on replacing it with TLS1.3

    0️⃣ To choose this protocol by default, set the Experimental.PreferTLS config variable:

    > ipfs config --bool Experimental.PreferTLS true

    Why TLS1.3 and not X (noise, etc.)?

    1. Libp2p allows negotiating transports so there's no reason not to add noise support to libp2p as well. πŸ‘ 2. TLS has wide language support which should make implementing libp2p for new languages significantly simpler.
    πŸ‘ OpenSSL Support

    πŸ‘ Go-ipfs can now (optionally) be built with OpenSSL support for improved 🐎 performance when establishing connections. This is primarily useful for nodes receiving multiple inbound connections per second.

    πŸ‘ To enable openssl support, rebuild go-ipfs with:

    > make build GOFLAGS=-tags=openssl


    πŸ”¨ The CoreAPI refactor is still underway and we've made significant progress towards a usable ipfs-as-a-library constructor. Specifically, we've integrated the fx dependency injection system and are now working on cleaning up our initialization logic. This should make it easier to inject new services into a go-ipfs process without messing with the core internals.

    πŸ— Build: GOCC Environment Variable

    πŸ‘· Build system now uses GOCC environment variable allowing for use of specific πŸ— go versions during builds.

    πŸ”„ Changelog

  • v0.4.21-rc3

    May 23, 2019
  • v0.4.21-rc2

    May 22, 2019
  • v0.4.21-rc1

    May 20, 2019
  • v0.4.20 Changes

    April 16, 2019

    πŸš‘ We're happy to release go-ipfs 0.4.20. This release includes some critical
    🐎 performance and stability fixes so all users should upgrade ASAP.

    πŸš€ This is also the first release to use go modules instead of GX. While GX has
    πŸ— been a great way to dogfood an IPFS-based package manager, building and
    maintaining a custom package manager is a lot of work and we haven't been able
    to dedicate enough time to bring the user experience of gx to an acceptable
    level. You can read #5850 for
    some discussion on this matter.

    🐳 Docker

    πŸš€ As of this release, it's now much easier to run arbitrary IPFS commands within
    🐳 the docker container:

    \> docker run --name my-ipfs ipfs/go-ipfs:v0.4.20 config profile apply server # apply the server profile\> docker start my-ipfs # start the daemon

    πŸš€ This release also reverts a change that
    🐳 caused some significant trouble in 0.4.19. If you've been running into Docker
    ⬆️ permission errors in 0.4.19, please upgrade.


    πŸš€ This release contains a major
    πŸš€ WebUI release with some
    πŸ’» significant improvements to the file browser and new opt-in, privately hosted,
    πŸ“ˆ anonymous usage analytics.


    As usual, we've made several changes and improvements to our commands. The most
    notable changes are listed in this section.

    πŸ†• New: ipfs version deps

    πŸš€ This release includes a new command, ipfs version deps, to list all
    πŸ— dependencies (with versions) of the current go-ipfs build. This should make it
    easy to tell exactly how go-ipfs was built when tracking down issues.

    πŸ†• New: ipfs add URL

    πŸ‘ The ipfs add command has gained support for URLs. This means you can:

    1. Add files with ipfs add URL instead of downloading the file first. πŸ—„ 2. Replace all uses of the ipfs urlstore command with a call to ipfs add --nocopy. The ipfs urlstore command will be deprecated in a future
      πŸš€ release.
    πŸ”„ Changed: ipfs swarm connect

    The ipfs swarm connect command has a few new features:

    It now marks the newly created connection as "important". This should ensure
    that the connection manager won't come along later and close the connection if
    it doesn't think it's being used.

    It can now resolve /dnsaddr addresses that don't end in a peer ID. For
    example, you can now run ipfs swarm connect /dnsaddr/ to
    connect to one of the bootstrap peers at random. NOTE: This could connect you to
    an arbitrary peer as DNS is not secure (by default). Please do not rely on
    βœ… this except for testing or unless you know what you're doing.

    Finally, ipfs swarm connect now returns all errors on failure. This should
    πŸ‘€ make it much easier to debug connectivity issues. For example, one might see an
    error like:

    Error: connect QmYou failure: dial attempt failed: 6 errors occurred:
        * <peer.ID Qm*Me> --> <peer.ID Qm*You> (/ip4/ dial attempt failed: dial tcp4 connect: connection refused
        * <peer.ID Qm*Me> --> <peer.ID Qm*You> (/ip6/::1/tcp/4001) dial attempt failed: dial tcp6 [::1]:4001: connect: connection refused
        * <peer.ID Qm*Me> --> <peer.ID Qm*You> (/ip6/2604::1/tcp/4001) dial attempt failed: dial tcp6 [2604::1]:4001: connect: network is unreachable
        * <peer.ID Qm*Me> --> <peer.ID Qm*You> (/ip6/2602::1/tcp/4001) dial attempt failed: dial tcp6 [2602::1]:4001: connect: network is unreachable
        * <peer.ID Qm*Me> --> <peer.ID Qm*You> (/ip4/ dial attempt failed: dial tcp4> i/o timeout
        * <peer.ID Qm*Me> --> <peer.ID Qm*You> (/ip4/ dial attempt failed: dial tcp4> i/o timeout
    πŸ”„ Changed: ipfs bitswap stat

    ipfs bitswap stat no longer lists bitswap partners unless the -v flag is
    passed. That is, it will now return:

    > ipfs bitswap stat
    bitswap status
        provides buffer: 0 / 256
        blocks received: 0
        blocks sent: 79
        data received: 0
        data sent: 672706
        dup blocks received: 0
        dup data received: 0 B
        wantlist [0 keys]
        partners [197]

    Instead of:

    > ipfs bitswap stat -v
    bitswap status
        provides buffer: 0 / 256
        blocks received: 0
        blocks sent: 79
        data received: 0
        data sent: 672706
        dup blocks received: 0
        dup data received: 0 B
        wantlist [0 keys]
        partners [203]
            ... omitting 200 lines ...
    πŸ”„ Changed: ipfs repo stat --human

    The --human flag in the ipfs repo stat command now intelligently picks a
    size unit instead of always using MiB.

    πŸ”„ Changed: ipfs resolve (ipfs dns, ipfs name resolve)

    All of the resolve commands now:

    1. Resolve recursively (up to 32 steps) by default to better match user
      0️⃣ expectations (these commands used to be non-recursive by default). To turn
      recursion off, pass -r false.
    2. When resolving non-recursively, these commands no longer fail when partially
      resolving a name. Instead, they simply return the intermediate result.
    πŸ”„ Changed: ipfs files flush

    The ipfs files flush command now returns the CID of the flushed file.

    🐎 Performance And Reliability

    πŸš€ This release has the usual collection of performance and reliability
    πŸ‘Œ improvements.

    Badger Memory Usage

    Those of you using the badger datastore should notice reduced memory usage in
    πŸš€ this release due to some upstream changes. Badger still uses significantly more
    πŸ”§ memory than the default datastore configuration but this will hopefully continue
    to improve.


    πŸš‘ We fixed some critical CPU utilization regressions in bitswap for this release.
    If you've been noticing CPU regressions in go-ipfs 0.4.19, especially when
    ⬆️ running a public gateway, upgrading to 0.4.20 will likely fix them.


    After AutoRelay was introduced in go-ipfs 0.4.19, the number of peers connecting
    through relays skyrocketed to over 120K concurrent peers. This highlighted some
    πŸš€ performance issues that we've now fixed in this release. Specifically:

    • We've significantly reduced the amount of memory allocated per-peer.
    • πŸ›  We've fixed a bug where relays might, in rare cases, try to actively dial a
      0️⃣ peer to relay traffic. By default, relays only forward traffic between peers
      already connected to the relay.
    • 🐎 We've fixed quite a number of performance issues that only show up when
      rapidly forming new connections. This will actually help all nodes but will
      especially help relays.

    If you've enabled relay hop (Swarm.EnableRelayHop) in go-ipfs 0.4.19 and it
    πŸš€ hasn't burned down your machine yet, this release should improve things
    significantly. However, relays are still under heavy load so running an open
    relay will continue to be resource intensive.

    We're continuing to investigate this issue and have a few more patches on the
    πŸš€ way that, unfortunately, won't make it into this release.


    πŸš€ We've fixed two notable panics in this release:

    • πŸ›  We've fixed a frequent panic in the DHT.
    • πŸ›  We've fixed an occasional panic in the experimental QUIC transport.

    Content Routing

    IPFS announces and finds content by sending and retrieving content routing
    ("provider") records to and from the DHT. Unfortunately, sending out these
    records can be quite resource intensive.

    πŸš€ This release has two changes to alleviate this: a reduced number of initial
    πŸ‘· provide workers and a persistent provider queue.

    πŸ‘· We've reduced the number of parallel initial provide workers (workers that send
    out provider records when content is initially added to go-ipfs) from 512 to 6.
    Each provide request (currently, due to some issues in our DHT) tries to
    🐎 establish hundreds of connections, significantly impacting the performance of
    go-ipfs and crashing some

    We've introduced a new persistent provider queue for files added via ipfs add
    πŸ“Œ and ipfs pin add. When new directory trees are added to go-ipfs, go-ipfs will
    βž• add the root/final CID to this queue. Then, in the background, go-ipfs will walk
    the queue, sequentially sending out provider records for each CID.

    This ensures that root CIDs are sent out as soon as possible and are sent even
    when files are added when the go-ipfs daemon isn't running.

    By example, let's add a directory tree to go-ipfs:

    \> # We're going to do this in "online" mode first so let's start the daemon.\> ipfs daemon &... Daemon is ready\> # Now, we're going to create a directory to add.\> mkdir foo\> for i in {0..1000}; do echo do echo $i \> foo/$i; done\> # finally, we're going to add it.\> ipfs add -r foo added QmUQcSjQx2bg4cSe2rUZyQi6F8QtJFJb74fWL7D784UWf9 foo/0 ... added QmQac2chFyJ24yfG2Dfuqg1P5gipLcgUDuiuYkQ5ExwGap foo/990 added QmQWwz9haeQ5T2QmQeXzqspKdowzYELShBCLzLJjVa2DuV foo/991 added QmQ5D4MtHUN4LTS4n7mgyHyaUukieMMyCfvnzXQAAbgTJm foo/992 added QmZq4n4KRNq3k1ovzxJ4qdQXZSrarfJjnoLYPR3ztHd7EY foo/993 added QmdtrsuVf8Nf1s1MaSjLAd54iNqrn1KN9VoFNgKGnLgjbt foo/994 added QmbstvU9mnW2hsE94WFmw5WbrXdLTu2Sf9kWWSozrSDscL foo/995 added QmXFd7f35gAnmisjfFmfYKkjA3F3TSpvUYB9SXr6tLsdg8 foo/996 added QmV5BxS1YQ9V227Np2Cq124cRrFDAyBXNMqHHa6kpJ9cr6 foo/997 added QmcXsccUtwKeQ1SuYC3YgyFUeYmAR9CXwGGnT3LPeCg5Tx foo/998 added Qmc4mcQcpaNzyDQxQj5SyxwFg9ZYz5XBEeEZAuH4cQirj9 foo/999 added QmXpXzUhcS9edmFBuVafV5wFXKjfXkCQcjAUZsTs7qFf3G foo

    In 0.4.19, we would have sent out provider records for files foo/{0..1000}
    before sending out a provider record for foo. If you were ask a friend to
    download /ipfs/QmUQcSjQx2bg4cSe2rUZyQi6F8QtJFJb74fWL7D784UWf9, they would
    (baring other issues) be able to find it pretty quickly as this is the first CID
    you'll have announced to the network. However, if you ask your friend to
    download /ipfs/QmXpXzUhcS9edmFBuVafV5wFXKjfXkCQcjAUZsTs7qFf3G/0, they'll have to
    wait for you to finish telling the network about every file in foo first.

    In 0.4.20, we immediately tell the network about
    QmXpXzUhcS9edmFBuVafV5wFXKjfXkCQcjAUZsTs7qFf3G (the foo directory) as soon
    as we finish adding the directory to go-ipfs without waiting to finish
    πŸš€ announcing foo/{0..1000}. This is especially important in this release
    πŸ‘· because we've drastically reduced the number of provide workers.

    The second benefit is that this queue is persistent. That means go-ipfs won't
    forget to send out this record, even if it was offline when the content was
    initially added. NOTE: go-ipfs does continuously re-send provider records in
    the background twice a day, it just might be a while before it gets around to
    sending out any specific one.


    Bitswap now periodically re-sends its wantlist to connected peers. This should
    πŸ‘€ help work around some race conditions we've seen in bitswap where one node wants
    a block but the other doesn't know for some reason.

    You can track this issue here: #5183.

    πŸ‘Œ Improved NAT Traversal

    πŸš€ While NATs are still p2p enemy #1, this release includes slightly improved
    πŸ‘Œ support for traversing them.

    πŸš€ Specifically, this release now:

    πŸ‘ 1. Better detects the "gateway" NAT, even when multiple devices on the network
    claim to be NATs. πŸ‘ 2. Better guesses the external IP address when port mapping, even when the
    gateway lies.

    ⬇️ Reduced AutoRelay Boot Time

    The experimental AutoRelay feature can now detect NATs much faster as we've
    ⬇️ reduced initial NAT detection delay to 15 seconds. There's still room for
    πŸ‘Œ improvement but this should make nodes that have enabled this feature dialable
    earlier on start.

    πŸ”„ Changelogs

  • v0.4.20-rc2

    April 12, 2019
  • v0.4.20-rc1

    April 05, 2019