All notable changes to this project will be documented in this file.
Note:
- The format is based on Keep a Changelog.
- This project adheres to Semantic Versioning. ( More notes about versioning and our release policies are here.
The following emojis are used to highlight certain changes:
- 🛠 - BREAKING CHANGE. Action is required if you use this functionality.
- ✨ - Noteworthy change to be aware of.
routing/http/server
: added built-in Prometheus instrumentation to http delegated/routing/v1/
endpoints, with custom buckets for response size and duration to match real world data observed at thedelegated-ipfs.dev
instance. #718 #724routing/http/server
: added configurable routing timeout (DefaultRoutingTimeout
being 30s) to prevent indefinite hangs during content/peer routing. Set custom duration viaWithRoutingTimeout
. #720
- No longer using
github.com/jbenet/goprocess
to avoid requiring in dependents. #710
go.mod
updates
bitswap/client
no longer logs"Received provider X for cid Y not requested
to ERROR level, moved to DEBUG #771
- updated to go-libp2p to v0.37.0
ipns/pb
: removed use of deprecatedExporter
(SA1019, golang/protobuf#1640, 9a7055)
bitswap/client
: fix panic if current live count is greater than broadcast limit #702
routing/http/client
: creating delegated routing client withNew
now defaults to querying delegated routing server withDefaultProtocolFilter
(IPIP-484) #689- updated go-libp2p to v0.36.5
- updated dependencies #693
- update
go-libp2p-kad-dht
to v0.27.0
routing/http/client
: optional address and protocol filter parameters from IPIP-484 use human-readable,
instead of%2C
. #688bitswap/client
Cleanup live wants when wants are canceled. This prevents live wants from continuing to get rebroadcasted even after the wants are canceled. #690- Fix problem adding invalid CID to exhausted wants list resulting in possible performance issue. #692
boxo/bitswap/server
:- A new
WithWantHaveReplaceSize(n)
option can be used withbitswap.New
to fine-tune cost-vs-performance. It sets the maximum size of a block in bytes up to which the bitswap server will replace a WantHave with a WantBlock response. Setting this to 0 disables this WantHave replacement and means that block sizes are not read when processing WantHave requests. #672
- A new
routing/http
:- added support for address and protocol filtering to the delegated routing server (IPIP-484) #671 #678
- added support for address and protocol filtering to the delegated routing client (IPIP-484) #678. To add filtering to the client, use the
WithFilterAddrs
andWithFilterProtocols
options when creating the client.Client-side filtering for servers that don't support filtering is enabled by default. To disable it, use thedisableLocalFiltering
option when creating the client.
unixfs/hamt
Log error instead of panic if both link and shard are nil #393
files
,ipld/unixfs
,mfs
andtar
now support optional UnixFS 1.5 mode and modification time metadata #653gateway
deserialized responses will haveLast-Modified
set to value from optional UnixFS 1.5 modification time field (if present in DAG) and a matchingIf-Modified-Since
will return304 Not Modified
(UnixFS 1.5 files only) #659
- updated Go in
go.mod
to 1.22 #661 - updated go-libp2p to v0.36.3
chunker
refactored to reduce overall memory use by reducing heap fragmentation #649bitswap/server
minor performance improvements in concurrent operations #666- removed dependency on go-ipfs-blocksutil #656
go-libp2p
dependency updated to v0.36 (release notes)bitswap/server
minor memory use and performance improvements #634bitswap
unify logger names to use uniform format bitswap/path/pkgname #637gateway
now always returns meaningful cache-control headers for generated HTML listings of UnixFS directories #643util
generate random test data usingipfs/go-test
instead of internal util code #638bitswap/server
PeerLedger.Wants
now returnsbool
(interface change fromWants(p peer.ID, e wl.Entry)
toWants(p peer.ID, e wl.Entry) bool
) #629
boxo/gateway
now correctly returns 404 Status Not Found instead of 500 when the requested content cannot be found due to offline exchange, gateway running in no-fetch (non-recursive) mode, or a similar restriction that only serves a specific set of CIDs. #630bitswap/client
fix memory leak in BlockPresenceManager due to unlimited map growth. #636bitswap/network
fixed race condition when a timeout occurred before hole punching completed while establishing a first-time stream to a peer behind a NAT #651bitswap
: wantlist overflow handling now cancels existing entries to make room for newer entries. This fix prevents the wantlist from filling up with CIDs that the server does not have. #629
boxo/gateway
is now tested against gateway-conformance v6bitswap/client
supports additional tracing
- 🛠
routing/none
removedConstructNilRouting
, if you need this functionality you can use the Null Router from go-libp2p-routing-helpers.
routing/http
: theFindPeer
now returnsrouting.ErrNotFound
when no addresses are foundrouting/http
: theFindProvidersAsync
no longer causes a goroutine buildup
- ✨
gateway
has new backend possibilities:NewRemoteBlocksBackend
allows you to create a gateway backend that uses one or multiple other gateways as backend. These gateways must support RAW block requests (application/vnd.ipld.raw
), as well as IPNS Record requests (application/vnd.ipfs.ipns-record
). With this, we also introducedNewCacheBlockStore
,NewRemoteBlockstore
andNewRemoteValueStore
.NewRemoteCarBackend
allows you to create a gateway backend that uses one or multiple Trustless Gateways as backend. These gateways must support CAR requests (application/vnd.ipld.car
), as well as the extensions describe in IPIP-402. With this, we also introducedNewCarBackend
,NewRemoteCarFetcher
andNewRetryCarFetcher
.
gateway
now sets theContent-Location
header for requests with non-default content format, as a result of content negotiation. This allows generic and misconfigured HTTP caches to store Deserialized, CAR and Block responses separately, under distinct cache keys.gateway
now supportscar-dups
,car-order
andcar-version
as query parameters in addition to theapplication/vnd.ipld.car
parameters sent viaAccept
header. The parameters in theAccept
header have always priority, but including them in URL simplifies HTTP caching and allows use inContent-Location
header on CAR responses to maximize interoperability with wide array of HTTP caches.bitswap/server
now allows to override the default peer ledger withWithPeerLedger
.
routing/http/server
now returns 404 Status Not Found when no records can be found.routing/http/server
now supports legacy RSA PeerIDs encoded as Base58 Multihash
routing/http/server
now addsCache-Control
HTTP header to GET requests: 15 seconds for empty responses, or 5 minutes for responses with providers.routing/http/server
the/ipns
endpoint is more friendly to users opening URL in web browsers: returnsContent-Disposition
header and defaults toapplication/vnd.ipfs.ipns-record
response whenAccept
is missing.provider
:- Exports a
NewPrioritizedProvider
, which can be used to prioritize certain providers while ignoring duplicates. - 🛠️
NewPinnedProvider
now prioritizes root blocks, even ifonlyRoots
is set tofalse
.
- Exports a
go
version changed to 1.21
- 🛠️
routing/http/server
: delegated peer routing endpoint now supports both PeerID string notaitons from libp2p specs. bitswap
: add missing clientWithBlockReceivedNotifier
andWithoutDuplicatedBlockStats
options to the exchange.
blockservice
now hasContextWithSession
andEmbedSessionInContext
functions, which allows to embed a session in a context. Future calls toBlockGetter.GetBlock
,BlockGetter.GetBlocks
andNewSession
will use the session in the context.blockservice.NewWritethrough
deprecated function has been removed, instead you can doblockservice.New(..., ..., WriteThrough())
like previously.gateway
: a new header configuration middleware has been added to replace the existing header configuration, which can be used more generically.namesys
now has aWithMaxCacheTTL
option, which allows you to define a maximum TTL that will be used for caching IPNS entries.
- 🛠
boxo/gateway
: when making a trustless CAR request with the "entity-bytes" parameter, using a negative index greater than the underlying entity length could trigger reading more data than intended - 🛠
boxo/gateway
: the header configurationConfig.Headers
andAddAccessControlHeaders
has been replaced by the new middleware provided byNewHeaders
. - 🛠
routing/http/client
: the default HTTP client is no longer a global singleton. Therefore, usingWithUserAgent
won't modify the user agent of existing routing clients. This will also prevent potential race conditions. In addition, incompatible options will now return errors instead of silently failing.
- 🛠
pinning/pinner
: you can now give a custom name when pinning a CID. To reflect this, thePinner
has been adjusted. Note that callingPin
for the same CID with a different name will replace its current name by the newly given name.
- 🛠
tracing
jaeger
exporter has been removed due to it's deprecation and removal from upstream, you should useotlp
exporter instead. See the docs for an example.
- 🛠
boxo/namesys
: now fails when multiple valid DNSLink entries are found for the same domain. This used to cause undefined behavior before. Now, we return an error, according to the specification.
- 🛠
boxo/gateway
: removed support for undocumented legacyipfs-404.html
. Use_redirects
instead. - 🛠
boxo/namesys
: removed support for legacy DNSLink entries at the root of the domain. Use_dnslink.
TXT record instead. - 🛠
boxo/coreapi
, an intrinsic part of Kubo, has been removed and moved tokubo/core/coreiface
.
boxo/gateway
- a panic (which is recovered) could sporadically be triggered inside a CAR request, if the right conditions were met.
- no longer emits
http: superfluous response.WriteHeader
warnings when an error happens.
- 🛠 Bumped to
go-libp2p
0.32.
boxo/gateway
:- A new
WithResolver(...)
option can be used withNewBlocksBackend(...)
allowing the user to pass their customResolver
implementation. - The gateway now sets a
Cache-Control
header for requests under the/ipns/
namespace if the TTL for the corresponding IPNS Records or DNSLink entities is known.
- A new
boxo/bitswap/client
:- A new
WithoutDuplicatedBlockStats()
option can be used withbitswap.New
andbsclient.New
. This disable accounting for duplicated blocks, which requires ablockstore.Has()
lookup for every received block and thus, can impact performance.
- A new
- ✨ Migrated repositories into Boxo
github.com/ipfs/kubo/peering
=>./peering
A service which establish, overwatch and maintain long lived connections.github.com/ipfs/kubo/core/bootstrap
=> `./bootstrap A service that maintains connections to a number of bootstrap peers.
boxo/gateway
- 🛠 The
IPFSBackend
interface was updated to make the responses of theHead
method more explicit. It now returns aHeadResponse
instead of afiles.Node
.
- 🛠 The
boxo/routing/http/client.Client
is now exported. This means you can now pass it around functions, or add it to a struct if you want.- 🛠 The
path
package has been massively refactored. With this refactor, we have condensed the different path-related and/or Kubo-specific packages under a single generic one. Therefore, there are many breaking changes. Please consult the documentation for more details on how to use the new package.- Note: content paths created with
boxo/path
are automatically normalized:- Replace multiple slashes with a single slash.
- Eliminate each
.
path name element (the current directory). - Eliminate each inner
..
path name element (the parent directory) along with the non-..
element that precedes it. - Eliminate
..
elements that begin a rooted path: that is, replace "/..
" by "/
" at the beginning of a path.
- Note: content paths created with
- 🛠 The signature of
CoreAPI.ResolvePath
incoreiface
has changed to now return the remainder segments as a second return value, matching the signature ofresolver.ResolveToLastNode
. - 🛠
routing/http/client.FindPeers
now returnsiter.ResultIter[types.PeerRecord]
instead ofiter.ResultIter[types.Record]
. The specification indicates that records for this method will always be Peer Records. - 🛠 The
namesys
package has been refactored. The following are the largest modifications:- The options in
coreiface/options/namesys
have been moved tonamesys
and their names have been made more consistent. - Many of the exported structs and functions have been renamed in order to be consistent with the remaining packages.
namesys.Resolver.Resolve
now returns a TTL, in addition to the resolved path. If the TTL is unknown, 0 is returned.IPNSResolver
is able to resolve a TTL, whileDNSResolver
is not.namesys/resolver.ResolveIPNS
has been moved tonamesys.ResolveIPNS
and now returns a TTL in addition to the resolved path.
- The options in
- ✨
boxo/ipns
record defaults follow recommendations from IPNS Record Specification:DefaultRecordTTL
is now set to1h
DefaultRecordLifetime
follows the increased expiration window of Amino DHT (go-libp2p-kad-dht#793) and is set to48h
- 🛠 The
gateway
'sIPFSBackend.ResolveMutable
is now expected to return a TTL in addition to the resolved path. If the TTL is unknown, 0 should be returned.
- 🛠
util.MultiErr
has been removed. Please use Go's native support for wrapping errors, orerrors.Join
instead.
- An option
DisableHTMLErrors
has been added togateway.Config
. When this option istrue
, pretty HTML error pages for web browsers are disabled. Instead, atext/plain
page with the raw error message as the body is returned.
- ✨ The
routing/http
implements Delegated Peer Routing introduced in IPIP-417.
- 🛠 The
routing/http
package received the following modifications:- Client
GetIPNSRecord
andPutIPNSRecord
have been renamed toGetIPNS
andPutIPNS
, respectively. Similarly, the required function names in the serverContentRouter
have also been updated. ReadBitswapProviderRecord
has been renamed toBitswapRecord
and marked as deprecated. From now on, please use the protocol-agnosticPeerRecord
for most use cases. The new Peer Schema has been introduced in IPIP-417.
- Client
- 🛠 The
routing/http
package experienced following removals:- Server and client no longer support the experimental
Provide
method.ProvideBitswap
is still usable, but marked as deprecated. A protocol-agnostic provide mechanism is being worked on in IPIP-378. - Server no longer exports
FindProvidersPath
andProvidePath
.
- Server and client no longer support the experimental
- The normalization of DNSLink identifiers in
gateway
has been corrected in the edge case where the value passed to the path component of the URL is already normalized.
- The
routing/http
client and server now support Delegated IPNS at/routing/v1
as per IPIP-379. - 🛠 The
verifycid
package has been updated with the new Allowlist interface as part of reducing globals efforts. - The
blockservice
andprovider
packages has been updated to accommodate for changes inverifycid
.
- 🛠
blockservice.New
now accepts a variadic of func options following the Functional Options pattern.
- HTTP Gateway API: Not having a block will result in a 5xx error rather than 404
- HTTP Gateway API: CAR requests will return 200s and a CAR file proving a requested path does not exist rather than returning an error
- 🛠
MultiFileReader
has been updated with a new header with the encoded file name instead of the plain filename, due to a regression found innet/textproto
. This only affects files with binary characters in their name. By keeping the old header, we maximize backwards compatibility.New Client Old Client New Server ✅ 🟡* Old Server ✅ ✅ *Old clients can only send Unicode file paths to the server.
- ✨ The gateway now supports the optional
order
anddups
CAR parameters from IPIP-412.- The
BlocksBackend
only implementsorder=dfs
(Depth-First Search) ordering, which was already the default behavior. - If a request specifies no
dups
, response withdups=n
is returned, which was already the default behavior. - If a request explicitly specifies a CAR
order
other thandfs
, it will result in an error. - The only change to the default behavior on CAR responses is that we follow
IPIP-412 and make
order=dfs;dups=n
explicit in the returnedContent-Type
HTTP header.
- The
- ✨ While the call signature remains the same, the blocks that Bitswap returns can now be cast to traceability.Block, which will additionally tell you where the Block came from and how long it took to fetch. This helps consumers of Bitswap collect better metrics on Bitswap behavior.
- 🛠 The
ipns
package has been refactored.- You should no longer use the direct Protobuf version of the IPNS Record.
Instead, we have a shiny new
ipns.Record
type that wraps all the required functionality to work the best as possible with IPNS v2 Records. Please check the documentation for more information, and follow ipfs/specs#376 for related IPIP. - There is no change to IPNS Records produced by
boxo/ipns
, it still produces both V1 and V2 signatures by default, it is still backward-compatible.
- You should no longer use the direct Protobuf version of the IPNS Record.
Instead, we have a shiny new
- 🛠
ipld/car
has been removed. Please use ipld/go-car instead. More information regarding this decision can be found in issue 218.
- Removed mentions of unused ARC algorithm (#336)
- Handle
_redirects
file whenIf-None-Match
header is present (#412)
- Handle
_redirects
file whenIf-None-Match
header is present (#412)
- Gateway: include CORS on subdomain redirects.
- Gateway: ensure 'X-Ipfs-Root' header is valid.
None.
None.
None.
- Allow CAR requests with a path when
DeserializedResponses
isfalse
.
None.
- ✨ The gateway now supports partial CAR exports via query parameters from IPIP-402.
- 🛠 A few trivial breaking changes have been done to the gateway:
- The signature of
IPFSBackend.GetCAR
has been adapted to support IPIP-402 CAR Parameters. - A few variables have been renamed for consistency:
WithHostname
->NewHostnameHandler
Specification
->PublicGateway
NewErrorResponse
->NewErrorStatusCode
NewErrorResponseForCode
->NewErrorStatusCodeFromStatus
BlocksGateway
->BlocksBackend
BlocksGatewayOption
->BlocksBackendOption
NewBlocksGateway
->NewBlocksBackend
- Some functions that are not supposed to be outside of the package were removed:
ServeContent
.
- The signature of
None.
None.
None.
- ✨
gateway
The gateway were updated to provide better features for users and gateway implementers:- New human-friendly error messages.
- Updated, higher-definition icons in directory listings.
- Customizable menu items next to "About IPFS" and "Install IPFS".
- Valid DAG-CBOR and DAG-JSON blocks now provide a preview, where links can be followed.
ipns
addValidateWithPeerID
andUnmarshalIpnsEntry
helpers. (https://github.com/ipfs/boxo/pulls/292)- 🛠
coreiface/tests
add*testing.T
argument to the swarm provider. (https://github.com/ipfs/boxo/pulls/321)
- 🛠
boxo/pinner
some listing methods have been changed to now return a<-chan StreamedCid
. This allows the consumption of pins while the pinner is listing them, which for large pinset can take a long time. (https://github.com/ipfs/boxo/pulls/336) The concerned methods are:DirectKeys
RecursiveKeys
InternalKeys
- 🛠
provider/batched.New
has been moved toprovider.New
and arguments has been changed. (https://github.com/ipfs/boxo/pulls/273)- A routing system is now passed with the
provider.Online
option, by default the system run in offline mode (push stuff onto the queue). - When using
provider.Online
calling the.Run
method is not required anymore, the background worker is implicitly started in the background byprovider.New
. - You do not have to pass a queue anymore, you pass a
datastore.Datastore
exclusively.
- A routing system is now passed with the
- 🛠
provider.NewOfflineProvider
has been renamed toprovider.NewNoopProvider
to show more clearly that is does nothing. (https://github.com/ipfs/boxo/pulls/273) - 🛠
provider.Provider
andprovider.Reprovider
has been merged under oneprovider.System
. (https://github.com/ipfs/boxo/pulls/273) - 🛠
routing/http
responses now return a streamingiter.ResultIter
generic interface. (https://github.com/ipfs/boxo/pulls/18) - 🛠
coreiface
add options andAllowOffline
option toRoutingAPI.Put
. (https://github.com/ipfs/boxo/pulls/278) - 🛠
gateway
now has deserialized responses turned off by default. This can be configured viaDeserializedResponses
. (#252)
- 🛠
provider/queue
has been moved toprovider/internal/queue
. (https://github.com/ipfs/boxo/pulls/273) - 🛠
provider/simple
has been removed, now instead you can useprovider.New
because it accept non batched routing systems and use type assertion for theProvideMany
call, giving a single implementation. (https://github.com/ipfs/boxo/pulls/273) - 🛠
provider.NewSystem
has been removed,provider.New
now returns aprovider.System
directly. (https://github.com/ipfs/boxo/pulls/273)
gateway
fix panics by returning in all error cases. (https://github.com/ipfs/boxo/pulls/314)gateway
avoid duplicate payload during subdomain redirects. (https://github.com/ipfs/boxo/pulls/326)gateway
correctly handle question marks in URL when redirecting. (https://github.com/ipfs/boxo/pulls/#313)
None
gateway
trace context header support (#256)
gateway
widen duration histograms and cleanup (#265)
None
None
gateway
panic on path without enough components (#272)
None
- ✨ Migrated repositories into Boxo (#220)
- github.com/ipfs/interface-go-ipfs-core => ./coreiface
- github.com/ipfs/go-pinning-service-http-client => ./pinning/remote/client
- github.com/ipfs/go-path => ./path
- github.com/ipfs/go-namesys => ./namesys
- github.com/ipfs/go-mfs => ./mfs
- github.com/ipfs/go-ipfs-provider => ./provider
- github.com/ipfs/go-ipfs-pinner => ./pinning/pinner
- github.com/ipfs/go-ipfs-keystore => ./keystore
- github.com/ipfs/go-filestore => ./filestore
- github.com/ipfs/go-ipns => ./ipns
- github.com/ipfs/go-blockservice => ./blockservice
- github.com/ipfs/go-ipfs-chunker => ./chunker
- github.com/ipfs/go-fetcher => ./fetcher
- github.com/ipfs/go-ipfs-blockstore => ./blockstore
- github.com/ipfs/go-ipfs-posinfo => ./filestore/posinfo
- github.com/ipfs/go-ipfs-util => ./util
- github.com/ipfs/go-ipfs-ds-help => ./datastore/dshelp
- github.com/ipfs/go-verifcid => ./verifcid
- github.com/ipfs/go-ipfs-exchange-offline => ./exchange/offline
- github.com/ipfs/go-ipfs-routing => ./routing
- github.com/ipfs/go-ipfs-exchange-interface => ./exchange
- github.com/ipfs/go-unixfs => ./ipld/unixfs
- github.com/ipfs/go-merkledag => ./ipld/merkledag
- github.com/ipld/go-car => ./ipld/car
- ✨ Added a migration tool to aid in migrating from the migrated repositories to Boxo, see the documentation here: https://github.com/ipfs/boxo/blob/main/README.md#migrating-to-boxo (#226)
- Added a check to ensure the migration tool is only run in a Git repository (with an optional override flag)
- ✨ Added tracing and metrics to the refactored gateway for its IPFS backend
- Removed a mention of "bitswap" in blockservice debug logs
- Changed the Bitswap message package from "bitswap.message.pb" to "bitswap.message.v1.pb" to avoid protobuf panics due to duplicate registration with go-bitswap (#212)
- ✨ Remove a busyloop in blockservice getBlocks by removing batching when caching (#232)
None
None
- Ensure dag-cbor/json codecs are registered in the gateway handler (#223)
- ✨ Refactor the Gateway API to operate on higher level semantics (#176)
- Fixed a panic in the gateway handler when returning errors (#255)
None