NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2234 most downloaded on crates.io
Core traits and structs of libp2p
Last release 27 days ago
11 Sep 2026
Ships fairly regularly
a new release about every 3 months
Most releases are documented
notes for 45 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
82 releases · first in 2019
Raise MSRV to 1.88.0. See PR 6273.
After the fix, all tests pass. Breaking Change ⚠️ BREAKING CHANGE: Existing signed peer records created with Rust libp2p will not be verifiable with t…
Fixes #6204
PAYLOAD_TYPE: "/libp2p/routing-state-record" → [0x03, 0x01]
DOMAIN_SEP: "libp2p-routing-state" → "libp2p-peer-record"
The payload type [0x03, 0x01] is the multicodec identifier for libp2p-peer-record, as defined in:
Multicodec table
This matches the implementations in:
PR Recreation Notice
This PR is a recreation of [#6205], which was automatically closed after I mistakenly deleted my fork.
It restores the exact same code and commits as before. No additional changes were made.
Follow-up plan (based on discussion in the original PR)
During the previous review, the suggested direction was:
Introduce this change behind a new Cargo feature, which will be false by default.
Deprecate the current implementation, allowing users to switch gradually.
Give the ecosystem time to migrate, before potentially making the new behavior the default in the future.
Why I’m reopening now
This PR is being reopened and then I added the new optional peer-record-interop feature flag.
Testing
Added cross-implementation interoperability tests:
core/tests/peer_record_interop.rs - Tests that verify Rust can decode and verify signed peer records from Go and JS
core/tests/fixtures/ - Test fixtures with signed peer records generated by Go and JS implementations
Before the fix, these tests failed with:
BadPayload(UnexpectedPayloadType { expected: [47, 108, ...], got: [3, 1] })
After the fix, all tests pass.
Breaking Change
⚠️ BREAKING CHANGE: Existing signed peer records created with Rust libp2p will not be verifiable with this change, as the domain and payload type have changed. However, this is necessary to fix interoperability with Go/JS libp2p implementations.
Notes & open questions
None - this is a straightforward alignment with the standard used by other libp2p implementations.
Change checklist
[x ] I have performed a self-review of my own code
I have made corresponding changes to the documentation
I have added tests that prove my fix is effective or that my feature works
[x ] A changelog entry has been made in the appropriate crates
Pull-Request: #6230.
One column per quarter.
Add *_interop methods to PeerRecord for cross-implementation compatibility with Go and JavaScript libp2p.
PeerRecord::new_interop() - Create peer records using standard formatPeerRecord::from_signed_envelope_interop() - Verify peer records using standard formatThe standard format uses libp2p-peer-record domain and multicodec identifier (0x0301) for interoperability.
Existing methods (new(), from_signed_envelope()) maintain backward compatibility with legacy Rust libp2p format.
Use the *_interop variants when exchanging peer records with non-Rust libp2p implementations.
See PR 6230.
Remove once_cell dependency. See PR 5913
once_cell dependency.
See PR 5913Added libp2p::util::unreachable that is a drop-in replacement of void::unreachable. See PR 5676.
libp2p::core::util::unreachable that is a drop-in replacement of void::unreachable.
See PR 5676.Nothing published for this version
Update Transport::dial function signature with a DialOpts param and remove Transport::dial_as_listener:
Transport::dial function signature with a DialOpts param and remove Transport::dial_as_listener:
DialOpts struct contains PortUse and Endpoint,PortUse allows controlling port allocation of new connections (defaults to PortUse::Reuse) -port_use field to ConnectedPointendpoint field in DialOpts to Endpoint::Listener to dial as a listenerTransport::address_translation and relocate functionality to libp2p_swarmSee [PR 4568].
Use web-time instead of instant. See PR 5347.
web-time instead of instant.
See PR 5347.Implement std::Display on ListenerId. See PR 4936.
std::fmt::Display on ListenerId.
See PR 4936.Implement {In,Out}boundConnectionUpgrade for SelectUpgrade. See PR 4812.
{In,Out}boundConnectionUpgrade for SelectUpgrade.
See PR 4812.Remove deprecated functions from ListenerId. See PR 4736.
{In,Out}boundUpgrade for {In,Out}boundConnectionUpgrade.
See PR 4695.ListenerId.
See PR 4736.upgrade::transfer module.
See issue 4011 for details.
See PR 4788.Implement Debug for StreamMuxerEvent. See [PR 4426].
Debug for StreamMuxerEvent.
See PR 4426.Remove deprecated symbols related to upgrades. See [PR 3867].
Allow ListenerId to be user-controlled, i.e. to be provided on Transport::listen_on.
See PR 3567.
Raise MSRV to 1.65. See PR 3715.
Remove deprecated symbols related to upgrades. See PR 3867.
Enforce protocol names to be valid UTF8 strings as required by the spec.
We delete the ProtocolName trait and replace it with a requirement for AsRef<str>.
See PR 3746
Remove SingletonMuxer.
See PR 3883.
Add global_only::Transport that refuses to dial IP addresses from private ranges.
See PR 3814.
Remove upgrade::{apply, apply_inbound, apply_outbound, InboundUpgradeApply, OutboundUpgradeApply} from public API.
These are implementation details that should not be depended on.
See PR 3915.
Remove deprecated identity module.
Depend on libp2p-identity directly instead or import it via the libp2p::identity re-export.
See PR 4040.
Deprecate upgrade::from_fn without replacement as it is not used within rust-libp2p. If you depend on it, we suggest you vendor it. See [PR 3747].
Migrate from prost to quick-protobuf. This removes protoc dependency. See [PR 3312].
prost to quick-protobuf. This removes protoc dependency. See [PR 3312].Move ConnectionId to libp2p-swarm. See [PR 3221].
ConnectionId to libp2p-swarm. See [PR 3221].PendingPoint to libp2p-swarm and make it crate-private. See [PR 3221].Remove deprecated functions StreamMuxerExt::next_{inbound,outbound}. See [PR 3031].
Remove deprecated functions StreamMuxerExt::next_{inbound,outbound}. See PR 3031.
Hide prost::Error from public API in FromEnvelopeError::InvalidPeerRecord and signed_envelope::DecodingError. See PR 3058.
Move Executor to libp2p-swarm. See PR 3097.
Update rust-version to reflect the actual MSRV: 1.60.0. See PR 3090.
Update multistream-select to v0.12.1. See PR 3090.
Improve error messages in case keys cannot be decoded because of missing feature flags. See PR 2972.
Remove EitherError in favor of either::Either. See PR 3337.
Remove EitherTransport in favor of implementing Transport on either::Either. See PR 3338.
Remove EitherUpgrade in favor of implementing UpgradeInfo, InboundUpgrade and OutboundUpgrade on either::Either. See PR 3339.
Remove EitherFuture2 in favor of EitherFuture. See PR 3340.
Remove EitherOutput in favor of future::Either. See PR 3341.
Deprecate StreamMuxerExt::next_{inbound,outbound}. See [PR 3002].
Make RSA keypair support optional. To enable RSA support, rsa feature should be enabled. See [PR 2860].
Update to p256 v0.11.0. See [PR 2636].
p256 v0.11.0. See PR 2636.Update prost requirement from 0.10 to 0.11 which no longer installs the protoc Protobuf compiler. Thus you will need protoc installed locally. See [PR
Unpin requirement from SubstreamBox. See PR 2762 and PR 2776.Sync requirement on StreamMuxer for constructing StreamMuxerBox. See PR 2775.Pin<&mut Self> as the receiver type for all StreamMuxer poll functions. See PR 2765.StreamMuxer interface to be entirely poll-based. All functions on StreamMuxer now
require a Context and return Poll. This gives callers fine-grained control over what they
would like to make progress on. See PR 2724 and PR 2797.Remove {read,write,flush,shutdown,destroy}_substream functions from StreamMuxer trait in favor of forcing StreamMuxer::Substream to implement AsyncRea
Remove {read,write,flush,shutdown,destroy}_substream functions from StreamMuxer trait
in favor of forcing StreamMuxer::Substream to implement AsyncRead + AsyncWrite. See PR 2707.
Replace Into<std::io::Error> bound on StreamMuxer::Error with std::error::Error. See PR 2710.
Remove the concept of individual Transport::Listener streams from Transport.
Instead the Transport is polled directly via Transport::poll. The
Transport is now responsible for driving its listeners. See PR 2652.
Remove deprecated function StreamMuxer::is_remote_acknowledged. See [PR 2665].
Add PeerId::try_from_multiaddr to extract a PeerId from a Multiaddr that ends in /p2p/ .
PeerId::try_from_multiaddr to extract a PeerId from a Multiaddr that ends in /p2p/<peer-id>.Remove Network. libp2p-core is from now on an auxiliary crate only. Users that have previously used Network only, will need to use Swarm instead. See
Remove Network. libp2p-core is from now on an auxiliary crate only. Users
that have previously used Network only, will need to use Swarm instead. See
PR 2492.
Update to multiaddr v0.14.0.
Update to multihash v0.16.0.
Implement Display on DialError. See PR 2456.
Update to parking_lot v0.12.0. See PR 2463.
Validate PeerRecord signature matching peer ID. See RUSTSEC-2022-0009.
Don't take ownership of key in PeerRecord::new and SignedEnvelope::new. See PR 2516.
Remove SignedEnvelope::payload in favor of
SignedEnvelope::payload_and_signing_key. The caller is expected to check
that the returned signing key makes sense in the payload's context. See PR 2522.
Nothing published for this version
Report concrete connection IDs in NetworkEvent::ConnectionEstablished and NetworkEvent::ConnectionClosed (see [PR 2350]).
Update dependencies.
Report concrete connection IDs in NetworkEvent::ConnectionEstablished and
NetworkEvent::ConnectionClosed (see PR 2350).
Migrate to Rust edition 2021 (see PR 2339).
Add support for ECDSA identities (see PR 2352).
Add ConnectedPoint::is_relayed (see PR 2392).
Enable overriding dial concurrency factor per dial via
DialOpts::override_dial_concurrency_factor.
libp2p_core::DialOpts mirroring libp2p_swarm::DialOpts.
Passed as an argument to Network::dial.Peer::dial in favor of Network::dial.See PR 2404.
Implement Serialize and Deserialize for PeerId (see PR 2408)
Report negotiated and expected PeerId as well as remote address in
DialError::WrongPeerId (see PR 2428).
Allow overriding role when dialing. This option is needed for NAT and firewall hole punching.
Add Transport::dial_as_listener. As Transport::dial but
overrides the role of the local node on the connection . I.e. has the
local node act as a listener on the outgoing connection.
Add override_role option to DialOpts.
See PR 2363.
Nothing published for this version
Remove deprecated functions upgrade::write_one, upgrade::write_with_len_prefix and upgrade::read_one (see [PR 2213]).
Add ConnectionLimit::with_max_established (see PR 2137).
Add Keypair::to_protobuf_encoding (see PR 2142).
Change PublicKey::into_protobuf_encoding to PublicKey::to_protobuf_encoding (see PR 2145).
Change PublicKey::into_peer_id to PublicKey::to_peer_id (see PR 2145).
Change PeerId::from_public_key(PublicKey) to PeerId::from_public_key(&PublicKey) (see PR 2145).
Add From<&PublicKey> for PeerId (see PR 2145).
Remove TInEvent and TOutEvent trait parameters on most public types.
TInEvent and TOutEvent are implied through THandler and thus
superfluous. Both are removed in favor of a derivation through THandler
(see PR 2183).
Require ConnectionHandler::{InEvent,OutEvent,Error} to implement Debug
(see PR 2183).
Remove DisconnectedPeer::set_connected and Pool::add (see PR 2195).
Report ConnectionLimit error through ConnectionError and thus through
NetworkEvent::ConnectionClosed instead of previously through
PendingConnectionError and thus NetworkEvent::{IncomingConnectionError, DialError} (see PR 2191).
Report abortion of pending connection through DialError,
UnknownPeerDialError or IncomingConnectionError (see PR 2191).
Remove deprecated functions upgrade::write_one, upgrade::write_with_len_prefix
and upgrade::read_one (see PR 2213).
Add SignedEnvelope and PeerRecord according to RFC0002 and RFC0003
(see PR 2107).
Report ListenersEvent::Closed when dropping a listener in ListenersStream::remove_listener,
return bool instead of Result<(), ()> (see PR 2261).
Concurrently dial address candidates within a single dial attempt (see PR 2248) configured
via Network::with_dial_concurrency_factor.
On success of a single address, provide errors of the thus far failed dials via
NetworkEvent::ConnectionEstablished::outgoing.
On failure of all addresses, provide the errors via NetworkEvent::DialError.
Nothing published for this version
Nothing published for this version
Deprecate upgrade::write_one. Deprecate upgrade::write_with_len_prefix. Deprecate upgrade::read_one. Introduce upgrade::read_length_prefixed and upgra…
Switch from parity-multiaddr to upstream multiaddr.
Update dependencies.
Implement Keypair::from_protobuf_encoding for ed25519 keys (see PR 2090).
Deprecate upgrade::write_one.
Deprecate upgrade::write_with_len_prefix.
Deprecate upgrade::read_one.
Introduce upgrade::read_length_prefixed and upgrade::write_length_prefixed.
See PR 2111.
Fix build with secp256k1 disabled PR 2057.
- Update dependencies.
Update paritytech-multiaddr to >=v0.11.2.
paritytech-multiaddr to >=v0.11.2.Network::dial() understands /p2p addresses and Transport::dial gets a "fully qualified" /p2p address when dialing a specific peer, whether through the
Network::dial() understands /p2p addresses and Transport::dial
gets a "fully qualified" /p2p address when dialing a specific peer,
whether through the Network::peer() API or via Network::dial()
with a /p2p address.
Network::dial() and network::Peer::dial() return a DialError
on error.
Shorten and unify Debug impls of public keys.
- Update dependencies.
(Re)add Transport::address_translation to permit transport-specific translations of observed addresses onto listening addresses. PR 1887
(Re)add Transport::address_translation to permit transport-specific
translations of observed addresses onto listening addresses.
PR 1887
Update dependencies.
Make PeerId be Copy, including small PeerId API changes. PR 1874.
PeerId be Copy, including small PeerId API changes.
PR 1874.Require multistream-select-0.9.1.
multistream-select-0.9.1.- Add missing multiaddr upgrade.
The NetworkConfig API is now a builder that moves self. PR 1848.
The NetworkConfig API is now a builder that moves self.
PR 1848.
New configurable connection limits for established connections and
dedicated connection counters. Removed the connection limit dedicated
to outgoing pending connection per peer. Connection limits are now
represented by u32 instead of usize types.
PR 1848.
Update multihash.
Update multistream-select.
Remove ConnectionInfo trait and replace it with PeerId everywhere. This was already effectively the case because ConnectionInfo was implemented on Pee
ConnectionInfo trait and replace it with PeerId
everywhere. This was already effectively the case because
ConnectionInfo was implemented on PeerId.- Update dependencies.
Rework transport boxing and move timeout configuration to the transport builder. PR 1794.
Rework transport boxing and move timeout configuration to the transport builder. PR 1794.
Update dependencies.
Require at least parity-multiaddr v0.9.2 in order to fulfill Ord bound on Multiaddr. PR 1742.
Ord bound on
Multiaddr. PR 1742.Simplify incoming connection handling. The IncomingConnectionEvent has been removed. Instead, pass the IncomingConnection obtained from NetworkEvent::
Simplify incoming connection handling. The IncomingConnectionEvent
has been removed. Instead, pass the IncomingConnection obtained
from NetworkEvent::IncomingConnection to Network::accept().
PR 1732.
Allow any closure to be passed as an executor. PR 1686
Remove PeerId compatibility mode for "identity" and SHA2 hashes.
Historically, before 0.12, PeerIds were incorrectly always hashed with SHA2.
Starting from version 0.13, rust-libp2p accepted both hashed and non-hashed keys as
input. Starting from version 0.16 rust-libp2p compared PeerIds of "identity" and
SHA2 hashes equal, which made it possible to connect through secio or noise to nodes
with an identity hash for the same peer ID. Starting from version 0.17, rust-libp2p
switched to not hashing the key (i.e. the correct behaviour) while retaining
equality between peer IDs using the "identity" hash and SHA2. Finally, with
this release, that will no longer be the case and it is assumed that peer IDs
whose length is less or equal to 42 bytes always use the "identity" hash so
two peer IDs are equal if and only if they use the same hash algorithm and
have the same hash digest. PR 1608.
Return dialer address instead of listener address as remote_addr in
MemoryTransport Listener ListenerEvent::Upgrade
PR 1724.
Remove duplicates when performing address translation PR 1697.
Remove duplicates when performing address translation PR 1697.
Add transport::Builder::multiplex_ext for further customisation during
StreamMuxer creation. PR 1691.
Refactoring of connection close and disconnect behaviour. In particular, the former
NetworkEvent::ConnectionError is now NetworkEvent::ConnectionClosed with the error
field being an Option and None indicating an active (but not necessarily orderly) close.
This guarantees that ConnectionEstablished events are always eventually paired
with ConnectionClosed events, regardless of how connections are closed.
Correspondingly, EstablishedConnection::close is now EstablishedConnection::start_close
to reflect that an orderly close completes asynchronously in the background, with the
outcome observed by continued polling of the Network. In contrast, disconnecting
a peer takes effect immediately without an orderly connection shutdown.
See PR 1619 for further details.
Add ConnectedPoint::get_remote_address
(PR 1649).
Update ed25519-dalek dependency.
Conditional compilation fixes for the wasm32-wasi target (PR 1633).
Conditional compilation fixes for the wasm32-wasi target
(PR 1633).
Rename StreamMuxer::poll_inbound to poll_event and change the
return value to StreamMuxerEvent. This new StreamMuxerEvent makes
it possible for the multiplexing layer to notify the upper layers of
a change in the address of the underlying connection.
Add ConnectionHandler::inject_address_change.
Deprecate StreamMuxer::is_remote_acknowledged (PR 1616).
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
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 →