## 0.42.0
- Update `Transport::dial` function signature with a `DialOpts` param and remove `Transport::dial_as_listener`:
- `DialOpts` struct contains `PortUse` and `Endpoint`,
- `PortUse` allows controling port allocation of new connections (defaults to `PortUse::Reuse`) -
- Add `port_use` field to `ConnectedPoint`
- Set `endpoint` field in `DialOpts` to `Endpoint::Listener` to dial as a listener
- Remove `Transport::address_translation` and relocate functionality to `libp2p_swarm`
See [PR 4568].
## 0.41.3
- Use `web-time` instead of `instant`.
See [PR 5347](https://github.com/libp2p/rust-libp2p/pull/5347).
## 0.41.2
- Implement `std::fmt::Display` on `ListenerId`.
See [PR 4936](https://github.com/libp2p/rust-libp2p/pull/4936).
## 0.41.1
- Implement `{In,Out}boundConnectionUpgrade` for `SelectUpgrade`.
See [PR 4812](https://github.com/libp2p/rust-libp2p/pull/4812).
## 0.41.0
- Remove blanket-impl of `{In,Out}boundUpgrade` for `{In,Out}boundConnectionUpgrade`.
See [PR 4695](https://github.com/libp2p/rust-libp2p/pull/4695).
- Remove deprecated functions from `ListenerId`.
See [PR 4736](https://github.com/libp2p/rust-libp2p/pull/4736).
- Remove `upgrade::transfer` module.
See [issue 4011](https://github.com/libp2p/rust-libp2p/issues/4011) for details.
See [PR 4788](https://github.com/libp2p/rust-libp2p/pull/4788).
## 0.40.1
- Implement `Debug` for `StreamMuxerEvent`.
See [PR 4426].
[PR 4426]: https://github.com/libp2p/rust-libp2p/pull/4426
## 0.40.0
- 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].
[spec]: https://github.com/libp2p/specs/blob/master/connections/README.md#multistream-select
[PR 3567]: https://github.com/libp2p/rust-libp2p/pull/3567
[PR 3715]: https://github.com/libp2p/rust-libp2p/pull/3715
[PR 3746]: https://github.com/libp2p/rust-libp2p/pull/3746
[PR 3814]: https://github.com/libp2p/rust-libp2p/pull/3814
[PR 3867]: https://github.com/libp2p/rust-libp2p/pull/3867
[PR 3883]: https://github.com/libp2p/rust-libp2p/pull/3883
[PR 3915]: https://github.com/libp2p/rust-libp2p/pull/3915
[PR 4040]: https://github.com/libp2p/rust-libp2p/pull/4040
## 0.39.2
- 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].
- Deprecate `{In,Out}boundUpgradeExt`, as they are not used in rust-libp2p.
See [PR 3807].
- Deprecate `OptionalUpgrade` without replacement.
See [PR 3806].
[PR 3747]: https://github.com/libp2p/rust-libp2p/pull/3747
[PR 3807]: https://github.com/libp2p/rust-libp2p/pull/3807
[PR 3806]: https://github.com/libp2p/rust-libp2p/pull/3806
## 0.39.1
- Migrate from `prost` to `quick-protobuf`. This removes `protoc` dependency. See [PR 3312].
[PR 3221]: https://github.com/libp2p/rust-libp2p/pull/3221
## 0.39.0
- Move `ConnectionId` to `libp2p-swarm`. See [PR 3221].
- Move `PendingPoint` to `libp2p-swarm` and make it crate-private. See [PR 3221].
[PR 3312]: https://github.com/libp2p/rust-libp2p/pull/3312
## 0.38.0
- 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].
[PR 3031]: https://github.com/libp2p/rust-libp2p/pull/3031
[PR 3058]: https://github.com/libp2p/rust-libp2p/pull/3058
[PR 3097]: https://github.com/libp2p/rust-libp2p/pull/3097
[PR 3090]: https://github.com/libp2p/rust-libp2p/pull/3090
[PR 2972]: https://github.com/libp2p/rust-libp2p/pull/2972
[PR 3337]: https://github.com/libp2p/rust-libp2p/pull/3337
[PR 3338]: https://github.com/libp2p/rust-libp2p/pull/3338
[PR 3339]: https://github.com/libp2p/rust-libp2p/pull/3339
[PR 3340]: https://github.com/libp2p/rust-libp2p/pull/3340
[PR 3341]: https://github.com/libp2p/rust-libp2p/pull/3341
## 0.37.0
- Implement `Hash` and `Ord` for `PublicKey`. See [PR 2915].
- Remove default features. If you previously depended on `secp256k1` or `ecdsa` you need to enable these explicitly
now. See [PR 2918].
- Deprecate `StreamMuxerExt::next_{inbound,outbound}`. See [PR 3002].
[PR 2915]: https://github.com/libp2p/rust-libp2p/pull/2915
[PR 2918]: https://github.com/libp2p/rust-libp2p/pull/2918
[PR 3002]: https://github.com/libp2p/rust-libp2p/pull/3002
## 0.36.0
- Make RSA keypair support optional. To enable RSA support, `rsa` feature should be enabled.
See [PR 2860].
- Add `ReadyUpgrade`. See [PR 2855].
[PR 2855]: https://github.com/libp2p/rust-libp2p/pull/2855
[PR 2860]: https://github.com/libp2p/rust-libp2p/pull/2860/
## 0.35.1
- Update to `p256` `v0.11.0`. See [PR 2636].
[PR 2636]: https://github.com/libp2p/rust-libp2p/pull/2636/
## 0.35.0
- 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 2788].
- Drop `Unpin` requirement from `SubstreamBox`. See [PR 2762] and [PR 2776].
- Drop `Sync` requirement on `StreamMuxer` for constructing `StreamMuxerBox`. See [PR 2775].
- Use `Pin<&mut Self>` as the receiver type for all `StreamMuxer` poll functions. See [PR 2765].
- Change `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].
[PR 2724]: https://github.com/libp2p/rust-libp2p/pull/2724
[PR 2762]: https://github.com/libp2p/rust-libp2p/pull/2762
[PR 2775]: https://github.com/libp2p/rust-libp2p/pull/2775
[PR 2776]: https://github.com/libp2p/rust-libp2p/pull/2776
[PR 2765]: https://github.com/libp2p/rust-libp2p/pull/2765
[PR 2797]: https://github.com/libp2p/rust-libp2p/pull/2797
[PR 2788]: https://github.com/libp2p/rust-libp2p/pull/2788
## 0.34.0
- 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].
[PR 2691]: https://github.com/libp2p/rust-libp2p/pull/2691
[PR 2707]: https://github.com/libp2p/rust-libp2p/pull/2707
[PR 2710]: https://github.com/libp2p/rust-libp2p/pull/2710
[PR 2652]: https://github.com/libp2p/rust-libp2p/pull/2652
## 0.33.0
- Have methods on `Transport` take `&mut self` instead of `self`. See [PR 2529].
- Remove `StreamMuxer::flush_all`. See [PR 2669].
- Rename `StreamMuxer::close` to `StreamMuxer::poll_close`. See [PR 2666].
- Remove deprecated function `StreamMuxer::is_remote_acknowledged`. See [PR 2665].
[PR 2529]: https://github.com/libp2p/rust-libp2p/pull/2529
[PR 2666]: https://github.com/libp2p/rust-libp2p/pull/2666
[PR 2665]: https://github.com/libp2p/rust-libp2p/pull/2665
[PR 2669]: https://github.com/libp2p/rust-libp2p/pull/2669
## 0.32.1
- Add `PeerId::try_from_multiaddr` to extract a `PeerId` from a `Multiaddr` that ends in `/p2p/<peer-id>`.
## 0.32.0 [2022-02-22]
- 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].
[PR 2456]: https://github.com/libp2p/rust-libp2p/pull/2456
[RUSTSEC-2022-0009]: https://rustsec.org/advisories/RUSTSEC-2022-0009.html
[PR 2492]: https://github.com/libp2p/rust-libp2p/pull/2492
[PR 2516]: https://github.com/libp2p/rust-libp2p/pull/2516
[PR 2463]: https://github.com/libp2p/rust-libp2p/pull/2463/
[PR 2522]: https://github.com/libp2p/rust-libp2p/pull/2522
## 0.31.0 [2022-01-27]
- 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`.
- Introduces `libp2p_core::DialOpts` mirroring `libp2p_swarm::DialOpts`.
Passed as an argument to `Network::dial`.
- Removes `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].
[PR 2339]: https://github.com/libp2p/rust-libp2p/pull/2339
[PR 2350]: https://github.com/libp2p/rust-libp2p/pull/2350
[PR 2352]: https://github.com/libp2p/rust-libp2p/pull/2352
[PR 2392]: https://github.com/libp2p/rust-libp2p/pull/2392
[PR 2404]: https://github.com/libp2p/rust-libp2p/pull/2404
[PR 2408]: https://github.com/libp2p/rust-libp2p/pull/2408
[PR 2428]: https://github.com/libp2p/rust-libp2p/pull/2428
[PR 2363]: https://github.com/libp2p/rust-libp2p/pull/2363
## 0.30.1 [2021-11-16]
- Use `instant` instead of `wasm-timer` (see [PR 2245]).
[PR 2245]: https://github.com/libp2p/rust-libp2p/pull/2245
## 0.30.0 [2021-11-01]
- 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
superflucious. 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`.
[PR 2145]: https://github.com/libp2p/rust-libp2p/pull/2145
[PR 2213]: https://github.com/libp2p/rust-libp2p/pull/2213
[PR 2142]: https://github.com/libp2p/rust-libp2p/pull/2142
[PR 2137]: https://github.com/libp2p/rust-libp2p/pull/2137
[PR 2183]: https://github.com/libp2p/rust-libp2p/pull/2183
[PR 2191]: https://github.com/libp2p/rust-libp2p/pull/2191
[PR 2195]: https://github.com/libp2p/rust-libp2p/pull/2195
[PR 2107]: https://github.com/libp2p/rust-libp2p/pull/2107
[PR 2248]: https://github.com/libp2p/rust-libp2p/pull/2248
[PR 2261]: https://github.com/libp2p/rust-libp2p/pull/2261
[RFC0002]: https://github.com/libp2p/specs/blob/master/RFC/0002-signed-envelopes.md
[RFC0003]: https://github.com/libp2p/specs/blob/master/RFC/0003-routing-records.md
## 0.29.0 [2021-07-12]
- 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](https://github.com/libp2p/rust-libp2p/pull/2111).
[PR 2090]: https://github.com/libp2p/rust-libp2p/pull/2090
## 0.28.3 [2021-04-26]
- Fix build with secp256k1 disabled [PR 2057](https://github.com/libp2p/rust-libp2p/pull/2057).
## 0.28.2 [2021-04-13]
- Update dependencies.
## 0.28.1 [2021-03-17]
- Update `paritytech-multiaddr` to `>=v0.11.2`.
## 0.28.0 [2021-03-17]
- `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.
## 0.27.1 [2021-02-15]
- Update dependencies.
## 0.27.0 [2021-01-12]
- (Re)add `Transport::address_translation` to permit transport-specific
translations of observed addresses onto listening addresses.
[PR 1887](https://github.com/libp2p/rust-libp2p/pull/1887)
- Update dependencies.
## 0.26.0 [2020-12-17]
- Make `PeerId` be `Copy`, including small `PeerId` API changes.
[PR 1874](https://github.com/libp2p/rust-libp2p/pull/1874/).
## 0.25.2 [2020-12-02]
- Require `multistream-select-0.9.1`.
## 0.25.1 [2020-11-25]
- Add missing multiaddr upgrade.
## 0.25.0 [2020-11-25]
- The `NetworkConfig` API is now a builder that moves `self`.
[PR 1848](https://github.com/libp2p/rust-libp2p/pull/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` intead of `usize` types.
[PR 1848](https://github.com/libp2p/rust-libp2p/pull/1848/).
- Update `multihash`.
- Update `multistream-select`.
## 0.24.0 [2020-11-09]
- Remove `ConnectionInfo` trait and replace it with `PeerId`
everywhere. This was already effectively the case because
`ConnectionInfo` was implemented on `PeerId`.
## 0.23.1 [2020-10-20]
- Update dependencies.
## 0.23.0 [2020-10-16]
- Rework transport boxing and move timeout configuration
to the transport builder.
[PR 1794](https://github.com/libp2p/rust-libp2p/pull/1794).
- Update dependencies.
## 0.22.1 [2020-09-10]
- Require at least parity-multiaddr v0.9.2 in order to fulfill `Ord` bound on
`Multiaddr`. [PR 1742](https://github.com/libp2p/rust-libp2p/pull/1742).
## 0.22.0 [2020-09-09]
- Simplify incoming connection handling. The `IncomingConnectionEvent`
has been removed. Instead, pass the `IncomingConnection` obtained
from `NetworkEvent::IncomingConnection` to `Network::accept()`.
[PR 1732](https://github.com/libp2p/rust-libp2p/pull/1732).
- Allow any closure to be passed as an executor.
[PR 1686](https://github.com/libp2p/rust-libp2p/pull/1686)
- Remove `PeerId` compatibility mode for "identity" and SHA2 hashes.
Historically, before 0.12, `PeerId`s 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 `PeerId`s 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](https://github.com/libp2p/rust-libp2p/pull/1608).
- Return dialer address instead of listener address as `remote_addr` in
`MemoryTransport` `Listener` `ListenerEvent::Upgrade`
[PR 1724](https://github.com/libp2p/rust-libp2p/pull/1724).
## 0.21.0 [2020-08-18]
- Remove duplicates when performing address translation
[PR 1697](https://github.com/libp2p/rust-libp2p/pull/1697).
- Add `transport::Builder::multiplex_ext` for further customisation during
`StreamMuxer` creation. [PR 1691](https://github.com/libp2p/rust-libp2p/pull/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, `disconnect`ing
a peer takes effect immediately without an orderly connection shutdown.
See [PR 1619](https://github.com/libp2p/rust-libp2p/pull/1619) for further details.
- Add `ConnectedPoint::get_remote_address`
([PR 1649](https://github.com/libp2p/rust-libp2p/pull/1649)).
## 0.20.1 [2020-07-17]
- Update ed25519-dalek dependency.
## 0.20.0 [2020-07-01]
- Conditional compilation fixes for the `wasm32-wasi` target
([PR 1633](https://github.com/libp2p/rust-libp2p/pull/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`.
## 0.19.2 [2020-06-22]
- Add PartialOrd and Ord for PeerId
([PR 1594](https://github.com/libp2p/rust-libp2p/pull/1594)).
- Updated dependencies.
- Deprecate `StreamMuxer::is_remote_acknowledged`
([PR 1616](https://github.com/libp2p/rust-libp2p/pull/1616)).