NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2256 most downloaded on crates.io
Peer-to-peer networking library
Last release 6 days ago
11 Sep 2026
Release timing varies
gaps range from 9 days to 1.2 years
Nearly every release is documented
notes for 55 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
8 years old
105 releases · first in 2018
Update libp2p-yamux to 0.25.0. *Step 4 of 4 in a multi-release upgrade process.* See the libp2p-yamux CHANGELOG for details.
libp2p-yamux to 0.25.0. Step 4 of 4 in a multi-release
upgrade process. See the libp2p-yamux CHANGELOG for details.Update libp2p-yamux to 0.24.0. *Step 3 of 4 in a multi-release upgrade process.* See the libp2p-yamux CHANGELOG for details.
libp2p-yamux to 0.24.0. Step 3 of 4 in a multi-release
upgrade process. See the libp2p-yamux CHANGELOG for details.One column per quarter.
Update libp2p-yamux to 0.23.0. *Step 2 of 4 in a multi-release upgrade process.* See the libp2p-yamux CHANGELOG for details.
libp2p-yamux to 0.23.0. Step 2 of 4 in a multi-release
upgrade process. See the libp2p-yamux CHANGELOG for details.Remove the deprecated libp2p-secio dependency. To continue to use SECIO, add an explicit dependency on libp2p-secio. However, transitioning to libp2p-…
Remove the deprecated libp2p-secio dependency. To continue to use
SECIO, add an explicit dependency on libp2p-secio. However,
transitioning to libp2p-noise is strongly recommended.
Update libp2p-yamux to 0.22.0. This version starts a multi-release
upgrade process. See the libp2p-yamux CHANGELOG for details.
Bump libp2p-noise to 0.24. See the libp2p-noise
changelog for details about the LegacyConfig.
The ProtocolsHandler in libp2p-swarm has a new associated type
InboundOpenInfo (PR 1714).
Update libp2p-core, libp2p-gossipsub, libp2p-kad, libp2p-mdns, libp2p-ping, libp2p-request-response, libp2p-swarm and dependent crates.
libp2p-core, libp2p-gossipsub, libp2p-kad, libp2p-mdns,
libp2p-ping, libp2p-request-response, libp2p-swarm and dependent crates.NOTE: For a smooth upgrade path from 0.21 to > 0.22 on an existing deployment, this version must not be skipped or the provided legacy configuration f
NOTE: For a smooth upgrade path from 0.21 to > 0.22
on an existing deployment, this version must not be skipped
or the provided legacy configuration for libp2p-noise used!
Bump libp2p-noise dependency to 0.22. See the libp2p-noise
changelog for details about the LegacyConfig.
Refactored bandwidth logging (PR 1670).
NOTE: For a smooth upgrade path from 0.21 to > 0.22 on an existing deployment using libp2p-noise, this version must not be skipped!
NOTE: For a smooth upgrade path from 0.21 to > 0.22
on an existing deployment using libp2p-noise, this version
must not be skipped!
libp2p-noise dependency to 0.21.Bump libp2p-websockets lower bound.
libp2p-websockets lower bound.Conditional compilation fixes for the wasm32-wasi target (PR 1633).
Nothing published for this version
Nothing published for this version
Temporarily pin all async-std dependencies to < 1.6. PR 1589
libp2p-core, libp2p-swarm: Added support for multiple dialing attempts per peer, with a configurable limit. PR 1506
libp2p-core, libp2p-swarm: Added support for multiple dialing
attempts per peer, with a configurable limit.
PR 1506
libp2p-core: PeerIds that use the identity hashing will now be properly
displayed using the string representation of an identity multihash, rather
than the canonical SHA 256 representation.
PR 1576
libp2p-core: Updated to multihash 0.11.0.
PR 1566
libp2p-core: Make the number of events buffered to/from tasks configurable.
PR 1574
libp2p-dns, parity-multiaddr: Added support for the /dns multiaddr
protocol. Additionally, the multiaddr::from_url function will now use
/dns instead of /dns4.
PR 1575
libp2p-noise: Added the X25519Spec protocol suite which uses
libp2p-noise-spec compliant signatures on static keys as well as the
/noise protocol upgrade, hence providing a libp2p-noise-spec compliant
XX handshake. IK and IX are still supported with X25519Spec
though not guaranteed to be interoperable with other libp2p
implementations as these handshake patterns are not currently
included in the libp2p-noise-spec. The X25519Spec implementation
will eventually replace the current X25519 implementation, with
the former being removed. To upgrade without interruptions, you may
temporarily include NoiseConfigs for both implementations as
alternatives in your transport upgrade pipeline.
libp2p-kad: Consider fixed (K_VALUE) amount of peers at closest query
initialization. Unless KademliaConfig::set_replication_factor is used change
has no effect.
PR 1536
libp2p-kad: Provide more insight into, and control of, the execution of
queries. All query results are now wrapped in KademliaEvent::QueryResult.
As a side-effect of these changes and for as long as the record storage
API is not asynchronous, local storage errors on put_record are reported
synchronously in a Result, instead of being reported asynchronously by
an event.
PR 1567
libp2p-tcp, libp2p: Made the libp2p-tcp/async-std feature flag
disabled by default, and split the libp2p/tcp feature in two:
tcp-async-std and tcp-tokio. tcp-async-std is still enabled by default.
PR 1471
libp2p-tcp: On listeners started with an IPv6 multi-address the socket
option IPV6_V6ONLY is set to true. Instead of relying on IPv4-mapped IPv6
address support, two listeners can be started if IPv4 and IPv6 should both
be supported. IPv4 listener addresses are not affected by this change.
PR 1555
libp2p-swarm: Make sure inject_dial_failure is called in all situations. PR 1549
libp2p-swarm: Make sure inject_dial_failure is called in all situations.
PR 1549libp2p-core: Treat connection limit errors as pending connection errors. PR 1546
libp2p-core: Treat connection limit errors as pending connection errors.
PR 1546
libp2p-core-derive: Disambiguate calls to NetworkBehaviour::inject_event.
PR 1543
libp2p-floodsub: Allow sent messages seen as subscribed.
PR 1520
libp2p-kad: Return peers independent of record existence.
PR 1544
libp2p-wasm-ext: Fix "parsed is null" errors being thrown.
PR 1535
libp2p-core: Finished "identity hashing" for peer IDs migration. PR 1460
libp2p-core: Finished "identity hashing" for peer IDs migration.
PR 1460
libp2p-core: Remove poll_broadcast.
PR 1527
libp2p-core, libp2p-swarm: Report addresses of closed listeners.
PR 1485
libp2p-core: Support for multiple connections per peer and configurable connection limits.
See PR #1440,
PR #1519 and
issue #912 for details.
libp2p-swarm: Pass the cause of closing a listener to inject_listener_closed.
PR 1517
libp2p-swarm: Support for multiple connections per peer and configurable connection limits.
See PR #1440,
PR #1519 and
issue #912 for details.
libp2p-swarm: The SwarmEvent now returns more events.
PR 1515
libp2p-swarm: New protocols_handler::multi module.
PR 1497
libp2p-swarm: Allow configuration of outbound substreams.
PR 1521
libp2p-kad: Providers returned from a lookup are now deduplicated.
PR 1528
libp2p-kad: Allow customising the maximum packet size.
PR 1502
libp2p-kad: Allow customising the (libp2p) connection keep-alive timeout.
PR 1477
libp2p-kad: Avoid storing records that are expired upon receipt (optimisation).
PR 1496
libp2p-kad: Fixed potential panic on computing record expiry.
PR 1492
libp2p-mplex: Guard against use of underlying Sink upon
error or connection close.
PR 1529
multistream-select: Upgrade to stable futures.
PR 1484
multihash: Removed the crate in favour of the upstream crate.
PR 1472
Fixed yamux connections not properly closing and being stuck in the CLOSE_WAIT state.
CLOSE_WAIT state.websocket_transport() function in libp2p-wasm-ext, behind a Cargo feature.IntoProtocolsHandler::select vs ProtocolsHandler::select in the NetworkBehaviour custom derive.Fixed wrong representation of PeerIds being used in Kademlia::get_closest_peers.
PeerIds being used in Kademlia::get_closest_peers.FusedStream for Swarm.The new behaviour is now compatible with go-libp2p and js-libp2p, but is a breaking change with regards to rust-libp2p.
Substream associated type from the ProtocolsHandler trait. The type of the substream is now always libp2p::swarm::NegotiatedSubstream.NetworkBehaviour trait provided by libp2p (Ping, Identify, Kademlia, Floodsub, Gossipsub) have lost a generic parameter.Swarm and ExpandedSwarm. The transport is now abstracted away in the internals of the swarm.Send and 'static bounds are now enforced directly on the ProtocolsHandler trait and its associated InboundUpgrade and OutboundUpgrade implementations.PeerIds to compare equal across the identity and SHA256 hashes. As a consequence, the Borrow implementation of PeerId now always returns the bytes representation of a multihash with a SHA256 hash.poll_method parameter of the NetworkBehaviour custom derive. The expected method now takes an additional parameter of type impl PollParameters to be consistent with the NetworkBehaviour::poll method.libp2p- now use the same version number.ListenerEvent::Error for listeners to report non-fatal errors. libp2p-tcp uses this variant to report errors that happen on remote sockets before they have been accepted and errors when trying to determine the local machine's IP address.Added SwarmBuilder::executor to allow configuring which tasks executor to use.
libp2p-gossipsub.SwarmBuilder::executor to allow configuring which tasks executor to use.TokioTcpConfig in libp2p-tcp and TokioUdsConfig in libp2p-uds behind tokio features. These structs use tokio and require a tokio runtime executor to be configured via SwarmBuilder::executor.OutboundUpgrade and InboundUpgrade traits to no longer be passed a Negotiated<C> but just a C. The Negotiated is now in the trait bounds requirements of ProtocolsHandler.libp2p-wasm-ext returning Err(WouldBlock) rather than Pending.libp2p-dns not segregating DNS4 and DNS6.Unpin requirements on futures.Mdns::new to no longer be async.libp2p-kad keeping connections alive when it shouldn't.InboundUpgrade not always properly implemented on NoiseConfig.Upgraded the crate to stable futures.
core::upgrade module to provide async functions.Stream trait implementation of Swarm to no longer return a Result.Swarm::next and Swarm::next_event functions and the SwarmEvent enum.ProtocolsHandler::poll to no longer return an error. Instead, ProtocolsHandlerEvent has a new Close variant which corresponds to what an error represented before.poll function (i.e. NetworkBehaviour, ProtocolsHandler, NodeHandler) to have an additional &mut Context parameter, to reflect the changes in the Future trait.libp2p_websockets::framed.Error::UnknownProtocolString.Fixed the libp2p-noise handshake not flushing the underlying stream before waiting for a response.
libp2p-noise handshake not flushing the underlying stream before waiting for a response.protobuf crate.Maintenance release to bump dependencies and deal with an accidental breaking change in multihash 0.1.4.
Reworked the transport upgrade API. See https://github.com/libp2p/rust-libp2p/pull/1240 for more information.
multistream-select protocol called V1Lazy.PlainText2Config that implements the /plaintext/2.0.0 protocol.libp2p-identify. Some items have been renamed.PeerIds using the identity hashing algorithm as valid.libp2p-observed and libp2p-ratelimit.Debug trait implementations.libp2p-kad and multistream-select.In some situations, multistream-select will now assume that protocol negotiation immediately succeeds. If it turns out that it failed, an error is gen
multistream-select will now assume that protocol negotiation immediately succeeds. If it turns out that it failed, an error is generated when reading or writing from/to the stream.listen_addr with local_addr in events related to incoming connections. The address no longer has to match a previously-reported address.NetworkBehaviour::inject_listener_error and NetworkBehaviour::inject_listener_closed. For diagnostic purposes, listeners can now report errors on incoming connections, such as when calling accept(2) fails.libp2p-mplex.libp2p-kad.Toggle::is_enabled().IdentifyTransport.libp2p-kad: Completed the core functionality of the record storage API, thereby extending the RecordStore for provider records. All records expire by
libp2p-kad: Completed the core functionality of the record storage API, thereby extending the RecordStore for provider records. All records expire by default and are subject to regular republication and caching as per the Kademlia spec(s). Expiration and publication intervals are configurable through the KademliaConfig.libp2p-kad: The routing table now never stores peers without a known (listen) address. In particular, on receiving a new inbound connection, the Kademlia behaviour now emits KademliaEvent::UnroutablePeer to indicate that in order for the peer to be added to the routing table and hence considered a reachable node in the DHT, a listen address of the peer must be discovered and reported via Kademlia::add_address. This is usually achieved through the use of the Identify protocol on the same connection(s).libp2p-kad: Documentation updates.swarm and protocols_handler-related contents from libp2p-core to a new libp2p-swarm crate.RawSwarm to Network.Floodsub::publish_any.Network (formerly RawSwarm) and NodeHandler. The node handlers will now wait if the main task is busy, instead of continuing to push events to the channel.address_translation function ignoring /dns addresses.PollParameters is now a trait instead of a struct.
PollParameters is now a trait instead of a struct.Swarm can now be customized with connection information.Nothing published for this version
EitherOutput now implements Stream and Sink if their variants also implement these traits.
EitherOutput now implements Stream and Sink if their variants also implement these traits.libp2p::websocket::error::Error now implements Sync.Major fixes and performance improvements to libp2p-kad.
BrowserWsConfig. Please use libp2p::wasm_ext::ExtTransport instead.Path parameter to multiaddr::Protocol::WS and WSS. The string representation when a path is present is respectively x-parity-ws/<path> and x-parity-wss/<path> where <path> is percent-encoded.libp2p-tcp where the wrong listened address was returned, if the actual address was loopback.core::upgrade::OptionalUpgrade.core::identity::secp256k1.RawSwarm.Fixed a vulnerability in ED25519 signatures verification in libp2p-core.
Crate now successfully runs from within the browser when compiled to WASM.
NoiseConfig to accept any type of public key. The Noise handshake has consequently been modified.StreamMuxer trait to have an Error associated type.Swarm now ranks externally-visible multiaddresses by how often they have been reported, ensuring that weird or malicious reports don't affect connectivity too much.IntoProtocolsHandler::inbound_protocol. Must return the same value as what ProtocolsHandler::listen_protocol would return.IntoProtocolsHandler::into_handler now takes a second parameter with the &ConnectedPoint to the node we are connected to.secp256k1 crate with libsecp256k1.Kademlia::add_providing taking a PeerId instead of a Multihash.Kademlia.OneSubstreamMuxer.libp2p-wasm-ext crate.multiaddr::from_url.OptionalTransport.Fixed the inactive connections shutdown mechanism not working.
Transport::listen_on must now return a Stream that produces ListenEvents. This makes it possible to notify about listened addresses at a later point in time.Transport::listen_on no longer returns an address we're listening on. This is done through ListenEvents. All other listen_on methods have been updated accordingly.NetworkBehaviour::inject_new_listen_addr, NetworkBehaviour::inject_expired_listen_addr and NetworkBehaviour::inject_new_external_addr.ProtocolsHandler::listen_protocol and ProtocolsHandlerEvent::OutboundSubstreamRequest must now return a SubstreamProtocol struct containing a timeout for the upgrade.Ping::new now requires a PingConfig, which can be created with PingConfig::new.Transport::nat_traversal in favour of a stand-alone address_translation function in libp2p-core.Multiaddr.ToMultiaddr trait in favour of TryFrom.Swarm::ban_peer_id and Swarm::unban_peer_id.TPeerId generic parameter of RawSwarm is now TConnInfo and must now implement a ConnectionInfo trait.PingEvent.KeepAlive::Forever to Yes and KeepAlive::Now to No.Replaced NetworkBehaviour::inject_dial_failure with inject_dial_failure and inject_addr_reach_failure. The former is called when we have finished tryi
NetworkBehaviour::inject_dial_failure with inject_dial_failure and
inject_addr_reach_failure. The former is called when we have finished trying to dial a node
without success, while the latter is called when we have failed to reach a specific address.InboundUpgrade and OutboundUpgrade trait to take a Negotiated<TSocket> instead
of TSocket.PollParameters::external_addresses now returns Multiaddres as reference instead of by value.Swarm::external_addresses.core::swarm::toggle::Toggle that allows having a disabled NetworkBehaviour.Moved the SecioKeypair struct in core/identity and renamed it to Keypair.
SecioKeypair struct in core/identity and renamed it to Keypair.StreamMuxer::shutdown() to close().close() method (formerly shutdown) now "destroys" all the existing substreams. After close() as been called, they all return either EOF or an error.shutdown_substream() method now closes only the writing side of the substream, and you can continue reading from it until EOF or until you delete it. This was actually already more or less the case before, but it wasn't properly reflected in the API or the documentation.poll_inbound() and poll_outbound() no longer return an Option, as None was the same as returning an error.NodeClosed events and renamed NodeError to NodeClosed. From the API's point of view, a connection now always closes with an error.NodeHandlerWrapperError enum that describes an error generated by the protocols handlers grouped together. It is either UselessTimeout or Handler. This allows properly reporting closing a connection because it is useless.NodeHandler::inject_inbound_closed, NodeHandler::inject_outbound_closed, NodeHandler::shutdown, and ProtocolsHandler::shutdown. The handler is now dropped when a shutdown process starts. This should greatly simplify writing a handler.StreamMuxer::close now implies flush_all.Shutdown enum from stream_muxer.ProtocolsHandler::fuse().core/nodes/node.rs and core/nodes/handled_node.rs.Fixed periodic pinging not working.
Fixed wrong version of libp2p-noise.
The multiaddr! macro has been moved to the multiaddr crate and is now reexported under the name build_multiaddr!.
multiaddr! macro has been moved to the multiaddr crate and is now reexported under the name build_multiaddr!.upgrade::transfer to be more convenient to use.upgrade::transfer.ProtocolsHandlerSelect.StreamMuxer::is_remote_acknowledged() method.BandwidthLogging transport wrapper that logs the bandwidth consumption.Swarm when necessary.core/nodes.IdentifyEvent::SendBack, when we send back our information.MemoryTransport to be similar to the TcpConfig.Added NetworkBehaviour::inject_replaced that is called whenever we replace a connection with a different connection to the same peer.
NetworkBehaviour::inject_replaced that is called whenever we replace a connection with a different connection to the same peer.Removed the topology module and everything it contained, including the Topology trait.
topology module and everything it contained, including the Topology trait.libp2p-noise that supports Noise handshakes, as an alternative to libp2p-secio.ring to version 0.14.Swarm now expects the PeerId of the local node, instead of a Topology.NetworkBehaviour::addresses_of_peer that returns the addresses a NetworkBehaviour knows about a given peer. This exists as a replacement for the topology.Kademlia and Mdns behaviours now report and store the list of addresses they discover.Floodsub::add_node_to_partial_view() and Floodsub::remove_node_from_partial_view to add/remove nodes from the list of nodes that floodsub must send messages to.NetworkBehaviour::inject_dial_failure that is called when we fail to dial an address.ProtocolsHandler::connection_keep_alive() now returns a KeepAlive enum that provides more fine grained control.NodeHandlerWrapper no longer has a 5 seconds inactivity timeout. This is now handled entirely by ProtocolsHandler::connection_keep_alive().PeerId as ours.SwarmBuilder. The incoming_limit method lets you configure the number of simultaneous incoming connections.FloodsubHandler, PingListenHandler and PeriodicPingHandler.core::nodes are now generic over the PeerId.SecioKeypair::ed25519_raw_key().ProtocolsHandler.Fixed improper dependencies versions causing deriving NetworkBehaviour to generate an error.
NetworkBehaviour to generate an error.Added the IntoNodeHandler and IntoProtocolsHandler traits, allowing node handlers and protocol handlers to know the PeerId of the node they are intera
IntoNodeHandler and IntoProtocolsHandler traits, allowing node handlers and protocol handlers to know the PeerId of the node they are interacting with.Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →