Skip to content
Snippets Groups Projects
  • Nazar Mokrynskyi's avatar
    Upgrade libp2p from 0.52.4 to 0.54.1 (#6248) · c8812883
    Nazar Mokrynskyi authored
    
    # 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: default avatarDmitry Markin <dmitry@markin.tech>
    Unverified
    c8812883
Code owners
Assign users and groups as approvers for specific file changes. Learn more.