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.
cmd/boxo-migrate: removed code for go-ipfs migration -- no longer needed.cmd/deprecator: removed code to deprecare relocated ipfs packages -- no longer needed.
ipld/unixfs/io: addedSizeEstimationModefor configurable HAMT sharding threshold decisions. Supports legacy link-based estimation (SizeEstimationLinks), accurate block-based estimation (SizeEstimationBlock), or disabling size-based thresholds (SizeEstimationDisabled). #1088, IPIP-499ipld/unixfs/io: addedUnixFSProfilewithUnixFS_v0_2015andUnixFS_v1_2025presets for CID-deterministic file and directory DAG construction. #1088, IPIP-499files:NewSerialFileWithOptionsnow supports controlling whether symlinks are preserved or dereferenced before being added to IPFS. SeeSerialFileOptions.DereferenceSymlinks. #1088, IPIP-499
- 🛠
chunker,ipld/unixfs/importer/helpers: block size limits raised from 1MiB to 2MiB to match the bitswap spec. Max chunker size is2MiB - 256 bytesto leave room for protobuf framing when--raw-leaves=false. IPIP-499 profiles use lower chunk sizes (256KiB and 1MiB) and are not affected. - 🛠
chunker:DefaultBlockSizechanged fromconsttovarto allow runtime configuration via global profiles. #1088, IPIP-499 gateway: 🛠 ✨ IPIP-523?format=URL query parameter now takes precedence overAcceptHTTP header, ensuring deterministic HTTP cache behavior and allowing browsers to use?format=even when they sendAcceptheaders with specific content types. #1074gateway: 🛠 ✨ IPIP-524 codec conversions (e.g., dag-pb to dag-json, dag-json to dag-cbor) are no longer performed by default. Requesting a format that differs from the block's codec now returns HTTP 406 Not Acceptable with a hint to fetch raw blocks (?format=raw) and convert client-side. SetConfig.AllowCodecConversiontotrueto restore the old behavior. #1077gateway: compliance with gateway-conformance v0.10.0 (since v0.8: relaxed DAG-CBOR HTML preview cache headers, relaxed CAR 200/404 for missing paths, IPIP-523 format query precedence, IPIP-524 codec mismatch returns 406)- upgrade to
go-ipld-primev0.22.0 - upgrade to
go-libp2p-kad-dhtv0.38.0
tracing: opentelemetry zipkin exporter (go.opentelemetry.io/otel/exporters/zipkin) is deprecated and has been removed. It is recommended to switch to OTLP. Configure your application to send traces using OTLP and enable Zipkin’s OTLP ingestion support.
- 🛠
ipld/unixfs/io: fixed HAMT sharding threshold comparison to use>instead of>=. A directory exactly at the threshold now stays as a basic (flat) directory, aligning behavior with code documentation and the JS implementation. This is a theoretical breaking change, but unlikely to impact real-world users as it requires a directory to be exactly at the threshold boundary. If you depend on the old behavior, adjustHAMTShardingSizeto be 1 byte lower. #1088, IPIP-499 ipld/unixfs/mod: fixed sparse file writes in MFS. Writing past the end of a file (e.g.,ipfs files write --offset 1000 /fileon a smaller file) would lose data becauseexpandSparsecreated the zero-padding node but didn't update the internal pointer. Subsequent writes went to the old unexpanded node.ipld/unixfs/io: fixed mode/mtime metadata loss during Basic<->HAMT directory conversions. Previously, directories withWithStat(mode, mtime)would lose this metadata when converting between basic and sharded formats, or when reloading a HAMT directory from disk.
routing/http:GET /routing/v1/dht/closest/peers/{key}per IPIP-476ipld/merkledag: Added fetched node size reporting to the progress tracker. See kubo#8915gateway: Added a configurable fallback timeout for the gateway handler, defaulting to 1 hour. Configurable viaMaxRequestDurationin the gateway config.
keystore: improve error messages and include key file name #1080- upgrade to
go-libp2p-kad-dhtv0.37.1 - upgrade to
go-libp2pv0.47.0
bitswap/network: Fixed goroutine leak that could cause bitswap to stop serving blocks after extended uptime. The root cause isstream.Close()blocking indefinitely when remote peers are unresponsive during multistream handshake (go-libp2p#3448). This PR (#1083) adds a localized fix specific to bitswap'sSendMessageby setting a read deadline before closing streams.
- upgrade to
go-libp2pv0.45.0 - upgrade to
go-log/v2v2.9.0- Applications using go-log (>=2.9)+go-libp2p(>=0.45) may need to initialize their application to bridge slog-based libraries to into go-log. See documentation for go-log release and slog integration.
- new span for the
handleIncomingbitswap clientgetterplus events when blocks are received. - mark opentelemetry spans, span attributes, and span events as being used by ProbeLab's analysis scripts
- upgrade to
go-dsqueuev0.1.0 - Fixes batch reuse that could cause panic.
gateway: Fixed duplicate peer IDs appearing in retrieval timeout error messagesbitswap/client: fix tracing by using context to pass trace and retrieval state to session #1059bitswap/client: propagate trace state when calling GetBlocks #1060
bitswap/network/httpnet: improved error detection on HTTP and block fetches:- Do not attempt to GET a test CID if the endpoint returns 429 to the test HEAD request.
- Unify error parsing and handling of http statues and content.
pinning/pinner: AddedCheckIfPinnedWithTypemethod toPinnerinterface for efficient type-specific pin checks with optional name loading (#1035)- Enables checking specific pin types (recursive, direct, indirect) without loading all pins
- Optional
includeNamesparameter controls whether pin names are loaded from datastore CheckIfPinnednow delegates toCheckIfPinnedWithTypefor consistency
gateway: Enhanced error handling and UX for timeouts:- Added retrieval state tracking for timeout diagnostics. When retrieval timeouts occur, the error messages now include detailed information about which phase failed (path resolution, provider discovery, connecting, or data retrieval) and provider statistics including failed peer IDs #1015 #1023
- Added
Config.DiagnosticServiceURLto configure a CID retrievability diagnostic service. When set, 504 Gateway Timeout errors show a "Check CID retrievability" button linking to the service with?cid=<failed-cid>#1023 - Improved 504 error pages with "Retry" button, diagnostic service integration, and clear indication when timeout occurs on sub-resource vs root CID #1023
gateway: AddedConfig.MaxRangeRequestFileSizeto protect against CDN issues with large file range requests. When set to a non-zero value, range requests for files larger than this limit return HTTP 501 Not Implemented with a suggestion to use verifiable block requests (application/vnd.ipld.raw) instead. This provides protection against Cloudflare's issue where range requests for files over 5GiB are silently ignored, causing excess bandwidth consumption and billing
routing/http: ✨ Delegated Routing V1 HTTP endpoints now return 200 with empty results instead of 404 when no records are found, per IPIP-513 (#1024)- Server endpoints (
/routing/v1/providers/{cid},/routing/v1/peers/{peer-id},/routing/v1/ipns/{name}) return HTTP 200 with empty JSON arrays or appropriate content types for empty results - Client maintains backward compatibility by treating both 200 with empty results and 404 as "no records found"
- IPNS endpoint distinguishes between valid records (Content-Type:
application/vnd.ipfs.ipns-record) and no record found (any other content type)
- Server endpoints (
verifcid: 🛠 Enhanced Allowlist interface with per-hash size limits (#1018)- Expanded
Allowlistinterface withMinDigestSize(code uint64)andMaxDigestSize(code uint64)methods for per-hash function size validation - Added public constants:
DefaultMinDigestSize(20 bytes),DefaultMaxDigestSize(128 bytes for cryptographic hashes), andDefaultMaxIdentityDigestSize(128 bytes for identity CIDs) DefaultAllowlistimplementation now uses these constants and supports different size limits per hash type- Renamed errors for clarity: Added
ErrDigestTooSmallandErrDigestTooLargeas the new primary errors ErrBelowMinimumHashLengthandErrAboveMaximumHashLengthremain as deprecated aliases pointing to the new errors
- Expanded
bitswap: Updated to useverifcid.DefaultMaxDigestSizeforMaximumHashLengthconstant- The default
MaximumAllowedCidlimit for incoming CIDs can be adjusted usingbitswap.MaxCidSizeorserver.MaxCidSizeoptions
- The default
- 🛠
bitswap/client: TheRebroadcastDelayoption now takes atime.Durationvalue. This is a potentially BREAKING CHANGE. The time-varying functionality ofdelay.Delaywas never used, so it was replaced with a fixed duration value. This also removes thegithub.com/ipfs/go-ipfs-delaydependency. filestore: Support providing filestore-blocks. A newprovider.MultihashProviderparameter has been added tofilestore.New(). When used, the blocks handled by the Filestore'sFileManagerwill be provided on write (Put and PutMany).
provider:Provide()calls are replaced withStartProviding()to benefit from the Reprovide Sweep improvement. See kubo#10834 and kad-dht#1095.-provider:Provide()calls are replaced withStartProviding()to benefit from the Reprovide Sweep improvement. See kubo#10834 and kad-dht#1095.
routing/http/client:- Fixed off-by-one error in
routing_http_client_lengthmetric - the metric now correctly reports 0 for empty results instead of 1 - Added metrics for IPNS operations (
GetIPNSandPutIPNS) - these now report latency, status code, and result count (0 or 1 for GetIPNS) - Added simple counter metrics to avoid confusing histogram bucket math:
routing_http_client_requests_total- total requests including errorsrouting_http_client_positive_responses_total- requests that returned at least 1 result
- Fixed off-by-one error in
ipld/unixfs/mod:DagModifiernow correctly preserves raw node codec when modifying data under the chunker threshold, instead of incorrectly forcing everything to dag-pbDagModifierprevents creation of identity CIDs exceedingverifcid.DefaultMaxIdentityDigestSizelimit when modifying data, automatically switching to proper cryptographic hash while preserving small identity CIDsDagModifiernow supports appending data to aRawNodeby automatically converting it into a UnixFS file structure where the originalRawNodebecomes the first leaf block, fixing previously impossible append operations that would fail with "expected protobuf dag node" errors
mfs:- Files with identity CIDs now properly inherit full CID prefix from parent directories (version, codec, hash type, length), not just hash type (#1018)
verifcid: Now enforces maximum size limit of 128 bytes for identity CIDs to prevent abuse (#1018, ipfs/specs#512).- 🛠 Attempts to read CIDs with identity multihash digests longer than
DefaultMaxIdentityDigestSizewill now produceErrDigestTooLargeerror. - Identity CIDs can inline data directly, and without a size limit, they could embed arbitrary amounts of data. Limiting the size also protects gateways from poorly written clients that might send absurdly big data to the gateway encoded as identity CIDs only to retrieve it back. Note that identity CIDs do not provide integrity verification, making them vulnerable to bit flips. They should only be used in controlled contexts like raw leaves of a larger DAG. The limit is explicitly defined as
DefaultMaxIdentityDigestSize(128 bytes).
- 🛠 Attempts to read CIDs with identity multihash digests longer than
autoconf: Client library for fetching, caching and expanding IPFS network configurations using "auto" placeholdersgateway: Added configurable limits for gateway resource protection:Config.RetrievalTimeout: Maximum duration between writes of non-empty data to HTTP response body (default: 30s). Returns 504 Gateway Timeout when gateway cannot retrieve content within this period.Config.MaxConcurrentRequests: Limits concurrent HTTP requests (default: 4096, suitable for most deployments). Returns 429 Too Many Requests with 60s Retry-After header when exceeded. To restore previous unlimited behavior set bothRetrievalTimeoutandMaxConcurrentRequeststo0.[!IMPORTANT] If your gateway returns many HTTP 429 responses while having available resources (CPU, memory), increase
MaxConcurrentRequests. If experiencing high load or resource exhaustion, decrease it. See theMaxConcurrentRequestsgodoc for detailed tuning guidance.Config.MetricsRegistry: Optional Prometheus registry for metrics isolation. When nil, uses the default global registry. Useful for testing and deployments with multiple gateway instances.- New middleware with Prometheus metrics:
ipfs_http_gw_concurrent_requests: Gauge tracking number of concurrent requestsipfs_http_gw_responses_total{code}: Counter for all HTTP responses by status codeipfs_http_gw_retrieval_timeouts_total{code,truncated}: Counter for retrieval timeout events with details on truncation
namesys/IPNSPublisher: option toPublishOptionsthat allows for setting a custom sequence number for the IPNS record with proper validation to prevent unintentional replay attacks. #962blockstore: AddedValidatingBlockstorewrapper. This replaces theHashOnReadblockstore API.
bitswap/network: The connection event manager now has aSetListenersmethod. Bothbsnetandhttpnetnow have options to provide theConnectionEventManagerduringNew(...). This allows sharing the connection event manager when using both. The connection manager SHOULD be shared when using both networks with thenetwork.Routerutility.provider: Distribute the responsability of providing new blocks to the places that play a role in the different providing strategies #976. Refactor the logic to perform Provides, when the component has been given a provider:- Remove
providing.Exchange - Provide directly from Blockstore when
provideris set (via Option). - Provide directly from pinner/merkledag on dag traversal when
provideris set (via Option). - Provide from MFS whenever there is a call to
DAGService.Addandprovideris set (via constructor param).
- Remove
- upgrade to
go-libp2pv0.43.0 - replace
uber-go/multierrwitherrors.Join#996 - updated Go in
go.modto 1.24.0 #999
blockstore: Removed HashOnRead API. This is a potentially BREAKING CHANGE for any users of the HashOnRead API. Use theValidatingBlocksoreinstead.- The
HashOnReadfunction was also removed fromFilestore. To use this functionality, provide aValidatingBlockstorewhen creating a newFilestore.
- The
provider: Add ability to clear provide queue #978
bitswap/network: The connection event manager now has aSetListenersmethod. Bothbsnetandhttpnetnow have options to provide theConnectionEventManagerduringNew(...). This allows sharing the connection event manager when using both. The connection manager SHOULD be shared when using both networks with thenetwork.Routerutility.bootstrap: Relay-only peers (with/p2p-circuit/addresses) are now filtered out when selecting backup bootstrap peers to improve reliability.- upgrade to
go-libp2pv0.42.1
bitswap: fix an issue where boxo silently stops making http retrieval requests. #981, #980, #979 and #984 (writeup), #986.
bitswap/network/httpnet: NewWithMetricsLabelsForEndpointsallows defining which hosts/endpoints can be used for labelling metrics that support such label. '*' enables this for all endpoints receiving HTTP requests, but may cause metric cardinality growth when too many endpoints exist. These labels allow tracking, for example, number or requests per response status AND endpoint used. Non-labelled request hosts are labelled with same value:other.
bitswap/clientThe bitswap client'straceability.Blockis now disabled by default. It is only used for testing an debugging and is not needed for typical operation. Using it costs additional allocation. To enabletraceability.Block, use the bitswap client optionWithTraceBlock(true).DontHaveTimeoutConfig's defaultMinTimeoutis changed from0to50ms#959 #965.- upgrade to
go-libp2pv0.42.0
bitswap/client: Fix sending extra wants #968 + #975routing/http/client: Improve URL handling for delegated routing endpoints #971
- fix panic when incoming Bitswap protobuf message does not contain
Wantlist#961
providerincludes metrics on the number of keys provided so far(reprovider_provide_count) and the number of keys reprovided so far (reprovider_reprovide_count) #944bitswap/client: New metrics:ipfs_bitswap_wanthaves_broadcast: Count of want-haves broadcastsipfs_bitswap_haves_received: Count of total have responsesipfs_bitswap_bcast_skips_total{: Count of broadcasts skipped as part of spam reduction logic (see "Changed" below)ipfs_bitswap_unique_blocks_received: Count of non-duplicate blocks recieved
provider: previously, the code in this module was logging toreprovider.simple,provider.batchedandprovider.queuefacilities. They have now been consolidated in a singleproviderlogging facility, along with some adjustments to logging levels and extra debug statements.bitswap/client: Added an opt-in ability to reduce bitswap broadcast volume by limiting broadcasts to peers that have previously responded as having wanted blocks and peers on local network. The following bitswap client options are available to configure the behavior of broadcast reduction:BroadcastControlEnableenables or disables broadcast reduction logic. Setting this tofalserestores the previous broadcast behavior of sending broadcasts to all peers, and ignores all otherBroadcastControloptions. Default isfalse(disabled).BroadcastControlMaxPeerssets a hard limit on the number of peers to send broadcasts to. A value of0means no broadcasts are sent. A value of-1means there is no limit. Default is-1(unlimited).BroadcastControlLocalPeersenables or disables broadcast control for peers on the local network. Iffalse, then always broadcast to peers on the local network. Iftrue, apply broadcast control to local peers. Default isfalse(always broadcast to local peers).BroadcastControlPeeredPeersenables or disables broadcast control for peers configured for peering. Iffalse, then always broadcast to peers configured for peering. Iftrue, apply broadcast control to peered peers. Default isfalse(always broadcast to peered peers).BroadcastControlMaxRandomPeerssets the number of peers to broadcast to anyway, even though broadcast control logic has determined that they are not broadcast targets. Setting this to a non-zero value ensures at least this number of random peers receives a broadcast. This may be helpful in cases where peers that are not receiving broadcasts may have wanted blocks. Default is0(no random broadcasts).BroadcastControlSendToPendingPeersenables or disables sending broadcasts to any peers to which there is a pending message to send. Whentrue(enabled), this sends broadcasts to many more peers, but does so in a way that does not increase the number of separate broadcast messages. There is still the increased cost of the recipients having to process and respond to the broadcasts. Default isfalse.
bitswap/serverdo not allow override of peer ledger withWithPeerLedger#938
gateway: Fixed suffix range-requests and updated tests to gateway-conformance v0.8 #922
bitswap/httpnet: New optionWithMaxDontHaveErrors(int)(defaults to 100) will trigger disconnections from bitswap peers that cannot provide any of the blocks that are requested for the given number of requests in a row.. This is meant to limit bitswap HTTP-based optimistic requests for blocks to discovered endpoints, which were before considered permanently peered upon discovery.
- upgrade to
go-libp2p-kad-dhtv0.33.1 - deprecated
WithPeerLedgeroption for bitswap server. Will remove option in next release. See issue #928 - gateway: update backend car traversal to use go-car/v2 #925
- This change may prohibit fetching DAGs from CAR files that have no roots.
- Control over UnixFS DAG Width
- We have made some changes to allow setting custom max width of UnixFS DAGs. This enables users to produce DAGs that follow current and future community conventions (see the related discussion).
ipld/unixfs:DagModifiernow allows specifying file DAG Width (MaxLinks) #898ipld/unixfs/io/directory: We have made some changes to unixfs directory tooling #906- We have exposed creator methods for new
BasicDirectoryandHAMTDirectory, that complement the existingNewDirectory()which creates dynamic directories. - We have added
WithCidBuilder(...),WithMaxLinks(...),WithMaxHAMTFanout(...)andWithStat(...)as options to these new methods so that empty directories can be initilized as wished from the get-go. WithMaxLinks(...)andWithMaxHAMTFanout(...)are new options that allow to set a limit to the number of children that a directory DAG node can have. For details on what they exactly do for each of the directory type, please check the documentation.
- We have exposed creator methods for new
mfssupports as well the newMaxLinksandMaxHAMTFanoutoptions. They have been made part of theMkdirOptionsobject and the methodsNewEmptyDirectory()andNewEmptyRoot()have been added to facilitate the initialization of MFS objects. #906
provider: added support for walking partial DAGs in offline mode #905- a
KeyChanFuncthat traverses DAGs from a given root (NewDAGProvider). - a
KeyChanFuncthat buffers all the CIDs in memory from anotherKeyChanFunc(NewBufferedProvider). fetcher/impl/blockservice: new optionSkipNotFoundfor the IPLD fetcher. It will skip not found nodes when traversing the DAG. This allows offline traversal of DAGs when using, for example, an offline blockservice.- This enables use case of providing lazy-loaded, partially local DAGs (like
ipfs filesin Kubo's MFS implementation, see kubo#10386)
- a
gateway: generated HTML with UnixFS directory listings now include a button for copying CIDs of child entities #899bitswap/server: Add ability to enable/disable bitswap server usingWithServerEnabledbitswap option (#911)[#911]
- upgrade to
go-libp2pv0.41.1 bitswap/network: Add a newrequests_in_flightmetric gauge that measures how many bitswap streams are being written or read at a given time.- improve speed of data onboarding by batching/bufering provider queue writes #888
provider: providing queue is now independent from reprovides, speeding up initial provides #907- renamed
provider.ReproviderStats.TotalProvides=>provider.ReproviderStats.TotalReprovides - renamed
provider.ReproviderStats.AvgProvideDuration=>provider.ReproviderStats.AvgReprovideDuration
- renamed
provider/queuededuplicates CIDs #910
gateway: query parameters are now supported and preserved in redirects triggered by a_redirectsfile #886provider: adjusted first reprovide timing after node reboot #890gateway: validate configuration and warn whenUseSubdomains=trueis used with IP-based hostnames #903
bitswap/httpnet: do not follow redirects #878provider: provider helper that buffers results to fix issues with slow re-providing #870
- fix(
provider): don't reprovide ifreprovideIntervalis set to 0 #871 gateway: Skip DNSLink lookup for IP addresses to avoid unnecessary DNS queries #880bitswap/client: Fix unintentional ignoringDontHaveTimeoutConfig#872
- feat(bitswap/client): MinTimeout for DontHaveTimeoutConfig #865
- ✨
httpnet: Transparent HTTP-block retrieval support over Trustless Gateways [#747]((#747):- Complements Bitswap as a block-retrieval mechanism, implementing
bitswap/network. - Understands peers found in provider records with
/.../httpendpoints (trustless gateway). - Treats them as "Bitswap" peers, except instead of using Bitswap it makes HTTP/2 requests to discover (
HEAD) and retrieve (GET) individual blocks (?format=raw). - A
bitswap/networkproxy implementation allows co-existance with standardbitswap/network/bsnet. httpnetis not enabled by default. Upstream implementations may use it by modifying how they create the Bitswap network and initialize bitswap.
- Complements Bitswap as a block-retrieval mechanism, implementing
ipns: TheDefaultRecordTTLchanged from1hto5m#859- upgrade to
go-libp2pv0.41.0 - upgrade to
go-libp2p-kad-dht[v0.30.2](github.com/libp2p/go-libp2p-kad-dht v0.30.2) - upgrade to
go-datastorev0.8.2 - includes API updates and removes go-process bitswap/clientreduce lock scope of PeerManageer to help performance #860NewFromIpfsHost()and the rest of theBitSwapNetworkimplementation has moved fromgithub.com/ipfs/boxo/bitswap/networktogithub.com/ipfs/boxo/bitswap/network/bsnet.
- Removed dependency on
github.com/hashicorp/go-multierrorso that boxo only depends on one multi-error package,go.uber.org/multierr. #867
bitswap/client: AddDontHaveTimeoutConfigtype alias andfunc DontHaveTimeoutConfig()to expose config defined in internal package.
- move
ipld/unixfsfrom gogo protobuf #841 provider: Prevent multiple instances of reprovider.Reprovide() from running at the same time. #834- upgrade to
go-libp2pv0.40.0 - upgrade to
go-libp2p-kad-dht[v0.29.0](github.com/libp2p/go-libp2p-kad-dht v0.29.0) - move bitswap and filestore away from gogo protobuf #839
- updated Go in
go.modto 1.23 #848
Note: This release contains changes to protocol buffer library code. If you depend on deterministic CIDs then please double-check,, before upgrading, that this release does not generate different CIDs.
- Fix memory leaks due to not cleaning up wantlists #829, #833
ipns: Improved interop with legacy clients by restoring support for[]byteCID inValuefield.Value()will convert it to a validpath.Path. EmptyValue()will produceNoopPath(/ipfs/bafkqaaa) to avoid breaking existing code that expects a valid record to always produce a valid content path. #830gateway/blocks-backend: Removed IPLD decoding in GetBlock funciton in gateway's BlocksBackend. Now it's querying the blockService directly instead of dagService. #845
provider: AddedReprovideIntervalandLastRunstats to the Reprovider #815
bitswap/client: Remove unused tracking of CID for interested sessions. #821
bitswap/client: Fix runaway goroutine creation under high load. Under high load conditions, goroutines are created faster than they can complete and the more goroutines creates the slower them complete. This creates a positive feedback cycle that ends in OOM. The fix dynamically adjusts message send scheduling to avoid the runaway condition. #817bitswap/client: Fix resource leak caused by recording the presence of blocks that no session cares about. #822
bitswap/client: Reverted attempt to send cancels with excluded peer due to additional issues with wantlist accounting #809
bitswap/client: Fixed fix sending cancels when excluding peer #805
gatewaySupport for custom DNSLink / DoH resolvers onlocalhostto simplify integration with non-ICANN DNS systems #645
gateway: The default DNSLink resolver for.ethTLD changed tohttps://dns.eth.limo/dns-query#781gateway: The default DNSLink resolver for.cryptoTLD changed tohttps://resolver.unstoppable.io/dns-query#782- upgrade to
go-libp2p-kad-dhtv0.28.2 bitswap/client: reduce lock scope in messagequeue: lock only needed sections #787- upgrade to
go-libp2pv0.38.2
gatewayFix redirect URLs for subdirectories with characters that need escaping. #779ipnsFixipnsprotobuf namespace conflicts by using full package namegithub.com/ipfs/boxo/ipns/pb/record.protoinstead of the genericrecord.proto#794unixfsFix possible crash when modifying directory #798
bitswap/client: Improved timeout configuration for block requests- Exposed
DontHaveTimeoutConfigto hold configuration values fordontHaveTimeoutMgrwhich controls how long to wait for requested block before emitting a synthetic DontHave response - Added
DefaultDontHaveTimeoutConfig()to return aDontHaveTimeoutConfigpopulated with default values - Added optional
WithDontHaveTimeoutConfigto allow passing a customDontHaveTimeoutConfig - Setting
SetSendDontHaves(false)works the same as before. Behind the scenes, it will disabledontHaveTimeoutMgrby passing anilonDontHaveTimeouttonewDontHaveTimeoutMgr.
- Exposed
- 🛠
blockstoreandblockservice'sWriteThrough()option now takes an "enabled" parameter:WriteThrough(enabled bool). - Replaced unmaintained mock time implementation uses in tests: from => to
bitswap/client: if a libp2p connection has a context, usecontext.AfterFuncto cleanup the connection.- upgrade to
go-libp2p-kad-dhtv0.28.1 - upgrade to
go-libp2pv0.38.1 - blockstore/blockservice: change option to
WriteThrough(enabled bool)#749 mfs: improve mfs republisher #754
mfs: directory cache is now cleared on Flush(), liberating the memory used by the otherwise ever-growing cache. References to directories and sub-directories should be renewed after flushing.bitswap/client: Fix leak due to cid queue never getting cleaned up #756bitswap: Drop stream references on Close/Reset 760
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.devinstance. #718 #724routing/http/server: added configurable routing timeout (DefaultRoutingTimeoutbeing 30s) to prevent indefinite hangs during content/peer routing. Set custom duration viaWithRoutingTimeout. #720routing/http/server: exposes Prometheus metrics onprometheus.DefaultRegistererand a custom one can be provided viaWithPrometheusRegistry#722gateway:NewCacheBlockStoreandNewCarBackendwill useprometheus.DefaultRegistererwhen a custom one is not specified viaWithPrometheusRegistry#722filestore: added opt-inWithMMapReaderoption toFileManagerto enable memory-mapped file reads #665bitswap/routingProviderQueryManagerdoes not require callingStartupseparate fromNew. #741bitswap/routingProviderQueryManager does not use lifecycle context.
bitswap,routing,exchange(#641):-
✨ Bitswap is no longer in charge of providing blocks to the network: providing functionality is now handled by a
exchange/providing.Exchange, meant to be used withprovider.Systemso that all provides follow the same rules (multiple parts of the code where handling provides) before. -
🛠
bitswap/client/internal/providerquerymanagerhas been moved torouting/providerquerymanagerwhere it belongs. In order to keep compatibility, Bitswap now receives arouting.ContentDiscoveryparameter which implementsFindProvidersAsync(...)and uses it to create aproviderquerymanagerwith the default settings as before. Custom settings can be used by using a customproviderquerymanagerto manually wrap aContentDiscoveryobject and pass that in asContentDiscoveryon initialization while settingbitswap.WithDefaultProviderQueryManager(false)(to avoid re-wrapping it again). -
The renovated
providedQueryManagerwill trigger lookups until it manages to connect toMaxProviders. Before it would lookup at mostMaxInProcessRequests*MaxProvidersand connection failures may have limited the actual number of providers found. -
🛠 We have aligned our routing-related interfaces with the libp2p
routingones, including in thereprovider.System. -
In order to obtain exactly the same behavior as before (i.e. particularly ensuring that new blocks are still provided), what was done like:
bswapnet := network.NewFromIpfsHost(host, contentRouter) bswap := bitswap.New(p.ctx, bswapnet, blockstore) bserv = blockservice.New(blockstore, bswap)
-
becomes:
// Create network: no contentRouter anymore bswapnet := network.NewFromIpfsHost(host) // Create Bitswap: a new "discovery" parameter, usually the "contentRouter" // which does both discovery and providing. bswap := bitswap.New(p.ctx, bswapnet, discovery, blockstore) // A provider system that handles concurrent provides etc. "contentProvider" // is usually the "contentRouter" which does both discovery and providing. // "contentProvider" could be used directly without wrapping, but it is recommended // to do so to provide more efficiently. provider := provider.New(datastore, provider.Online(contentProvider) // A wrapped providing exchange using the previous exchange and the provider. exch := providing.New(bswap, provider) // Finally the blockservice bserv := blockservice.New(blockstore, exch) ...
-
The above is only necessary if content routing is needed. Otherwise:
// Create network: no contentRouter anymore bswapnet := network.NewFromIpfsHost(host) // Create Bitswap: a new "discovery" parameter set to nil (disable content discovery) bswap := bitswap.New(p.ctx, bswapnet, nil, blockstore) // Finally the blockservice bserv := blockservice.New(blockstore, exch)
-
routing/http/client: creating delegated routing client withNewnow defaults to querying delegated routing server withDefaultProtocolFilter(IPIP-484) #689bitswap/client: Wait at lease one broadcast interval before resending wants to a peer. Check for peers to rebroadcast to more often than one broadcast interval.- No longer using
github.com/jbenet/goprocessto avoid requiring in dependents. #710 pinning/remote/client: Refactor remote pinningLsto take results channel instead of returning one. The previousLsbehavior is implemented by the GoLs function, which creates the channels, starts the goroutine that calls Ls, and returns the channels to the caller #738- updated to go-libp2p to v0.37.2
- Do not erroneously update the state of sent wants when a send a peer disconnected and the send did not happen. #452
go.modupdates
bitswap/clientno longer logs"Received provider X for cid Y not requestedto 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 withNewnow defaults to querying delegated routing server withDefaultProtocolFilter(IPIP-484) #689- updated go-libp2p to v0.36.5
- updated dependencies #693
- update
go-libp2p-kad-dhtto v0.27.0
routing/http/client: optional address and protocol filter parameters from IPIP-484 use human-readable,instead of%2C. #688bitswap/clientCleanup 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.Newto 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
WithFilterAddrsandWithFilterProtocolsoptions when creating the client.Client-side filtering for servers that don't support filtering is enabled by default. To disable it, use thedisableLocalFilteringoption when creating the client.
unixfs/hamt: Log error instead of panic if both link and shard are nil #393pinner/dspinner: do not hang when listing keys and theoutchannel is no longer read #727
files,ipld/unixfs,mfsandtarnow support optional UnixFS 1.5 mode and modification time metadata #653gatewaydeserialized responses will haveLast-Modifiedset to value from optional UnixFS 1.5 modification time field (if present in DAG) and a matchingIf-Modified-Sincewill return304 Not Modified(UnixFS 1.5 files only) #659
- updated Go in
go.modto 1.22 #661 - updated go-libp2p to v0.36.3
chunkerrefactored to reduce overall memory use by reducing heap fragmentation #649bitswap/serverminor performance improvements in concurrent operations #666- removed dependency on go-ipfs-blocksutil #656
go-libp2pdependency updated to v0.36 (release notes)bitswap/serverminor memory use and performance improvements #634bitswapunify logger names to use uniform format bitswap/path/pkgname #637gatewaynow always returns meaningful cache-control headers for generated HTML listings of UnixFS directories #643utilgenerate random test data usingipfs/go-testinstead of internal util code #638bitswap/serverPeerLedger.Wantsnow returnsbool(interface change fromWants(p peer.ID, e wl.Entry)toWants(p peer.ID, e wl.Entry) bool) #629
boxo/gatewaynow 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/clientfix memory leak in BlockPresenceManager due to unlimited map growth. #636bitswap/networkfixed 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- 🛠
bitswap&bitswap/serverno longer provide to content routers, instead you can use theproviderpackage because it uses a datastore queue and batches calls to ProvideMany.
boxo/gatewayis now tested against gateway-conformance v6bitswap/clientsupports additional tracing
- 🛠
routing/noneremovedConstructNilRouting, if you need this functionality you can use the Null Router from go-libp2p-routing-helpers.
routing/http: theFindPeernow returnsrouting.ErrNotFoundwhen no addresses are foundrouting/http: theFindProvidersAsyncno longer causes a goroutine buildup
- ✨
gatewayhas new backend possibilities:NewRemoteBlocksBackendallows 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,NewRemoteBlockstoreandNewRemoteValueStore.NewRemoteCarBackendallows 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,NewRemoteCarFetcherandNewRetryCarFetcher.
gatewaynow sets theContent-Locationheader 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.gatewaynow supportscar-dups,car-orderandcar-versionas query parameters in addition to theapplication/vnd.ipld.carparameters sent viaAcceptheader. The parameters in theAcceptheader have always priority, but including them in URL simplifies HTTP caching and allows use inContent-Locationheader on CAR responses to maximize interoperability with wide array of HTTP caches.bitswap/servernow allows to override the default peer ledger withWithPeerLedger.
routing/http/servernow returns 404 Status Not Found when no records can be found.routing/http/servernow supports legacy RSA PeerIDs encoded as Base58 Multihash
routing/http/servernow addsCache-ControlHTTP header to GET requests: 15 seconds for empty responses, or 5 minutes for responses with providers.routing/http/serverthe/ipnsendpoint is more friendly to users opening URL in web browsers: returnsContent-Dispositionheader and defaults toapplication/vnd.ipfs.ipns-recordresponse whenAcceptis missing.provider:- Exports a
NewPrioritizedProvider, which can be used to prioritize certain providers while ignoring duplicates. - 🛠️
NewPinnedProvidernow prioritizes root blocks, even ifonlyRootsis set tofalse.
- Exports a
goversion changed to 1.21
- 🛠️
routing/http/server: delegated peer routing endpoint now supports both Peer ID string notations from libp2p specs. bitswap: add missing clientWithBlockReceivedNotifierandWithoutDuplicatedBlockStatsoptions to the exchange.
blockservicenow hasContextWithSessionandEmbedSessionInContextfunctions, which allows to embed a session in a context. Future calls toBlockGetter.GetBlock,BlockGetter.GetBlocksandNewSessionwill use the session in the context.blockservice.NewWritethroughdeprecated 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.namesysnow has aWithMaxCacheTTLoption, 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.HeadersandAddAccessControlHeadershas been replaced by the new middleware provided byNewHeaders. - 🛠
routing/http/client: the default HTTP client is no longer a global singleton. Therefore, usingWithUserAgentwon'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, thePinnerhas been adjusted. Note that callingPinfor the same CID with a different name will replace its current name by the newly given name.
- 🛠
tracingjaegerexporter has been removed due to it's deprecation and removal from upstream, you should useotlpexporter 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_redirectsinstead. - 🛠
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.WriteHeaderwarnings when an error happens.
- 🛠 Bumped to
go-libp2p0.32.
boxo/gateway:- A new
WithResolver(...)option can be used withNewBlocksBackend(...)allowing the user to pass their customResolverimplementation. - The gateway now sets a
Cache-Controlheader 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.Newandbsclient.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=>./peeringA 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
IPFSBackendinterface was updated to make the responses of theHeadmethod more explicit. It now returns aHeadResponseinstead of afiles.Node.
- 🛠 The
boxo/routing/http/client.Clientis now exported. This means you can now pass it around functions, or add it to a struct if you want.- 🛠 The
pathpackage 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/pathare 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.ResolvePathincoreifacehas changed to now return the remainder segments as a second return value, matching the signature ofresolver.ResolveToLastNode. - 🛠
routing/http/client.FindPeersnow returnsiter.ResultIter[types.PeerRecord]instead ofiter.ResultIter[types.Record]. The specification indicates that records for this method will always be Peer Records. - 🛠 The
namesyspackage has been refactored. The following are the largest modifications:- The options in
coreiface/options/namesyshave been moved tonamesysand 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.Resolvenow returns a TTL, in addition to the resolved path. If the TTL is unknown, 0 is returned.IPNSResolveris able to resolve a TTL, whileDNSResolveris not.namesys/resolver.ResolveIPNShas been moved tonamesys.ResolveIPNSand now returns a TTL in addition to the resolved path.
- The options in
- ✨
boxo/ipnsrecord defaults follow recommendations from IPNS Record Specification:DefaultRecordTTLis now set to1hDefaultRecordLifetimefollows the increased expiration window of Amino DHT (go-libp2p-kad-dht#793) and is set to48h
- 🛠 The
gateway'sIPFSBackend.ResolveMutableis now expected to return a TTL in addition to the resolved path. If the TTL is unknown, 0 should be returned.
- 🛠
util.MultiErrhas been removed. Please use Go's native support for wrapping errors, orerrors.Joininstead.
- An option
DisableHTMLErrorshas been added togateway.Config. When this option istrue, pretty HTML error pages for web browsers are disabled. Instead, atext/plainpage with the raw error message as the body is returned.
- ✨ The
routing/httpimplements Delegated Peer Routing introduced in IPIP-417.
- 🛠 The
routing/httppackage received the following modifications:- Client
GetIPNSRecordandPutIPNSRecordhave been renamed toGetIPNSandPutIPNS, respectively. Similarly, the required function names in the serverContentRouterhave also been updated. ReadBitswapProviderRecordhas been renamed toBitswapRecordand marked as deprecated. From now on, please use the protocol-agnosticPeerRecordfor most use cases. The new Peer Schema has been introduced in IPIP-417.
- Client
- 🛠 The
routing/httppackage experienced following removals:- Server and client no longer support the experimental
Providemethod.ProvideBitswapis still usable, but marked as deprecated. A protocol-agnostic provide mechanism is being worked on in IPIP-378. - Server no longer exports
FindProvidersPathandProvidePath.
- Server and client no longer support the experimental
- The normalization of DNSLink identifiers in
gatewayhas been corrected in the edge case where the value passed to the path component of the URL is already normalized.
- The
routing/httpclient and server now support Delegated IPNS at/routing/v1as per IPIP-379. - 🛠 The
verifycidpackage has been updated with the new Allowlist interface as part of reducing globals efforts. - The
blockserviceandproviderpackages has been updated to accommodate for changes inverifycid.
- 🛠
blockservice.Newnow 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
- 🛠
MultiFileReaderhas 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
orderanddupsCAR parameters from IPIP-412.- The
BlocksBackendonly implementsorder=dfs(Depth-First Search) ordering, which was already the default behavior. - If a request specifies no
dups, response withdups=nis returned, which was already the default behavior. - If a request explicitly specifies a CAR
orderother 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=nexplicit in the returnedContent-TypeHTTP 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
ipnspackage has been refactored.- You should no longer use the direct Protobuf version of the IPNS Record.
Instead, we have a shiny new
ipns.Recordtype 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/carhas 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
_redirectsfile whenIf-None-Matchheader is present (#412)
- Handle
_redirectsfile whenIf-None-Matchheader 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
DeserializedResponsesisfalse.
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.GetCARhas been adapted to support IPIP-402 CAR Parameters. - A few variables have been renamed for consistency:
WithHostname->NewHostnameHandlerSpecification->PublicGatewayNewErrorResponse->NewErrorStatusCodeNewErrorResponseForCode->NewErrorStatusCodeFromStatusBlocksGateway->BlocksBackendBlocksGatewayOption->BlocksBackendOptionNewBlocksGateway->NewBlocksBackend
- Some functions that are not supposed to be outside of the package were removed:
ServeContent.
- The signature of
None.
None.
None.
- ✨
gatewayThe 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.
ipnsaddValidateWithPeerIDandUnmarshalIpnsEntryhelpers. (https://github.com/ipfs/boxo/pulls/292)- 🛠
coreiface/testsadd*testing.Targument to the swarm provider. (https://github.com/ipfs/boxo/pulls/321)
- 🛠
boxo/pinnersome 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:DirectKeysRecursiveKeysInternalKeys
- 🛠
provider/batched.Newhas been moved toprovider.Newand arguments has been changed. (https://github.com/ipfs/boxo/pulls/273)- A routing system is now passed with the
provider.Onlineoption, by default the system run in offline mode (push stuff onto the queue). - When using
provider.Onlinecalling the.Runmethod 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.Datastoreexclusively.
- A routing system is now passed with the
- 🛠
provider.NewOfflineProviderhas been renamed toprovider.NewNoopProviderto show more clearly that is does nothing. (https://github.com/ipfs/boxo/pulls/273) - 🛠
provider.Providerandprovider.Reproviderhas been merged under oneprovider.System. (https://github.com/ipfs/boxo/pulls/273) - 🛠
routing/httpresponses now return a streamingiter.ResultItergeneric interface. (https://github.com/ipfs/boxo/pulls/18) - 🛠
coreifaceadd options andAllowOfflineoption toRoutingAPI.Put. (https://github.com/ipfs/boxo/pulls/278) - 🛠
gatewaynow has deserialized responses turned off by default. This can be configured viaDeserializedResponses. (#252)
- 🛠
provider/queuehas been moved toprovider/internal/queue. (https://github.com/ipfs/boxo/pulls/273) - 🛠
provider/simplehas been removed, now instead you can useprovider.Newbecause it accept non batched routing systems and use type assertion for theProvideManycall, giving a single implementation. (https://github.com/ipfs/boxo/pulls/273) - 🛠
provider.NewSystemhas been removed,provider.Newnow returns aprovider.Systemdirectly. (https://github.com/ipfs/boxo/pulls/273)
gatewayfix panics by returning in all error cases. (https://github.com/ipfs/boxo/pulls/314)gatewayavoid duplicate payload during subdomain redirects. (https://github.com/ipfs/boxo/pulls/326)gatewaycorrectly handle question marks in URL when redirecting. (https://github.com/ipfs/boxo/pulls/#313)
None
gatewaytrace context header support (#256)
gatewaywiden duration histograms and cleanup (#265)
None
None
gatewaypanic 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