Upgrade libp2p from 0.52.4 to 0.54.1 (#6248)
# Description
Fixes https://github.com/paritytech/polkadot-sdk/issues/5996
https://github.com/libp2p/rust-libp2p/releases/tag/libp2p-v0.53.0
https://github.com/libp2p/rust-libp2p/blob/master/CHANGELOG.md
## Integration
Nothing special is needed, just note that `yamux_window_size` is no
longer applicable to libp2p (litep2p seems to still have it though).
## Review Notes
There are a few simplifications and improvements done in libp2p 0.53
regarding swarm interface, I'll list a few key/applicable here.
https://github.com/libp2p/rust-libp2p/pull/4788 removed
`write_length_prefixed` function, so I inlined its code instead.
https://github.com/libp2p/rust-libp2p/pull/4120 introduced new
`libp2p::SwarmBuilder` instead of now deprecated
`libp2p::swarm::SwarmBuilder`, the transition is straightforward and
quite ergonomic (can be seen in tests).
https://github.com/libp2p/rust-libp2p/pull/4581 is the most annoying
change I have seen that basically makes many enums `#[non_exhaustive]`.
I mapped some, but those that couldn't be mapped I dealt with by
printing log messages once they are hit (the best solution I could come
up with, at least with stable Rust).
https://github.com/libp2p/rust-libp2p/issues/4306 makes connection close
as soon as there are no handler using it, so I had to replace
`KeepAlive::Until` with an explicit future that flips internal boolean
after timeout, achieving the old behavior, though it should ideally be
removed completely at some point.
`yamux_window_size` is no longer used by libp2p thanks to
https://github.com/libp2p/rust-libp2p/pull/4970 and generally Yamux
should have a higher performance now.
I have resolved and cleaned up all deprecations related to libp2p except
`BandwidthSinks`. Libp2p deprecated it (though it is still present in
0.54.1, which is why I didn't handle it just yet). Ideally Substrate
would finally [switch to the official Prometheus
client](https://github.com/paritytech/substrate/issues/12699), in which
case we'd get metrics for free. Otherwise a bit of code will need to be
copy-pasted to maintain current behavior with `BandwidthSinks` gone,
which I left a TODO about.
The biggest change in 0.54.0 is
https://github.com/libp2p/rust-libp2p/pull/4568 that changed transport
APIs and enabled unconditional potential port reuse, which can lead to
very confusing errors if running two Substrate nodes on the same machine
without changing listening port explicitly.
Overall nothing scary here, but testing is always appreciated.
# Checklist
* [x] My PR includes a detailed description as outlined in the
"Description" and its two subsections above.
* [x] My PR follows the [labeling requirements](
https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/CONTRIBUTING.md#Process
) of this project (at minimum one label for `T` required)
* External contributors: ask maintainers to put the right label on your
PR.
---
Polkadot Address: 1vSxzbyz2cJREAuVWjhXUT1ds8vBzoxn2w4asNpusQKwjJd
---------
Co-authored-by: Dmitry Markin <[email protected]>