Releases: ipfs/kubo
v0.31.0-rc2
This second RC includes go-libp2p v0.36.5 and go 1.23.2 bugfixes.
Changelog: docs/changelogs/v0.31.md
Provide feedback in: https://discuss.ipfs.tech/t/kubo-v0-31-0-rc2-is-out/18592/
v0.31.0-rc1
See the related issue: #10499
And the draft changelog: docs/changelogs/v0.31.md
v0.30.0
- 💬 Discuss
- 🔦 Highlights
- Improved P2P connectivity
- Refactored Bitswap and dag-pb chunker
- WebRTC-Direct Transport enabled by default
- UnixFS 1.5: Mode and Modification Time Support
- AutoNAT V2 Service Introduced Alongside V1
- Automated
ipfs version check
- Version Suffix Configuration
/unix/
socket support inAddresses.API
- Cleaned Up
ipfs daemon
Startup Log - Commands Preserve Specified Hostname
- 📝 Changelog
- 👨👩👧👦 Contributors
Overview
🔦 Highlights
This release took longer and is more packed with fixes and features than usual.
Important
TLDR: update, it contains many, many fixes.
Improved P2P connectivity
This release comes with significant go-libp2p update from v0.34.1 to v0.36.3 (release notes).
It includes multiple fixes to key protocols: QUIC/Webtransport/WebRTC, Connection Upgrades through Relay (DCUtR), and Secure WebSockets.
Also, peers that are behind certain types of NAT will now be more reachable. For this alone, Kubo users are highly encouraged to upgrade.
Refactored Bitswap and dag-pb chunker
Some workloads may experience improved memory profile thanks to optimizations from Boxo SDK v0.23.0.
Important
Storage providers should upgrade to take advantage of the Bitswap server fix, which resolves the issue of greedy peers depleting available wantlist slots for their PeerID, resulting in stalled downloads.
WebRTC-Direct Transport enabled by default
Kubo now ships with WebRTC Direct listener enabled by default: /udp/4001/webrtc-direct
.
WebRTC Direct complements existing /wss
(Secure WebSockets) and /webtransport
transports. Unlike /wss
, which requires a domain name and a CA-issued TLS certificate, WebRTC Direct works with IPs and can be enabled by default on all Kubo nodes.
Learn more: Swarm.Transports.Network.WebRTCDirect
Note
Kubo 0.30 includes a migration for existing users that adds /webrtc-direct
listener on the same UDP port as /udp/{port}/quic-v1
. This supports the WebRTC-Direct rollout by reusing preexisting UDP firewall settings and port mappings created for QUIC.
UnixFS 1.5: Mode and Modification Time Support
Kubo now allows users to opt-in to store mode and modification time for files, directories, and symbolic links.
By default, if you do not opt-in, the old behavior remains unchanged, and the same CIDs will be generated as before.
The ipfs add
CLI options --preserve-mode
and --preserve-mtime
can be used to store the original mode and last modified time of the file being added, and ipfs files stat /ipfs/CID
can be used for inspecting these optional attributes:
$ touch ./file
$ chmod 654 ./file
$ ipfs add --preserve-mode --preserve-mtime -Q ./file
QmczQr4XS1rRnWVopyg5Chr9EQ7JKpbhgnrjpb5kTQ1DKQ
$ ipfs files stat /ipfs/QmczQr4XS1rRnWVopyg5Chr9EQ7JKpbhgnrjpb5kTQ1DKQ
QmczQr4XS1rRnWVopyg5Chr9EQ7JKpbhgnrjpb5kTQ1DKQ
Size: 0
CumulativeSize: 22
ChildBlocks: 0
Type: file
Mode: -rw-r-xr-- (0654)
Mtime: 13 Aug 2024, 21:15:31 UTC
The CLI and HTTP RPC options --mode
, --mtime
and --mtime-nsecs
can be used to set them to arbitrary values.
Opt-in support for mode
and mtime
was also added to MFS (ipfs files --help
). For more information see --help
text of ipfs files touch|stat|chmod
commands.
Modification time support was also added to the Gateway. If present, value from file's dag-pb is returned in Last-Modified
HTTP header and requests made with If-Modified-Since
can produce HTTP 304 not modified response.
Note
Storing mode
and mtime
requires root block to be dag-pb
and disabled raw-leaves
setting to create envelope for storing the metadata.
AutoNAT V2 Service Introduced Alongside V1
The AutoNAT service enables nodes to determine their public reachability on the internet. AutoNAT V2 enhances this protocol with improved features. In this release, Kubo will offer both V1 and V2 services to other peers, although it will continue to use only V1 when acting as a client. Future releases will phase out V1, transitioning clients to utilize V2 exclusively.
For more details, see the Deployment Plan for AutoNAT V2 and AutoNAT
configuration options.
Automated ipfs version check
Kubo now performs privacy-preserving version checks using the libp2p identify protocol on peers detected by the Amino DHT client.
If more than 5% of Kubo peers seen by your node are running a newer version, you will receive a log message notification.
- For manual checks, refer to
ipfs version check --help
for details. - To disable automated checks, set
Version.SwarmCheckEnabled
tofalse
.
Version Suffix Configuration
Defining the optional agent version suffix is now simpler. The Version.AgentSuffix
value from the Kubo config takes precedence over any value provided via ipfs daemon --agent-version-suffix
(which is still supported).
Note
Setting a custom version suffix helps with ecosystem analysis, such as Amino DHT reports published at https://stats.ipfs.network
/unix/
socket support in Addresses.API
This release fixes a bug which blocked users from using Unix domain sockets for Kubo's RPC (instead of a local HTTP port).
$ ipfs config Addresses.API "/unix/tmp/kubo.socket"
$ ipfs daemon # start with rpc socket
...
RPC API server listening on /unix/tmp/kubo.socket
$ # cli client, in different terminal can find socket via /api file
$ cat $IPFS_PATH/api
/unix/tmp/kubo.socket
$ # or have it pased via --api
$ ipfs --api=/unix/tmp/kubo.socket id
Cleaned Up ipfs daemon
Startup Log
The ipfs daemon
startup output has been streamlined to enhance clarity and usability:
$ ipfs daemon
Initializing daemon...
Kubo version: 0.30.0
Repo version: 16
System version: amd64/linux
Golang version: go1.22.5
PeerID: 12D3KooWQ73s1CQsm4jWwQvdCAtc5w8LatyQt7QLQARk5xdhK9CE
Swarm listening on 127.0.0.1:4001 (TCP+UDP)
Swarm listening on 192.0.2.10:4001 (TCP+UDP)
Swarm listening on [::1]:4001 (TCP+UDP)
Swarm listening on [2001:0db8::10]:4001 (TCP+UDP)
Run 'ipfs id' to inspect announced and discovered multiaddrs of this node.
RPC API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready
The previous lengthy listing of all listener and announced multiaddrs has been removed due to its complexity, especially with modern libp2p nodes sharing multiple transports and long lists of /webtransport
and /webrtc-direct
certhashes.
The output now features a simplified list of swarm listeners, displayed in the format host:port (TCP+UDP)
, which provides essential information for debugging connectivity issues, particularly related to port forwarding.
Announced libp2p addresses are no longer printed on startup, because libp2p may change or augument them based on AutoNAT, relay, and UPnP state. Instead, users are prompted to run ipfs id
to obtain up-to-date list of listeners and announced multiaddrs in libp2p format.
Commands Preserve Specified Hostname
When executing a CLI command over Kubo RPC API, if a hostname is specified by --api=/dns4/<domain>/
the resulting HTTP request now contains the hostname, instead of the the IP address that the hostname resolved to, as was the previous behavior. This makes it easier for those trying to run Kubo behind a reverse proxy using hostname-based rules.
📝 Changelog
Full Changelog
- github.com/ipfs/kubo:
- chore: set version to 0.30.0
- chore: bump CurrentVersionNumber
- chore: boxo v0.23.0 and go-libp2p v0.36.3 (#10507) (ipfs/kubo#10507)
- fix: switch back to go 1.22 (#10502) (ipfs/kubo#10502)
- chore: update go-unixfsnode, cmds, and boxo (#10494) (ipfs/kubo#10494)
- fix(cli): preserve hostname specified with --api in http request headers (#10497) (ipfs/kubo#10497)
- chore: upgrade to go 1.23 (#10486) (ipfs/kubo#10486)
- fix: error during config when running benchmarks (#10495) ([#10495](https://gi...
v0.30.0-rc3
Changelog: docs/changelogs/v0.30.md
v0.30.0-rc2
Warning
This RC2 has to be run with GODEBUG=asynctimerchan=1
environment variable due to regression caused by go 1.23 described in #10501
Changelog: docs/changelogs/v0.30.md
v0.30.0-rc1
Changelog: docs/changelogs/v0.30.md
v0.29.0
Overview
🔦 Highlights
Add search functionality for pin names
It is now possible to search for pins by name via ipfs pin ls --name "SomeName"
.
The search is case-sensitive and will return all pins that contain the specified substring in their name.
Tip
The ipfs pin ls -n
is now a shorthand for ipfs pin ls --name
, mirroring the behavior of ipfs pin add
.
See ipfs pin ls --help
for more information.
Customizing ipfs add
defaults
This release supports overriding global data ingestion defaults used by commands like ipfs add
via user-defined Import.*
configuration options.
The hash function, CID version, or UnixFS raw leaves and chunker behaviors can be set once, and used as the new implicit default for ipfs add
.
Tip
As a convenience, two CID profiles are provided: legacy-cid-v0
and test-cid-v1
.
A test profile that defaults to modern CIDv1 can be applied via ipfs config profile apply test-cid-v1
.
We encourage users to try it and report any issues in kubo#4143.
📝 Changelog
Full Changelog
- github.com/ipfs/kubo:
- fix(cli): unify --name param in ls and add (#10439) (ipfs/kubo#10439)
- chore: set version to 0.29.0-rc2
- fix(libp2p): streams config validation in resource manager (#10435) (ipfs/kubo#10435)
- chore: update version
- chore: libp2p 0.34.1 (#10429) (ipfs/kubo#10429)
- refactor: stop using github.com/pkg/errors (#10431) (ipfs/kubo#10431)
- chore: fix --help text
- config: introduce Import section (#10421) (ipfs/kubo#10421)
- feat: enables searching pins by name (#10412) (ipfs/kubo#10412)
- fix(fuse): ipfs path parsing (#10243) (ipfs/kubo#10243)
- core/node: fix divide by zero fatal crash for reprovide rate check (#10411) (ipfs/kubo#10411)
- chore: bump to go-ipfs-cmds @ v0.11
- chore: create next changelog
- Merge Release: v0.28.0 [skip changelog] (ipfs/kubo#10402)
- docs: update release checklist (#10401) (ipfs/kubo#10401)
- chore: update version
- github.com/ipfs/boxo (v0.19.0 -> v0.20.0):
- Release v0.20.0 (ipfs/boxo#613)
- github.com/ipfs/go-blockservice (v0.5.0 -> v0.5.2):
- docs: remove contribution section
- chore: bump version
- chore: deprecate types and readme
- chore: release v0.5.1
- fix: remove busyloop in getBlocks by removing batching
- github.com/ipfs/go-ipfs-blockstore (v1.3.0 -> v1.3.1):
- docs: remove contribution section
- chore: bump version
- chore: deprecate types and readme
- github.com/ipfs/go-ipfs-cmds (v0.10.0 -> v0.11.0):
- chore: release v0.11.0 (#253) (ipfs/go-ipfs-cmds#253)
- chore: update deps (#252) (ipfs/go-ipfs-cmds#252)
- chore: release 0.10.2 (#251) (ipfs/go-ipfs-cmds#251)
- fix(http): return error in case of panic (#250) (ipfs/go-ipfs-cmds#250)
- chore: release v0.10.1
- github.com/ipfs/go-ipfs-ds-help (v1.1.0 -> v1.1.1):
- docs: remove contribution section
- chore: bump version
- chore: deprecate types and readme
- github.com/ipfs/go-ipfs-exchange-interface (v0.2.0 -> v0.2.1):
- chore: bump version
- Deprecate types and readme (#29) (ipfs/go-ipfs-exchange-interface#29)
- docs: Add proper documenation to the interface.
- github.com/ipfs/go-verifcid (v0.0.2 -> v0.0.3):
- chore: bump version
- chore: deprecate types and readme
- Make poseidon hashes good hashes (ipfs/go-verifcid#19)
- sync: update CI config files (#18) (ipfs/go-verifcid#18)
- github.com/ipld/go-car (v0.5.0 -> v0.6.2):
- v0.6.2 (ipld/go-car#464)
- fix: opt-in way to allow empty list of roots in CAR headers (ipld/go-car#461)
- feat: add inverse and version to filter cmd (ipld/go-car#457)
- v0.6.1 bump
- chore: update usage of merkledag by go-car (#437) (ipld/go-car#437)
- feat(cmd/car): add '--no-wrap' option to 'create' command (ipld/go-car#432)
- fix: remove github.com/ipfs/go-ipfs-blockstore dependency
- feat: expose index for StorageCar
- perf: reduce NewCarReader allocations
- fix(deps): update deps for cmd (use master go-car and go-car/v2 for now)
- fix: new error strings from go-cid
- fix: tests should match stderr for verbose output
- fix: reading from stdin should broadcast EOF to block loaders
- refactor insertion index to be publicly accessible (ipld/go-car#408)
- chore: unmigrate from go-libipfs
- Create CODEOWNERS
- blockstore: give a direct access to the index for read operations
- blockstore: only close the file on error in OpenReadWrite, not OpenReadWriteFile
- fix: handle (and test) WholeCID vs not; fast Has() path for storage
- ReadWrite: faster Has() by using the in-memory index instead of reading on disk
- fix: let
extract
skip missing unixfs shard links - fix: error when no files extracted
- fix: make -f optional, read from stdin if omitted
- fix: update cmd/car/README with latest description
- chore: add test cases for extract modes
- feat: extract accepts '-' as an output path for stdout
- feat: extract specific path, accept stdin as streaming input
- fix: if we don't read the full block data, don't error on !EOF
- blockstore: try to close during Finalize(), even in case of previous error
- ReadWrite: add an alternative FinalizeReadOnly+Close flow
- feat: add WithTrustedCar() reader option (#381) (ipld/go-car#381)
- blockstore: fast path for AllKeysChan using the index
- fix: switch to crypto/rand.Read
- stop using the deprecated io/ioutil package
- fix(doc): fix storage package doc formatting
- fix: return errors for unsupported operations
- chore: move insertionindex into store pkg
- chore: add experimental note
- fix: minor lint & windows fd test problems
- feat: docs for StorageCar interfaces
- feat: ReadableWritable; dedupe shared code
- feat: add Writable functionality to StorageCar
- feat: StorageCar as a Readable storage, separate from blockstore
- feat(blockstore): implement a streaming read only storage
- feat(cmd): add index create subcommand to create an external carv2 index (ipld/go-car#350)
- chore: bump version to 0.6.0
- fix: use goreleaser instead
- Allow using WalkOption in WriteCar function (ipld/go-car#357)
- fix: update go-block-format to the version that includes the stubs
- feat: upgrade from go-block-format to go-libipfs/blocks
- cleanup readme a bit to make the cli more discoverable (#353) (ipld/go-car#353)
- Update install instructions in README.md
- Add a debugging form for car files. (#341) (ipld/go-car#341)
- (ipld/go-car#340)
- add a
SkipNext
method on block reader (#338) (ipld/go-car#338) - feat: Has() and Get() will respect StoreIdentityCIDs option
- github.com/libp2p/go-libp2p (v0.33.2 -> v0.34.1):
- release v0.34.1 (#2811) (libp2p/go-libp2p#2811)
- config: fix Insecure security constructor (#2810) (libp2p/go-libp2p#2810)
- rcmgr: Backwards compatibility if you wrap default impl (#2805) (libp2p/go-libp2p#2805)
- v0.34.0 (#2795) (libp2p/go-libp2p#2795)
- swarm: fix addr for TestBlackHoledAddrBlocked (#2803) (libp2p/go-libp2p#2803)
- Add backwards compatibility with old well-known resource (#2798) (libp2p/go-libp2p#2798)
- rcmgr: remove a connection only once from the limiter (#2800) (libp2p/go-libp2p#2800)
- Adhere to request.Context when roundtripping on a stream (#2796) (libp2p/go-libp2p#2796)
- fix: Set missing deadlines (#2794) (libp2p/go-libp2p#2794)
- rcmgr: Add conn_limiter to limit number of conns per ip cidr (#2788) (libp2p/go-libp2p#2788)
- identify: refactor observed address manager to do...
v0.29.0-rc2
Changelog: docs/changelogs/v0.29.md
v0.29.0-rc1
Changelog: docs/changelogs/v0.29.md
v0.28.0
Overview
RPC client: removed deprecated DHT API
The deprecated DHT API commands in the RPC client have been removed. Instead, use the Routing API.
Gateway: /api/v0
is removed
The legacy subset of the Kubo RPC that was available via the Gateway port and was deprecated is now completely removed. You can read more in #10312.
If you have a legacy software that relies on this behavior, and want to expose parts of /api/v0
next to /ipfs
, use reverse-proxy in front of Kubo to mount both Gateway and RPC on the same port. NOTE: exposing RPC to the internet comes with security risk: make sure to specify access control via API.Authorizations.
Removed deprecated Object API commands
The Object API commands deprecated back in 2021 have been removed, except for object diff
, object patch add-link
and object patch rm-link
, whose alternatives have not yet been built (see issues 4801 and 4782).
Kubo ignores loopback addresses on LAN DHT and private addresses on WAN DHT
Kubo no longer keeps track of loopback and private addresses on the LAN and WAN DHTs, respectively. This means that other nodes will not try to dial likely undialable addresses.
To support testing scenarios where multiple Kubo instances run on the same machine, Routing.LoopbackAddressesOnLanDHT
is set to true
when the test
profile is applied.
Pin roots are now prioritized when announcing
The root CIDs of pinned content are now prioritized when announcing to the Amino DHT with Reprovider.Strategy
set to all
(default) or pinned
, making the important CIDs accessible faster.
📝 Changelog
Security Note: CVE-2024-22189 has been addressed by upgrading to quic-go v0.42.0.
Full Changelog
- github.com/ipfs/kubo:
- chore: update version
- chore: update version
- core/node: prioritize announcing pin roots, and flat strategy (#10376) (ipfs/kubo#10376)
- chore: webui v4.2.1 (#10391) (ipfs/kubo#10391)
- docs(config): clarify RPC vs Gateway
- chore: upgrade go-libp2p-kad-dht (#10378) (ipfs/kubo#10378)
- chore(config): make Routing.AcceleratedDHTClient a Flag (#10384) (ipfs/kubo#10384)
- fix: switch lowpower profile to autoclient
- core: fix some typos (#10382) (ipfs/kubo#10382)
- docs: fix some typos (#10377) (ipfs/kubo#10377)
- core/commands!: remove deprecated object APIs (#10375) (ipfs/kubo#10375)
- docs: update default ipns lifetime
- coreapi/unixfs: don't create an additional IpfsNode for --only-hash
- chore: cleanup old workaround (#10369) (ipfs/kubo#10369)
- chore: finish reframe removal
- docs: remove repetitive words (#10370) (ipfs/kubo#10370)
- docs: updated links and refs to external resources (#10368) (ipfs/kubo#10368)
- core/corehttp!: remove /api/v0 from gateway port
- client/rpc!: remove deprecated DHT commands
- ci: upgrade to go 1.22 (#10355) (ipfs/kubo#10355)
- chore: create next changelog
- Merge Release: v0.27.0 [skip changelog] (ipfs/kubo#10362)
- test: cleanup content blocking tests (#10360) (ipfs/kubo#10360)
- docs: improve release issue template
- chore: update version
- github.com/ipfs/boxo (v0.18.0 -> v0.19.0):
- Release v0.19.0 (ipfs/boxo#598)
- github.com/libp2p/go-libp2p (v0.33.0 -> v0.33.2):
- chore: release v0.33.2 (#2755) (libp2p/go-libp2p#2755)
- Update quic-go to v0.42.0. Release v0.33.1 (#2741) (libp2p/go-libp2p#2741)
- github.com/libp2p/go-libp2p-kad-dht (v0.24.4 -> v0.25.2):
- chore: release v0.25.2 (libp2p/go-libp2p-kad-dht#961)
- add ctx canceled err check (libp2p/go-libp2p-kad-dht#960)
- chore: release v0.25.1
- perf: don't buffer the output of FindProvidersAsync
- chore: use go-libp2p-routing-helpers for tracing needs
- fix: properly iterate in tracing for protocol messenger
- fix: apply addrFilters in the dht (#872) (libp2p/go-libp2p-kad-dht#872)
- Add provider record addresses to peerstore (libp2p/go-libp2p-kad-dht#870)
- chore: release v0.25.0
- tracing: add protocol messages client tracing
- Enhance handleNewMessage Server Mode Logging: Convert Error Logs to Debug Level (libp2p/go-libp2p-kad-dht#860)
- tracing: fix DHT keys as string attribute not being valid utf-8 (libp2p/go-libp2p-kad-dht#859)
- merge: fix: issues discovered in kubo v0.21.0-rc2 (#853) (libp2p/go-libp2p-kad-dht#853)
- merge: fix: issues discovered in kubo v0.21.0-rc1 (#851) (libp2p/go-libp2p-kad-dht#851)
- Release v0.24.0 (libp2p/go-libp2p-kad-dht#844)
- fix: don't add unresponsive DHT servers to the Routing Table (#820) (libp2p/go-libp2p-kad-dht#820)
- filter local addresses (for WAN) and localhost addresses (for LAN) (libp2p/go-libp2p-kad-dht#839)
- github.com/multiformats/go-multiaddr (v0.12.2 -> v0.12.3):
- chore: release v0.12.3 (multiformats/go-multiaddr#240)
- chore: Expand comment ForEach (multiformats/go-multiaddr#238)
- .Decapsulate by Components (multiformats/go-multiaddr#239)
- github.com/whyrusleeping/cbor-gen (v0.0.0-20240109153615-66e95c3e8a87 -> v0.1.0):
- Nullable ints (#93) (whyrusleeping/cbor-gen#93)
- Introduce Gen{} struct for configurability (whyrusleeping/cbor-gen#94)
- Transparent encoding (whyrusleeping/cbor-gen#91)
- turn max length consts into global vars (whyrusleeping/cbor-gen#92)
👨👩👧👦 Contributors
Contributor | Commits | Lines ± | Files Changed |
---|---|---|---|
Henrique Dias | 19 | +867/-2806 | 96 |
Rod Vagg | 7 | +921/-475 | 25 |
Marcin Rataj | 8 | +358/-344 | 18 |
Guillaume Michel - guissou | 1 | +145/-485 | 13 |
Jorropo | 8 | +429/-136 | 22 |
Łukasz Magiera | 4 | +284/-48 | 11 |
whyrusleeping | 1 | +90/-90 | 2 |
Michael Muré | 2 | +48/-73 | 9 |
Marco Munizaga | 6 | +86/-29 | 10 |
guillaumemichel | 3 | +93/-1 | 3 |
Marten Seemann | 1 | +31/-4 | 4 |
godeamon | 3 | +11/-8 | 3 |
shuangcui | 1 | +6/-6 | 5 |
occupyhabit | 1 | +3/-3 | 3 |
crazehang | 1 | +2/-2 | 1 |
Dennis Trautwein | 1 | +1/-2 | 1 |
“GheisMohammadi” | 1 | +1/-1 | 1 |
web3-bot | 1 | +2/-0 | 1 |
Daniel Norman | 1 | +1/-1 | 1 |