From 3b5855b7dcee72c0f2cdebf607a6e80c10f4b584 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 30 Dec 2022 19:17:05 +0100 Subject: [PATCH 01/17] src/_blog: Add rust-libpp2p in 2022 post --- src/_blog/rust-libp2p-2022.md | 200 ++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 src/_blog/rust-libp2p-2022.md diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md new file mode 100644 index 00000000..3ad8726e --- /dev/null +++ b/src/_blog/rust-libp2p-2022.md @@ -0,0 +1,200 @@ +--- +tags: +- libp2p +- rust +title: rust-libp2p in 2022 +description: Recapitulating the year 2022 for the rust-libp2p project +date: 2022-12-30 +permalink: "/2022-12-30-rust-libp2p-in-2022" +translationKey: '' +header_image: +author: Max Inden +--- + +# The rust-libp2p Project in 2022 + +In 2022, the rust-libp2p project saw many notable developments and improvements. +Let's take a closer look at some of the highlights, and one or two mistakes +along the way. Note that while I (Max Inden) am writing this blog post, this is +the work of many across various companies and countries. + +We started the year with the release of the various components needed for hole +punching. We added the Circuit Relay v2 protocol, DCUtR protocol and AutoNAT +protocol. With that rust-libp2p +[v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) in +February was the first rust-libp2p release with hole punching capabilities. + +861e15da * src/tutorials: Add hole punching tutorial (#2460) +0bb8ee98 * protocols/: Implement Direct Connection Upgrade through Relay (DCUtR) (#2438) +96dbfcd1 * core/src/transport: Add `Transport::dial_as_listener` (#2363) +17ee5047 * protocols/relay: Implement circuit relay v2 protocol (#2059) +c61ea6ad * protocols/: Add basic AutoNAT implementation (#2262) +74f31f12 * {core,swarm}/: Allow configuring dial concurrency factor per dial (#2404) + +To improve what we rolled out in the beginning of the year, the libp2p project +started the _Hole Punching Measurement Campaign_ aka. _Hole Punching Month_in +collaboration with ProbeLab. A multitude of clients using both go-libp2p and +rust-libp2p are currently punching holes across the globe, providing valuable +data that we can later on use to improve the libp2p specification and the two +implementations. + +Over the year we worked on two new transports, namely WebRTC and QUIC, which we +both released towards the end of the year as alphas. + +WebRTC allows browsers to connect to rust-libp2p based servers without those +servers having signed TLS certificates. QUIC is the better TCP+Noise+Yamux in +every dimension, e.g. faster connection establishment, better multiplexing, +higher hole punching success rates. Along the way, given that QUIC already +requires TLS, rust-libp2p can now secure TCP connections with TLS as well +(previously only Noise). + +a7148648 * feat: Add WebRTC transport (#2622) +0f5c491d * feat(transports/quic): Add implementation based on `quinn-proto` (#2289) +159a10b8 * transports/tls: Add `libp2p-tls` as per spec (#2945) + +Along the way we tackled many smaller improvements, as a whole having a big +impact on the user experience. To mention a couple: naming consistency across +crates, refactoing of the many `inject_*` into a single `enum` event handler in +both `NetworkBehaviour` and `ConnectionHandler` and the rework of our Rust +feature flags. + +5782a96a * refactor(swarm)!: don't be generic over `Transport` (#3272) +93335b88 * refactor(dcutr): reshape public API to follow naming guidelines (#3214) +be3ec6c6 * refactor(swarm)!: deprecate `PollParameters` where possible (#3153) +f828db60 * refactor(request-response): revise public API to follow naming convention (#3159) +7803524a * swarm/handler: replace inject_* methods (#3085) +3df3c88f * swarm/behaviour: Replace `inject_*` with `on_event` (#3011) +a7a96e55 * protocols/identify: Revise symbol naming (#2927) +1da75b2b * protocols/ping: Properly deprecate types with `Ping` prefix (#2937) +f6bb846c * *: Remove default features from all crates (#2918) +45faefa3 * *: Unfiy how we depend on crates across the workspace (#2886) +62622a1b * core/src/transport: Poll Transport directly, remove Transport::Listener (#2652) +bbd2f8f0 * misc/prost-codec: Introduce codec for varint prefixed Protobuf messages (#2630) +2ad905f3 * {core,swarm}/: Don't require `Transport: Clone` and take `&mut` (#2529) +e2fcc47d * swarm/src/behaviour: Remove Send bound from NetworkBehaviour (#2535) +fd2be38f * swarm/: Rename ProtocolsHandler to ConnectionHandler (#2527) +8ffa84e7 * swarm/src: Remove ConnectionHandler (#2519) +7fc342e6 * {core,swarm}: Remove Network abstraction (#2492) +dc8433e3 * swarm/src/behaviour: Merge inject_* paired methods (#2445) + +Still remember the old days with the `NetworkBehaviourEventProcess` trait? All +gone in favor of the much simpler (generated) `OutEvent` mechanism. + +6855ab94 * swarm-derive/: Remove support for ignoring fields on struct (#2842) +247b5536 * swarm-derive/: Remove support for custom poll method (#2841) +ca07ce4d * swarm/behaviour: Remove deprecated NetworkBehaviourEventProcess (#2840) +878c49fa * swarm/src/behaviour: Deprecate NetworkBehaviourEventProcess (#2784) +579b1be5 * swarm-derive/: Generate OutEvent if not provided (#2792) + +The `StreamMuxer` trait received some significant simplifications, basically +rewriting the trait as well as its implementation in yamux, mplex and now QUIC +and WebRTC. + +cef50568 * core/muxing: Generalise `StreamMuxer::poll_address_change` to `poll` (#2797) +028decec * core/muxing: Have functions on `StreamMuxer` take `Pin<&mut Self>` (#2765) +56c492cf * core/muxing: Drop `Sync` requirement for `StreamMuxer` on `StreamMuxerBox` (#2775) +0ec3bbcc * core/muxing: Remove `Unpin` requirement from `StreamMuxer::Substream` (#2776) +f15a3dc4 * core/muxing: Drop `Unpin` requirement from `SubstreamBox` (#2762) +1a553db5 * core/muxing: Flatten `StreamMuxer` interface to `poll_{inbound,outbound,address_change,close}` (#2724) +eb490c08 * core/muxing: Force `StreamMuxer::Substream` to implement `Async{Read,Write}` (#2707) +ea487aeb * muxers/mplex: Implement `AsyncRead` and `AsyncWrite` for `Substream` (#2706) +3c120ef9 * core/muxing: Introduce `StreamMuxerEvent::map_inbound_stream` (#2691) +04f31cd5 * core/muxing: Introduce `boxed` module (#2703) +2b79f113 * core/muxing: Remove the `StreamMuxer::flush_all` function (#2669) +25c8bc24 * core/muxing: Rename `close` to `poll_close` (#2666) +8361fabb * core/src/muxing: Remove deprecated function (#2665) + +Defense against denial-of-service attacks is a cornerstone of a networking +library, especially in the peer-to-peer space. rust-libp2p saw a lot of related +improvements in 2022. We enforce various limits (e.g. on the number of +connections, streams, bytes of a request) and prioritize local work over new +incoming work from a remote across the many layers. + +a4d1e588 * swarm/connection: Enforce limit on inbound substreams via `StreamMuxer` (#2861) +5cb4886a * protocols/kad: Limit # of inbound substreams to 32 (#2699) +0d3787ed * protocols/relay: Limit inbound streams (#2698) +2acbb457 * swarm/: Limit negotiating inbound substreams per connection (#2697) +59a74b40 * protocols/dcutr: Upgrade at most one inbound connect request (#2695) +676a6308 * protocols/identify: Allow at most one inbound identify push stream (#2694) +9a5fec87 * swarm/src/connection: Prioritize handler over negotiating streams (#2638) +afc5b8d8 * swarm/src/lib: Prioritize Behaviour over Pool and Pool over Listeners (#2627) +3e1ed95c * swarm/src/connection: Prioritize handler over connection (#2626) + +Understanding large systems is hard. Understanding distributed systems is even +harder. We made understanding large libp2p networks a bit easier in 2022 +introducing a metric crate for rust-libp2p exposing Prometheus metrics, e.g. the +time to establish a connection or the protocols supported by peers. + +fb45ce37 * fix(metrics): Update connections_establishment_duration buckets (#3256) +f8f19baa * umgefahren/master time to establish connection (#3134) +69efe632 * misc/metrics: Add `protocols` label to address-specific metrics (#2982) +d4f8ec2d * misc/metrics: Track # connected nodes supporting specific protocol (#2734) + +libp2p is an open-community open-source project. What do I mean by that? +libp2p's source code is open (open-source) and that source code is written by an +open community. libp2p is not developed by one or 10 people, but much rather 30 +to 50 people across many companies, countries, cultures and development styles. +One thing that allows us to be productive despite the large number of people is +automation. We invested heavily into rust-libp2p's automation, more specifically +our continuous integration setup. + +65ec5454 * ci(dependabot): disable automatic rebase of PRs (#3266) +13a59a38 * ci(caching): split caches by matrix variables (#3257) +5fe0dc44 * ci(caching): make caching more effective (#3215) +868c3805 * ci: enforce PR titles to follow the conventional commit specification (#3204) +cbf0a273 * ci(mergify): dismiss approvals on push once `send-it` is applied (#3231) +cafa7344 * .github/: Use `Description` for commit message and add `Notes` (#3082) +cec1a8d2 * docs/release: Document cargo-release process and mention root changelog (#3028) +3371d7ce * .github/workflows: Enforce semver compliance with `cargo semver-checks` (#2647) +1b793242 * .cargo: Run `clippy` on ALL the source files (#2949) +e6da99e4 * .github/workflows: Deny cargo doc warnings in CI (#2936) +217dd2ca * clippy.toml: Create config and disallow unbounded channels (#2823) +09386387 * .github/: Add templates for Issues and PRs (#2611) + +rust-libp2p is one implementation of many of the libp2p specification. How do we +ensure we are compatible across implementations? In 2022 we started the libp2p +interoperability project and as of September 2022 we continuously test that the +various versions of go-libp2p and rust-libp2p can connect. In December we added +nim-libp2p, in 2023 we will ad js-libp2p. + +a40180c3 * .github/: Introduce interop tests (#2835) + +At this point, rust-libp2p is a large complex codebase. In August we added a +coding guideline to the project, allowing us to agree on a set of rules to +enforce consistency across the project and enable newcomers to hit the ground +running. Projects outside of the libp2p realm might find this guideline useful, +as it documents an opinionated style doing asynchronous networking in Rust. + +475289c1 * docs/coding-guidelines: Add document (#2780) + +We were able to incorporate some of the new shiny Rust features. In November we +introduced a patch using const generics. In December we merged our first pull +request using GATs. Lots more to come. + +1765ae03 * feat(kademlia)!: use GATs on `RecordStore` trait (#3239) +2fd49989 * Cargo.toml: Use Rust 1.60.0 and weak dependency for feats (#2646) +a9971816 * protocols/kad: Improve options to efficiently retrieve (#2712) + +999a2126 * README.md: Add elenaf9 to Maintainers (#2656) +TODO: Also mention jxs + +- Which conferences did we speak at? +- More stats on contributions, number of releases, number of downloads +- What did we not do? + +Releasing rust-libp2p turns out to be quite difficult. + +TODO: List the many follow-up commits. +- Mistakes on releases: Every release +be0b62a7 * libp2p-swarm-v0.41.1 libp2p-swarm-derive-v0.31.0 libp2p fix(derive): Release breaking change as v0.31.0 (#3178) + +Since January the rust-libp2p monorepo has a small CLI tool for libp2p key management. + +e38eb09f * misc/keygen: Implement cli tool to handle key material (#2453) + +Let's end this post with a document for the future, namely our rust-libp2p +project roadmap. There are lots of exciting features and improvements coming up +in 2023, e.g. improved WASM support, WebRTC browser-to-browser and hopefully an +implementation of the shiny new WebTransport transport. + +56a4a946 * Roadmap.md: Discuss the near term future of rust-libp2p (#2997) From de78517aa6ae265cfce4aa55d6d1397f39fcc586 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 2 Jan 2023 13:56:50 +0100 Subject: [PATCH 02/17] Restructure post --- src/_blog/rust-libp2p-2022.md | 247 ++++++++++------------------------ 1 file changed, 70 insertions(+), 177 deletions(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 3ad8726e..b68a7c92 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -14,187 +14,80 @@ author: Max Inden # The rust-libp2p Project in 2022 In 2022, the rust-libp2p project saw many notable developments and improvements. -Let's take a closer look at some of the highlights, and one or two mistakes -along the way. Note that while I (Max Inden) am writing this blog post, this is -the work of many across various companies and countries. - -We started the year with the release of the various components needed for hole -punching. We added the Circuit Relay v2 protocol, DCUtR protocol and AutoNAT -protocol. With that rust-libp2p -[v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) in -February was the first rust-libp2p release with hole punching capabilities. - -861e15da * src/tutorials: Add hole punching tutorial (#2460) -0bb8ee98 * protocols/: Implement Direct Connection Upgrade through Relay (DCUtR) (#2438) -96dbfcd1 * core/src/transport: Add `Transport::dial_as_listener` (#2363) -17ee5047 * protocols/relay: Implement circuit relay v2 protocol (#2059) -c61ea6ad * protocols/: Add basic AutoNAT implementation (#2262) -74f31f12 * {core,swarm}/: Allow configuring dial concurrency factor per dial (#2404) - -To improve what we rolled out in the beginning of the year, the libp2p project -started the _Hole Punching Measurement Campaign_ aka. _Hole Punching Month_in -collaboration with ProbeLab. A multitude of clients using both go-libp2p and -rust-libp2p are currently punching holes across the globe, providing valuable -data that we can later on use to improve the libp2p specification and the two -implementations. - -Over the year we worked on two new transports, namely WebRTC and QUIC, which we -both released towards the end of the year as alphas. - -WebRTC allows browsers to connect to rust-libp2p based servers without those -servers having signed TLS certificates. QUIC is the better TCP+Noise+Yamux in -every dimension, e.g. faster connection establishment, better multiplexing, -higher hole punching success rates. Along the way, given that QUIC already -requires TLS, rust-libp2p can now secure TCP connections with TLS as well -(previously only Noise). - -a7148648 * feat: Add WebRTC transport (#2622) -0f5c491d * feat(transports/quic): Add implementation based on `quinn-proto` (#2289) -159a10b8 * transports/tls: Add `libp2p-tls` as per spec (#2945) - -Along the way we tackled many smaller improvements, as a whole having a big -impact on the user experience. To mention a couple: naming consistency across -crates, refactoing of the many `inject_*` into a single `enum` event handler in -both `NetworkBehaviour` and `ConnectionHandler` and the rework of our Rust -feature flags. - -5782a96a * refactor(swarm)!: don't be generic over `Transport` (#3272) -93335b88 * refactor(dcutr): reshape public API to follow naming guidelines (#3214) -be3ec6c6 * refactor(swarm)!: deprecate `PollParameters` where possible (#3153) -f828db60 * refactor(request-response): revise public API to follow naming convention (#3159) -7803524a * swarm/handler: replace inject_* methods (#3085) -3df3c88f * swarm/behaviour: Replace `inject_*` with `on_event` (#3011) -a7a96e55 * protocols/identify: Revise symbol naming (#2927) -1da75b2b * protocols/ping: Properly deprecate types with `Ping` prefix (#2937) -f6bb846c * *: Remove default features from all crates (#2918) -45faefa3 * *: Unfiy how we depend on crates across the workspace (#2886) -62622a1b * core/src/transport: Poll Transport directly, remove Transport::Listener (#2652) -bbd2f8f0 * misc/prost-codec: Introduce codec for varint prefixed Protobuf messages (#2630) -2ad905f3 * {core,swarm}/: Don't require `Transport: Clone` and take `&mut` (#2529) -e2fcc47d * swarm/src/behaviour: Remove Send bound from NetworkBehaviour (#2535) -fd2be38f * swarm/: Rename ProtocolsHandler to ConnectionHandler (#2527) -8ffa84e7 * swarm/src: Remove ConnectionHandler (#2519) -7fc342e6 * {core,swarm}: Remove Network abstraction (#2492) -dc8433e3 * swarm/src/behaviour: Merge inject_* paired methods (#2445) - -Still remember the old days with the `NetworkBehaviourEventProcess` trait? All -gone in favor of the much simpler (generated) `OutEvent` mechanism. - -6855ab94 * swarm-derive/: Remove support for ignoring fields on struct (#2842) -247b5536 * swarm-derive/: Remove support for custom poll method (#2841) -ca07ce4d * swarm/behaviour: Remove deprecated NetworkBehaviourEventProcess (#2840) -878c49fa * swarm/src/behaviour: Deprecate NetworkBehaviourEventProcess (#2784) -579b1be5 * swarm-derive/: Generate OutEvent if not provided (#2792) - -The `StreamMuxer` trait received some significant simplifications, basically -rewriting the trait as well as its implementation in yamux, mplex and now QUIC -and WebRTC. - -cef50568 * core/muxing: Generalise `StreamMuxer::poll_address_change` to `poll` (#2797) -028decec * core/muxing: Have functions on `StreamMuxer` take `Pin<&mut Self>` (#2765) -56c492cf * core/muxing: Drop `Sync` requirement for `StreamMuxer` on `StreamMuxerBox` (#2775) -0ec3bbcc * core/muxing: Remove `Unpin` requirement from `StreamMuxer::Substream` (#2776) -f15a3dc4 * core/muxing: Drop `Unpin` requirement from `SubstreamBox` (#2762) -1a553db5 * core/muxing: Flatten `StreamMuxer` interface to `poll_{inbound,outbound,address_change,close}` (#2724) -eb490c08 * core/muxing: Force `StreamMuxer::Substream` to implement `Async{Read,Write}` (#2707) -ea487aeb * muxers/mplex: Implement `AsyncRead` and `AsyncWrite` for `Substream` (#2706) -3c120ef9 * core/muxing: Introduce `StreamMuxerEvent::map_inbound_stream` (#2691) -04f31cd5 * core/muxing: Introduce `boxed` module (#2703) -2b79f113 * core/muxing: Remove the `StreamMuxer::flush_all` function (#2669) -25c8bc24 * core/muxing: Rename `close` to `poll_close` (#2666) -8361fabb * core/src/muxing: Remove deprecated function (#2665) - -Defense against denial-of-service attacks is a cornerstone of a networking -library, especially in the peer-to-peer space. rust-libp2p saw a lot of related -improvements in 2022. We enforce various limits (e.g. on the number of -connections, streams, bytes of a request) and prioritize local work over new -incoming work from a remote across the many layers. - -a4d1e588 * swarm/connection: Enforce limit on inbound substreams via `StreamMuxer` (#2861) -5cb4886a * protocols/kad: Limit # of inbound substreams to 32 (#2699) -0d3787ed * protocols/relay: Limit inbound streams (#2698) -2acbb457 * swarm/: Limit negotiating inbound substreams per connection (#2697) -59a74b40 * protocols/dcutr: Upgrade at most one inbound connect request (#2695) -676a6308 * protocols/identify: Allow at most one inbound identify push stream (#2694) -9a5fec87 * swarm/src/connection: Prioritize handler over negotiating streams (#2638) -afc5b8d8 * swarm/src/lib: Prioritize Behaviour over Pool and Pool over Listeners (#2627) -3e1ed95c * swarm/src/connection: Prioritize handler over connection (#2626) - -Understanding large systems is hard. Understanding distributed systems is even -harder. We made understanding large libp2p networks a bit easier in 2022 -introducing a metric crate for rust-libp2p exposing Prometheus metrics, e.g. the -time to establish a connection or the protocols supported by peers. - -fb45ce37 * fix(metrics): Update connections_establishment_duration buckets (#3256) -f8f19baa * umgefahren/master time to establish connection (#3134) -69efe632 * misc/metrics: Add `protocols` label to address-specific metrics (#2982) -d4f8ec2d * misc/metrics: Track # connected nodes supporting specific protocol (#2734) - -libp2p is an open-community open-source project. What do I mean by that? -libp2p's source code is open (open-source) and that source code is written by an -open community. libp2p is not developed by one or 10 people, but much rather 30 -to 50 people across many companies, countries, cultures and development styles. -One thing that allows us to be productive despite the large number of people is -automation. We invested heavily into rust-libp2p's automation, more specifically -our continuous integration setup. - -65ec5454 * ci(dependabot): disable automatic rebase of PRs (#3266) -13a59a38 * ci(caching): split caches by matrix variables (#3257) -5fe0dc44 * ci(caching): make caching more effective (#3215) -868c3805 * ci: enforce PR titles to follow the conventional commit specification (#3204) -cbf0a273 * ci(mergify): dismiss approvals on push once `send-it` is applied (#3231) -cafa7344 * .github/: Use `Description` for commit message and add `Notes` (#3082) -cec1a8d2 * docs/release: Document cargo-release process and mention root changelog (#3028) -3371d7ce * .github/workflows: Enforce semver compliance with `cargo semver-checks` (#2647) -1b793242 * .cargo: Run `clippy` on ALL the source files (#2949) -e6da99e4 * .github/workflows: Deny cargo doc warnings in CI (#2936) -217dd2ca * clippy.toml: Create config and disallow unbounded channels (#2823) -09386387 * .github/: Add templates for Issues and PRs (#2611) - -rust-libp2p is one implementation of many of the libp2p specification. How do we -ensure we are compatible across implementations? In 2022 we started the libp2p -interoperability project and as of September 2022 we continuously test that the -various versions of go-libp2p and rust-libp2p can connect. In December we added -nim-libp2p, in 2023 we will ad js-libp2p. - -a40180c3 * .github/: Introduce interop tests (#2835) - -At this point, rust-libp2p is a large complex codebase. In August we added a -coding guideline to the project, allowing us to agree on a set of rules to -enforce consistency across the project and enable newcomers to hit the ground -running. Projects outside of the libp2p realm might find this guideline useful, -as it documents an opinionated style doing asynchronous networking in Rust. - -475289c1 * docs/coding-guidelines: Add document (#2780) - -We were able to incorporate some of the new shiny Rust features. In November we -introduced a patch using const generics. In December we merged our first pull -request using GATs. Lots more to come. - -1765ae03 * feat(kademlia)!: use GATs on `RecordStore` trait (#3239) -2fd49989 * Cargo.toml: Use Rust 1.60.0 and weak dependency for feats (#2646) -a9971816 * protocols/kad: Improve options to efficiently retrieve (#2712) - -999a2126 * README.md: Add elenaf9 to Maintainers (#2656) -TODO: Also mention jxs +Let's take a closer look at some of the technical highlights and on the meta level developments of the project itself. +Note that while I (Max Inden) am writing this blog post, this is the work of many across various organizations. -- Which conferences did we speak at? -- More stats on contributions, number of releases, number of downloads -- What did we not do? +## Technical Highlights + +We started the year with the release of the various components needed for hole punching. +We added the [Circuit Relay v2 protocol](https://github.com/libp2p/rust-libp2p/pull/2059), [DCUtR protocol](https://github.com/libp2p/rust-libp2p/pull/2438) and [AutoNAT protocol](https://github.com/libp2p/rust-libp2p/pull/2262). +With that rust-libp2p [v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) in February was the first rust-libp2p release with hole punching capabilities. + +To improve what we rolled out in the beginning of the year, the libp2p project started the _Hole Punching Measurement Campaign_ aka. _Hole Punching Month_in collaboration with ProbeLab. +A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com/libp2p/punchr/) are currently punching holes across the globe, providing valuable data that we can later on use to improve the libp2p specification and the two implementations. + +Over the year we worked on two new transports, namely [WebRTC](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alphas. + +WebRTC allows browsers to connect to rust-libp2p based servers without those servers having signed TLS certificates. +QUIC is the better TCP+Noise+Yamux in every dimension, e.g. faster connection establishment, better multiplexing, higher hole punching success rates. +Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). + +Along the way we tackled many smaller improvements, as a whole having a big impact on the user experience. +To mention a couple: [naming consistency across crates](https://github.com/libp2p/rust-libp2p/issues/2217), [refactoing of the many `inject_*` into a single `enum` event handler in both `NetworkBehaviour` and `ConnectionHandler`](https://github.com/libp2p/rust-libp2p/issues/2832), [deprecation of event-based `PollParameters`](https://github.com/libp2p/rust-libp2p/pull/3153), and the [rework of our Rust feature flags](https://github.com/libp2p/rust-libp2p/pull/2918). + +Still remember the old days with the `NetworkBehaviourEventProcess` trait? +[All gone](https://github.com/libp2p/rust-libp2p/pull/2784) in favor of the much simpler (generated) `OutEvent` mechanism. + +The `StreamMuxer` trait received numerous significant simplifications, [basically rewriting](https://github.com/libp2p/rust-libp2p/issues/2722) the trait as well as the trait implementation in yamux, mplex and now QUIC and WebRTC. + +Defense against denial-of-service attacks is a cornerstone of a networking library, especially in the peer-to-peer space. +rust-libp2p saw a lot of related improvements in 2022. +We enforce various limits (e.g. on the [number of streams](https://github.com/libp2p/rust-libp2p/pull/2697), bytes of a request) and [prioritize local work over new incoming work from a remote](https://github.com/libp2p/rust-libp2p/pull/2627) across the many layers. +Up next is a patch [enabling `NetworkBehaviour` implementations to implement their own connection management strategies](https://github.com/libp2p/rust-libp2p/issues/2824). -Releasing rust-libp2p turns out to be quite difficult. +Understanding large systems is hard. +Understanding distributed systems is even harder. +We made understanding large libp2p networks a bit easier in 2022 introducing a metric crate for rust-libp2p exposing Prometheus metrics, e.g. the [time to establish a connection](https://github.com/libp2p/rust-libp2p/pull/3134) or the [protocols supported by peers](https://github.com/libp2p/rust-libp2p/pull/2734). -TODO: List the many follow-up commits. -- Mistakes on releases: Every release -be0b62a7 * libp2p-swarm-v0.41.1 libp2p-swarm-derive-v0.31.0 libp2p fix(derive): Release breaking change as v0.31.0 (#3178) +Since January the rust-libp2p monorepo has a [handy CLI tool for libp2p key management](https://github.com/libp2p/rust-libp2p/pull/2453). -Since January the rust-libp2p monorepo has a small CLI tool for libp2p key management. +## Meta - Improvements to the Project + +libp2p is an open-community open-source project. +What do I mean by that? +libp2p's source code is open-source and that source code is written by an open community. +libp2p is not developed by one or 10 people, but much rather >100 people across many organizations. + +The core rust-libp2p maintainer team grew from two engineers to four, with [Elena](https://github.com/libp2p/rust-libp2p/pull/2656) and [João](https://github.com/libp2p/rust-libp2p/pull/3295) joining the team. Beyond the core maintainers, a total of 70 people contributed to rust-libp2p's `master` branch in 2022. + +One thing that allows us to be productive despite the large number of people contributing to the project is automation. +We invested heavily into rust-libp2p's automation. + +Big quality of life improvement was the [introduction of mergify](https://github.com/libp2p/rust-libp2p/pull/3026). +We enforce semver compliance via [`cargo-semver-checks`](https://github.com/libp2p/rust-libp2p/pull/2647). +We adopted [conventional commit](https://github.com/libp2p/rust-libp2p/pull/3204) convention. +We did a [large refactoring of the CI job structure](https://github.com/libp2p/rust-libp2p/pull/3090), testing crates individually, thus increasing parallelism, improving caching and catching interdependency issues. + +rust-libp2p is one implementation of many of the libp2p specification. +How do we ensure we are compatible across implementations? +In 2022 we started the libp2p interoperability project and as of [September 2022 we continuously test](https://github.com/libp2p/rust-libp2p/pull/2835) that the various versions of go-libp2p and rust-libp2p can connect. In December we added nim-libp2p, in 2023 we will ad js-libp2p. + +At this point, rust-libp2p is a large complex codebase. +In August we added a [coding guideline](https://github.com/libp2p/rust-libp2p/pull/2780) to the project, allowing us to agree on a set of rules to enforce consistency across the project and enable newcomers to hit the ground running. +Projects outside of the libp2p realm might find this guideline useful, as it documents an opinionated style doing asynchronous networking in Rust. + +In general, we try to stay on [recent Rust versions], and incorporate some of the new shiny Rust features. +We make use of [Cargo's weak dependencies](https://github.com/libp2p/rust-libp2p/pull/2646). +In November we introduced [a patch using const generics](https://github.com/libp2p/rust-libp2p/pull/2712) (in tests). +In December we merged our [first pull request using GATs](https://github.com/libp2p/rust-libp2p/pull/3239). + +- Which conferences did we speak at? +- More stats on contributions, number of releases, number of downloads +- What did we not do? -e38eb09f * misc/keygen: Implement cli tool to handle key material (#2453) +In 2022 we published 9 releases of the main `libp2p` crate and a total of 268 releases across the workspace including sub-crates and patch releases. -Let's end this post with a document for the future, namely our rust-libp2p -project roadmap. There are lots of exciting features and improvements coming up -in 2023, e.g. improved WASM support, WebRTC browser-to-browser and hopefully an -implementation of the shiny new WebTransport transport. +## What's Next? -56a4a946 * Roadmap.md: Discuss the near term future of rust-libp2p (#2997) +Let's end this post with the document for rust-libp2p's future, namely our [project roadmap](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md) which [we added in October](https://github.com/libp2p/rust-libp2p/pull/2997). +There are lots of exciting features and improvements coming up in 2023, e.g. improved WASM support, the WebRTC browser-to-browser feature and hopefully an implementation of the shiny new WebTransport transport. From 5bac6e2ba42f4e8391d9de5c2793062398fc9215 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 2 Jan 2023 14:02:27 +0100 Subject: [PATCH 03/17] Fix minor issues --- src/_blog/rust-libp2p-2022.md | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index b68a7c92..39fbc2fc 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -23,7 +23,7 @@ We started the year with the release of the various components needed for hole p We added the [Circuit Relay v2 protocol](https://github.com/libp2p/rust-libp2p/pull/2059), [DCUtR protocol](https://github.com/libp2p/rust-libp2p/pull/2438) and [AutoNAT protocol](https://github.com/libp2p/rust-libp2p/pull/2262). With that rust-libp2p [v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) in February was the first rust-libp2p release with hole punching capabilities. -To improve what we rolled out in the beginning of the year, the libp2p project started the _Hole Punching Measurement Campaign_ aka. _Hole Punching Month_in collaboration with ProbeLab. +To improve what we rolled out in the beginning of the year, the libp2p project started the _Hole Punching Measurement Campaign_ aka. _Hole Punching Month_ in collaboration with ProbeLab. A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com/libp2p/punchr/) are currently punching holes across the globe, providing valuable data that we can later on use to improve the libp2p specification and the two implementations. Over the year we worked on two new transports, namely [WebRTC](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alphas. @@ -34,16 +34,14 @@ Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure Along the way we tackled many smaller improvements, as a whole having a big impact on the user experience. To mention a couple: [naming consistency across crates](https://github.com/libp2p/rust-libp2p/issues/2217), [refactoing of the many `inject_*` into a single `enum` event handler in both `NetworkBehaviour` and `ConnectionHandler`](https://github.com/libp2p/rust-libp2p/issues/2832), [deprecation of event-based `PollParameters`](https://github.com/libp2p/rust-libp2p/pull/3153), and the [rework of our Rust feature flags](https://github.com/libp2p/rust-libp2p/pull/2918). - Still remember the old days with the `NetworkBehaviourEventProcess` trait? [All gone](https://github.com/libp2p/rust-libp2p/pull/2784) in favor of the much simpler (generated) `OutEvent` mechanism. - The `StreamMuxer` trait received numerous significant simplifications, [basically rewriting](https://github.com/libp2p/rust-libp2p/issues/2722) the trait as well as the trait implementation in yamux, mplex and now QUIC and WebRTC. Defense against denial-of-service attacks is a cornerstone of a networking library, especially in the peer-to-peer space. rust-libp2p saw a lot of related improvements in 2022. -We enforce various limits (e.g. on the [number of streams](https://github.com/libp2p/rust-libp2p/pull/2697), bytes of a request) and [prioritize local work over new incoming work from a remote](https://github.com/libp2p/rust-libp2p/pull/2627) across the many layers. -Up next is a patch [enabling `NetworkBehaviour` implementations to implement their own connection management strategies](https://github.com/libp2p/rust-libp2p/issues/2824). +We enforce various limits (e.g. on the [number of streams](https://github.com/libp2p/rust-libp2p/pull/2697) and bytes of a request) and [prioritize local work over new incoming work from a remote](https://github.com/libp2p/rust-libp2p/pull/2627) across the many layers. +Up next is [a patch](https://github.com/libp2p/rust-libp2p/issues/2824) enabling `NetworkBehaviour` implementations to implement their own connection management strategies. Understanding large systems is hard. Understanding distributed systems is even harder. @@ -51,6 +49,11 @@ We made understanding large libp2p networks a bit easier in 2022 introducing a m Since January the rust-libp2p monorepo has a [handy CLI tool for libp2p key management](https://github.com/libp2p/rust-libp2p/pull/2453). +In general, we keep up with [recent developments of the Rust language], and incorporate some of its new shiny features. +We make use of [Cargo's weak dependencies](https://github.com/libp2p/rust-libp2p/pull/2646). +In November we introduced [a patch using const generics](https://github.com/libp2p/rust-libp2p/pull/2712) (in tests). +In December we merged our [first pull request using GATs](https://github.com/libp2p/rust-libp2p/pull/3239). + ## Meta - Improvements to the Project libp2p is an open-community open-source project. @@ -74,20 +77,11 @@ In 2022 we started the libp2p interoperability project and as of [September 2022 At this point, rust-libp2p is a large complex codebase. In August we added a [coding guideline](https://github.com/libp2p/rust-libp2p/pull/2780) to the project, allowing us to agree on a set of rules to enforce consistency across the project and enable newcomers to hit the ground running. -Projects outside of the libp2p realm might find this guideline useful, as it documents an opinionated style doing asynchronous networking in Rust. - -In general, we try to stay on [recent Rust versions], and incorporate some of the new shiny Rust features. -We make use of [Cargo's weak dependencies](https://github.com/libp2p/rust-libp2p/pull/2646). -In November we introduced [a patch using const generics](https://github.com/libp2p/rust-libp2p/pull/2712) (in tests). -In December we merged our [first pull request using GATs](https://github.com/libp2p/rust-libp2p/pull/3239). - -- Which conferences did we speak at? -- More stats on contributions, number of releases, number of downloads -- What did we not do? +Projects outside of the libp2p realm might find this guideline useful, as it documents an opinionated way of doing asynchronous networking in Rust. In 2022 we published 9 releases of the main `libp2p` crate and a total of 268 releases across the workspace including sub-crates and patch releases. ## What's Next? -Let's end this post with the document for rust-libp2p's future, namely our [project roadmap](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md) which [we added in October](https://github.com/libp2p/rust-libp2p/pull/2997). +Let's end this post with the document describing rust-libp2p's future, namely our [project roadmap](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md) which [we added in October](https://github.com/libp2p/rust-libp2p/pull/2997). There are lots of exciting features and improvements coming up in 2023, e.g. improved WASM support, the WebRTC browser-to-browser feature and hopefully an implementation of the shiny new WebTransport transport. From 01559457ee0cbbe80e5977713fafe6569cbe6e60 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 2 Jan 2023 15:40:16 +0100 Subject: [PATCH 04/17] Update src/_blog/rust-libp2p-2022.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: João Oliveira --- src/_blog/rust-libp2p-2022.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 39fbc2fc..29ef5cdf 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -23,7 +23,7 @@ We started the year with the release of the various components needed for hole p We added the [Circuit Relay v2 protocol](https://github.com/libp2p/rust-libp2p/pull/2059), [DCUtR protocol](https://github.com/libp2p/rust-libp2p/pull/2438) and [AutoNAT protocol](https://github.com/libp2p/rust-libp2p/pull/2262). With that rust-libp2p [v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) in February was the first rust-libp2p release with hole punching capabilities. -To improve what we rolled out in the beginning of the year, the libp2p project started the _Hole Punching Measurement Campaign_ aka. _Hole Punching Month_ in collaboration with ProbeLab. +To improve what we rolled out in the beginning of the year, the libp2p project started the _Hole Punching Measurement Campaign_ aka. _Hole Punching Month_ in collaboration with [ProbeLab](https://research.protocol.ai/groups/probelab/). A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com/libp2p/punchr/) are currently punching holes across the globe, providing valuable data that we can later on use to improve the libp2p specification and the two implementations. Over the year we worked on two new transports, namely [WebRTC](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alphas. From 85cf6cef6a9780cc05fa1fe558bae592b17b2c77 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Mon, 2 Jan 2023 15:47:49 +0100 Subject: [PATCH 05/17] Rephrasing some after chatting with a certain chat --- src/_blog/rust-libp2p-2022.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 29ef5cdf..c04fb112 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -11,9 +11,9 @@ header_image: author: Max Inden --- -# The rust-libp2p Project in 2022 +# The rust-libp2p Project A Recap of 2022 -In 2022, the rust-libp2p project saw many notable developments and improvements. +The rust-libp2p project has made significant strides in 2022, with numerous technical advancements and improvements to the project itself. Let's take a closer look at some of the technical highlights and on the meta level developments of the project itself. Note that while I (Max Inden) am writing this blog post, this is the work of many across various organizations. @@ -59,7 +59,7 @@ In December we merged our [first pull request using GATs](https://github.com/lib libp2p is an open-community open-source project. What do I mean by that? libp2p's source code is open-source and that source code is written by an open community. -libp2p is not developed by one or 10 people, but much rather >100 people across many organizations. +libp2p is not developed by one or 10 people, but much rather >100 (part-time) people across many organizations. The core rust-libp2p maintainer team grew from two engineers to four, with [Elena](https://github.com/libp2p/rust-libp2p/pull/2656) and [João](https://github.com/libp2p/rust-libp2p/pull/3295) joining the team. Beyond the core maintainers, a total of 70 people contributed to rust-libp2p's `master` branch in 2022. @@ -83,5 +83,5 @@ In 2022 we published 9 releases of the main `libp2p` crate and a total of 268 re ## What's Next? -Let's end this post with the document describing rust-libp2p's future, namely our [project roadmap](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md) which [we added in October](https://github.com/libp2p/rust-libp2p/pull/2997). -There are lots of exciting features and improvements coming up in 2023, e.g. improved WASM support, the WebRTC browser-to-browser feature and hopefully an implementation of the shiny new WebTransport transport. +To conclude this post, it's worth mentioning the rust-libp2p [project roadmap](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md), which [was added in October](https://github.com/libp2p/rust-libp2p/pull/2997) and outlines the planned developments for the project in the future. +Some notable features to look forward to in 2023 include improved WASM support, the WebRTC browser-to-browser feature, and the potential implementation of the new WebTransport transport. From 7ff7ce98c6af2dc65a8b33721bc587d7bde23f05 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Thu, 5 Jan 2023 15:17:23 +0100 Subject: [PATCH 06/17] Apply suggestions from code review Co-authored-by: Prithvi Shahi <50885601+p-shahi@users.noreply.github.com> --- src/_blog/rust-libp2p-2022.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index c04fb112..755795f5 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -11,24 +11,25 @@ header_image: author: Max Inden --- -# The rust-libp2p Project A Recap of 2022 +# The rust-libp2p Project: A Recap of 2022 -The rust-libp2p project has made significant strides in 2022, with numerous technical advancements and improvements to the project itself. +The [rust-libp2p](https://github.com/libp2p/rust-libp2p) project has made significant strides in 2022, with numerous technical advancements and improvements to the project itself. Let's take a closer look at some of the technical highlights and on the meta level developments of the project itself. Note that while I (Max Inden) am writing this blog post, this is the work of many across various organizations. ## Technical Highlights -We started the year with the release of the various components needed for hole punching. +We started the year with the release of the various components needed for [hole punching](https://blog.ipfs.tech/2022-01-20-libp2p-hole-punching/). We added the [Circuit Relay v2 protocol](https://github.com/libp2p/rust-libp2p/pull/2059), [DCUtR protocol](https://github.com/libp2p/rust-libp2p/pull/2438) and [AutoNAT protocol](https://github.com/libp2p/rust-libp2p/pull/2262). -With that rust-libp2p [v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) in February was the first rust-libp2p release with hole punching capabilities. +These features were all included together in rust-libp2p [v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) released in February. +This made `v0.43.0` the first rust-libp2p release with hole punching capabilities. -To improve what we rolled out in the beginning of the year, the libp2p project started the _Hole Punching Measurement Campaign_ aka. _Hole Punching Month_ in collaboration with [ProbeLab](https://research.protocol.ai/groups/probelab/). +Furthermore, to gain insight into how different variables (environments, transports, etc.) affect libp2p hole punching efficacy, the libp2p project started the [_Hole Punching Measurement Campaign_ aka. _Hole Punching Month_](https://discuss.libp2p.io/t/call-for-participation-nat-hole-punching-measurement-campaign/1690) in collaboration with [ProbeLab](https://research.protocol.ai/groups/probelab/). A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com/libp2p/punchr/) are currently punching holes across the globe, providing valuable data that we can later on use to improve the libp2p specification and the two implementations. -Over the year we worked on two new transports, namely [WebRTC](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alphas. +Over the year we worked on two new transports, namely [WebRTC (browser-to-server)](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alpha/experimental features. -WebRTC allows browsers to connect to rust-libp2p based servers without those servers having signed TLS certificates. +Our current implementation of WebRTC enables [browsers to connect to rust-libp2p based servers](https://github.com/libp2p/specs/tree/master/webrtc#browser-to-public-server) without those servers needing to have signed TLS certificates. QUIC is the better TCP+Noise+Yamux in every dimension, e.g. faster connection establishment, better multiplexing, higher hole punching success rates. Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). @@ -84,4 +85,4 @@ In 2022 we published 9 releases of the main `libp2p` crate and a total of 268 re ## What's Next? To conclude this post, it's worth mentioning the rust-libp2p [project roadmap](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md), which [was added in October](https://github.com/libp2p/rust-libp2p/pull/2997) and outlines the planned developments for the project in the future. -Some notable features to look forward to in 2023 include improved WASM support, the WebRTC browser-to-browser feature, and the potential implementation of the new WebTransport transport. +Some notable features to look forward to in 2023 include [improved WASM support](https://github.com/libp2p/rust-libp2p/issues/2617), the [WebRTC browser-to-browser feature](https://github.com/libp2p/specs/pull/497), and the potential implementation of the [new WebTransport transport](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md#webtransport). From 672c8a0668a9e2d2a617a6c04e308ed9c9b06dcb Mon Sep 17 00:00:00 2001 From: Max Inden Date: Thu, 5 Jan 2023 15:33:02 +0100 Subject: [PATCH 07/17] Adopt subheading suggestions Co-authored-by: Prithvi Shahi <50885601+p-shahi@users.noreply.github.com> --- src/_blog/rust-libp2p-2022.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 755795f5..5a063650 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -19,6 +19,7 @@ Note that while I (Max Inden) am writing this blog post, this is the work of man ## Technical Highlights +### Decentralized Hole Punching We started the year with the release of the various components needed for [hole punching](https://blog.ipfs.tech/2022-01-20-libp2p-hole-punching/). We added the [Circuit Relay v2 protocol](https://github.com/libp2p/rust-libp2p/pull/2059), [DCUtR protocol](https://github.com/libp2p/rust-libp2p/pull/2438) and [AutoNAT protocol](https://github.com/libp2p/rust-libp2p/pull/2262). These features were all included together in rust-libp2p [v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) released in February. @@ -27,27 +28,32 @@ This made `v0.43.0` the first rust-libp2p release with hole punching capabilitie Furthermore, to gain insight into how different variables (environments, transports, etc.) affect libp2p hole punching efficacy, the libp2p project started the [_Hole Punching Measurement Campaign_ aka. _Hole Punching Month_](https://discuss.libp2p.io/t/call-for-participation-nat-hole-punching-measurement-campaign/1690) in collaboration with [ProbeLab](https://research.protocol.ai/groups/probelab/). A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com/libp2p/punchr/) are currently punching holes across the globe, providing valuable data that we can later on use to improve the libp2p specification and the two implementations. +## New Transports Over the year we worked on two new transports, namely [WebRTC (browser-to-server)](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alpha/experimental features. Our current implementation of WebRTC enables [browsers to connect to rust-libp2p based servers](https://github.com/libp2p/specs/tree/master/webrtc#browser-to-public-server) without those servers needing to have signed TLS certificates. QUIC is the better TCP+Noise+Yamux in every dimension, e.g. faster connection establishment, better multiplexing, higher hole punching success rates. Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). +### User Experience Improvements Along the way we tackled many smaller improvements, as a whole having a big impact on the user experience. To mention a couple: [naming consistency across crates](https://github.com/libp2p/rust-libp2p/issues/2217), [refactoing of the many `inject_*` into a single `enum` event handler in both `NetworkBehaviour` and `ConnectionHandler`](https://github.com/libp2p/rust-libp2p/issues/2832), [deprecation of event-based `PollParameters`](https://github.com/libp2p/rust-libp2p/pull/3153), and the [rework of our Rust feature flags](https://github.com/libp2p/rust-libp2p/pull/2918). Still remember the old days with the `NetworkBehaviourEventProcess` trait? [All gone](https://github.com/libp2p/rust-libp2p/pull/2784) in favor of the much simpler (generated) `OutEvent` mechanism. The `StreamMuxer` trait received numerous significant simplifications, [basically rewriting](https://github.com/libp2p/rust-libp2p/issues/2722) the trait as well as the trait implementation in yamux, mplex and now QUIC and WebRTC. +### DoS Protection Defense against denial-of-service attacks is a cornerstone of a networking library, especially in the peer-to-peer space. rust-libp2p saw a lot of related improvements in 2022. We enforce various limits (e.g. on the [number of streams](https://github.com/libp2p/rust-libp2p/pull/2697) and bytes of a request) and [prioritize local work over new incoming work from a remote](https://github.com/libp2p/rust-libp2p/pull/2627) across the many layers. Up next is [a patch](https://github.com/libp2p/rust-libp2p/issues/2824) enabling `NetworkBehaviour` implementations to implement their own connection management strategies. +### Metrics and Observability Understanding large systems is hard. Understanding distributed systems is even harder. We made understanding large libp2p networks a bit easier in 2022 introducing a metric crate for rust-libp2p exposing Prometheus metrics, e.g. the [time to establish a connection](https://github.com/libp2p/rust-libp2p/pull/3134) or the [protocols supported by peers](https://github.com/libp2p/rust-libp2p/pull/2734). +### Housekeeping & Quality of Life Changes Since January the rust-libp2p monorepo has a [handy CLI tool for libp2p key management](https://github.com/libp2p/rust-libp2p/pull/2453). In general, we keep up with [recent developments of the Rust language], and incorporate some of its new shiny features. @@ -64,6 +70,7 @@ libp2p is not developed by one or 10 people, but much rather >100 (part-time) pe The core rust-libp2p maintainer team grew from two engineers to four, with [Elena](https://github.com/libp2p/rust-libp2p/pull/2656) and [João](https://github.com/libp2p/rust-libp2p/pull/3295) joining the team. Beyond the core maintainers, a total of 70 people contributed to rust-libp2p's `master` branch in 2022. +### Automation One thing that allows us to be productive despite the large number of people contributing to the project is automation. We invested heavily into rust-libp2p's automation. @@ -72,6 +79,7 @@ We enforce semver compliance via [`cargo-semver-checks`](https://github.com/libp We adopted [conventional commit](https://github.com/libp2p/rust-libp2p/pull/3204) convention. We did a [large refactoring of the CI job structure](https://github.com/libp2p/rust-libp2p/pull/3090), testing crates individually, thus increasing parallelism, improving caching and catching interdependency issues. +### Interoperability rust-libp2p is one implementation of many of the libp2p specification. How do we ensure we are compatible across implementations? In 2022 we started the libp2p interoperability project and as of [September 2022 we continuously test](https://github.com/libp2p/rust-libp2p/pull/2835) that the various versions of go-libp2p and rust-libp2p can connect. In December we added nim-libp2p, in 2023 we will ad js-libp2p. From e2b67df943522ec4a3ed88b68833da1eab279122 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Thu, 5 Jan 2023 15:29:09 +0100 Subject: [PATCH 08/17] Mention of companies --- src/_blog/rust-libp2p-2022.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 5a063650..75189d56 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -15,7 +15,7 @@ author: Max Inden The [rust-libp2p](https://github.com/libp2p/rust-libp2p) project has made significant strides in 2022, with numerous technical advancements and improvements to the project itself. Let's take a closer look at some of the technical highlights and on the meta level developments of the project itself. -Note that while I (Max Inden) am writing this blog post, this is the work of many across various organizations. +This is the work of many across various organizations including [Protocol Labs](https://protocol.ai/), [Parity Technologies](https://www.parity.io/), [Sigma Prime](https://sigmaprime.io/), [Iroh](https://iroh.computer/), [Actyx](https://www.actyx.com/) and [Little Bear Labs](https://littlebearlabs.io/). ## Technical Highlights From 0c05d91c7a7689cad07c66f1393c1eafac41ede8 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Thu, 5 Jan 2023 15:35:21 +0100 Subject: [PATCH 09/17] Rephrase QUIC --- src/_blog/rust-libp2p-2022.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 75189d56..dc063391 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -32,8 +32,8 @@ A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com Over the year we worked on two new transports, namely [WebRTC (browser-to-server)](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alpha/experimental features. Our current implementation of WebRTC enables [browsers to connect to rust-libp2p based servers](https://github.com/libp2p/specs/tree/master/webrtc#browser-to-public-server) without those servers needing to have signed TLS certificates. -QUIC is the better TCP+Noise+Yamux in every dimension, e.g. faster connection establishment, better multiplexing, higher hole punching success rates. -Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). +QUIC is a better libp2p transport than the combination of TCP+Noise+Yamux in almost every dimension as it provides faster connection establishment, better native multiplexing, native encryption, and higher hole punching success rates. +.Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). ### User Experience Improvements Along the way we tackled many smaller improvements, as a whole having a big impact on the user experience. From 0d1d2d0666a6764adf1d01c004ae77da44219708 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Thu, 5 Jan 2023 15:36:31 +0100 Subject: [PATCH 10/17] Mention Thomas and me --- src/_blog/rust-libp2p-2022.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index dc063391..90512c6e 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -68,7 +68,8 @@ What do I mean by that? libp2p's source code is open-source and that source code is written by an open community. libp2p is not developed by one or 10 people, but much rather >100 (part-time) people across many organizations. -The core rust-libp2p maintainer team grew from two engineers to four, with [Elena](https://github.com/libp2p/rust-libp2p/pull/2656) and [João](https://github.com/libp2p/rust-libp2p/pull/3295) joining the team. Beyond the core maintainers, a total of 70 people contributed to rust-libp2p's `master` branch in 2022. +The core rust-libp2p maintainer team grew from two engineers ([myself](https://github.com/mxinden) and [Thomas](https://github.com/thomaseizinger)) to four, with [Elena](https://github.com/libp2p/rust-libp2p/pull/2656) and [João](https://github.com/libp2p/rust-libp2p/pull/3295) joining the team. +Beyond the core maintainers, a total of 70 people contributed to rust-libp2p's `master` branch in 2022. ### Automation One thing that allows us to be productive despite the large number of people contributing to the project is automation. From 465c2d0f121b670cf2075ab071ffd01fb26fb35a Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 6 Jan 2023 15:12:24 +0100 Subject: [PATCH 11/17] Apply suggestions from code review Co-authored-by: Prithvi Shahi <50885601+p-shahi@users.noreply.github.com> Co-authored-by: Elena Frank --- src/_blog/rust-libp2p-2022.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 90512c6e..9a363157 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -28,12 +28,12 @@ This made `v0.43.0` the first rust-libp2p release with hole punching capabilitie Furthermore, to gain insight into how different variables (environments, transports, etc.) affect libp2p hole punching efficacy, the libp2p project started the [_Hole Punching Measurement Campaign_ aka. _Hole Punching Month_](https://discuss.libp2p.io/t/call-for-participation-nat-hole-punching-measurement-campaign/1690) in collaboration with [ProbeLab](https://research.protocol.ai/groups/probelab/). A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com/libp2p/punchr/) are currently punching holes across the globe, providing valuable data that we can later on use to improve the libp2p specification and the two implementations. -## New Transports -Over the year we worked on two new transports, namely [WebRTC (browser-to-server)](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alpha/experimental features. +### New Transports +Over the year we worked on two new transports, namely [WebRTC (browser-to-server)](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alpha/ experimental features. -Our current implementation of WebRTC enables [browsers to connect to rust-libp2p based servers](https://github.com/libp2p/specs/tree/master/webrtc#browser-to-public-server) without those servers needing to have signed TLS certificates. +Our implementation of WebRTC enables [browsers to connect to rust-libp2p based servers](https://github.com/libp2p/specs/tree/master/webrtc#browser-to-public-server) without those servers needing to have signed TLS certificates. QUIC is a better libp2p transport than the combination of TCP+Noise+Yamux in almost every dimension as it provides faster connection establishment, better native multiplexing, native encryption, and higher hole punching success rates. -.Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). +Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). ### User Experience Improvements Along the way we tackled many smaller improvements, as a whole having a big impact on the user experience. @@ -77,13 +77,13 @@ We invested heavily into rust-libp2p's automation. Big quality of life improvement was the [introduction of mergify](https://github.com/libp2p/rust-libp2p/pull/3026). We enforce semver compliance via [`cargo-semver-checks`](https://github.com/libp2p/rust-libp2p/pull/2647). -We adopted [conventional commit](https://github.com/libp2p/rust-libp2p/pull/3204) convention. +We adopted the [conventional commit](https://github.com/libp2p/rust-libp2p/pull/3204) specification. We did a [large refactoring of the CI job structure](https://github.com/libp2p/rust-libp2p/pull/3090), testing crates individually, thus increasing parallelism, improving caching and catching interdependency issues. ### Interoperability rust-libp2p is one implementation of many of the libp2p specification. How do we ensure we are compatible across implementations? -In 2022 we started the libp2p interoperability project and as of [September 2022 we continuously test](https://github.com/libp2p/rust-libp2p/pull/2835) that the various versions of go-libp2p and rust-libp2p can connect. In December we added nim-libp2p, in 2023 we will ad js-libp2p. +In 2022 we started the libp2p interoperability project and, as of [September 2022, we continuously test](https://github.com/libp2p/rust-libp2p/pull/2835) that the various versions of go-libp2p and rust-libp2p can connect. In December we added nim-libp2p, in 2023 we will add js-libp2p. At this point, rust-libp2p is a large complex codebase. In August we added a [coding guideline](https://github.com/libp2p/rust-libp2p/pull/2780) to the project, allowing us to agree on a set of rules to enforce consistency across the project and enable newcomers to hit the ground running. From 1f92e80b589c59f902e5a63edfb7e822b668c681 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 6 Jan 2023 15:14:59 +0100 Subject: [PATCH 12/17] Mention removal of listener streams --- src/_blog/rust-libp2p-2022.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 9a363157..3d2f1f00 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -37,7 +37,7 @@ Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure ### User Experience Improvements Along the way we tackled many smaller improvements, as a whole having a big impact on the user experience. -To mention a couple: [naming consistency across crates](https://github.com/libp2p/rust-libp2p/issues/2217), [refactoing of the many `inject_*` into a single `enum` event handler in both `NetworkBehaviour` and `ConnectionHandler`](https://github.com/libp2p/rust-libp2p/issues/2832), [deprecation of event-based `PollParameters`](https://github.com/libp2p/rust-libp2p/pull/3153), and the [rework of our Rust feature flags](https://github.com/libp2p/rust-libp2p/pull/2918). +To mention a couple: [naming consistency across crates](https://github.com/libp2p/rust-libp2p/issues/2217), [refactoing of the many `inject_*` into a single `enum` event handler in both `NetworkBehaviour` and `ConnectionHandler`](https://github.com/libp2p/rust-libp2p/issues/2832), [deprecation of event-based `PollParameters`](https://github.com/libp2p/rust-libp2p/pull/3153), the [rework of our Rust feature flags](https://github.com/libp2p/rust-libp2p/pull/2918), and [removal of listener streams in favor of polling transports directly](https://github.com/libp2p/rust-libp2p/pull/2652). Still remember the old days with the `NetworkBehaviourEventProcess` trait? [All gone](https://github.com/libp2p/rust-libp2p/pull/2784) in favor of the much simpler (generated) `OutEvent` mechanism. The `StreamMuxer` trait received numerous significant simplifications, [basically rewriting](https://github.com/libp2p/rust-libp2p/issues/2722) the trait as well as the trait implementation in yamux, mplex and now QUIC and WebRTC. From 06f8c7b8e9e605cf07c866d84251d9a9f213267d Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 6 Jan 2023 15:18:39 +0100 Subject: [PATCH 13/17] Remove dead link around Rust language --- src/_blog/rust-libp2p-2022.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 3d2f1f00..2d7fce03 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -56,7 +56,7 @@ We made understanding large libp2p networks a bit easier in 2022 introducing a m ### Housekeeping & Quality of Life Changes Since January the rust-libp2p monorepo has a [handy CLI tool for libp2p key management](https://github.com/libp2p/rust-libp2p/pull/2453). -In general, we keep up with [recent developments of the Rust language], and incorporate some of its new shiny features. +In general, we keep up with recent developments of the Rust language, and incorporate some of its new shiny features. We make use of [Cargo's weak dependencies](https://github.com/libp2p/rust-libp2p/pull/2646). In November we introduced [a patch using const generics](https://github.com/libp2p/rust-libp2p/pull/2712) (in tests). In December we merged our [first pull request using GATs](https://github.com/libp2p/rust-libp2p/pull/3239). From 7bef7cd0b6d8c69f26f0f3ee149a2c3c040d366e Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 6 Jan 2023 15:24:39 +0100 Subject: [PATCH 14/17] Update contributor number and link to GitHub --- src/_blog/rust-libp2p-2022.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 2d7fce03..46f22e0b 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -69,7 +69,7 @@ libp2p's source code is open-source and that source code is written by an open c libp2p is not developed by one or 10 people, but much rather >100 (part-time) people across many organizations. The core rust-libp2p maintainer team grew from two engineers ([myself](https://github.com/mxinden) and [Thomas](https://github.com/thomaseizinger)) to four, with [Elena](https://github.com/libp2p/rust-libp2p/pull/2656) and [João](https://github.com/libp2p/rust-libp2p/pull/3295) joining the team. -Beyond the core maintainers, a total of 70 people contributed to rust-libp2p's `master` branch in 2022. +Beyond the core maintainers, a total of [36 people contributed to rust-libp2p's `master` branch in 2022](https://github.com/libp2p/rust-libp2p/graphs/contributors?from=2022-01-01&to=2022-12-31&type=c). ### Automation One thing that allows us to be productive despite the large number of people contributing to the project is automation. From 80a1e83d2458605636ed44148e7afa6d45d4a577 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Fri, 6 Jan 2023 15:25:40 +0100 Subject: [PATCH 15/17] Move coding guideline to housekeeping --- src/_blog/rust-libp2p-2022.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index 46f22e0b..f8a3bbd2 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -61,6 +61,10 @@ We make use of [Cargo's weak dependencies](https://github.com/libp2p/rust-libp2p In November we introduced [a patch using const generics](https://github.com/libp2p/rust-libp2p/pull/2712) (in tests). In December we merged our [first pull request using GATs](https://github.com/libp2p/rust-libp2p/pull/3239). +At this point, rust-libp2p is a large complex codebase. +In August we added a [coding guideline](https://github.com/libp2p/rust-libp2p/pull/2780) to the project, allowing us to agree on a set of rules to enforce consistency across the project and enable newcomers to hit the ground running. +Projects outside of the libp2p realm might find this guideline useful, as it documents an opinionated way of doing asynchronous networking in Rust. + ## Meta - Improvements to the Project libp2p is an open-community open-source project. @@ -85,10 +89,6 @@ rust-libp2p is one implementation of many of the libp2p specification. How do we ensure we are compatible across implementations? In 2022 we started the libp2p interoperability project and, as of [September 2022, we continuously test](https://github.com/libp2p/rust-libp2p/pull/2835) that the various versions of go-libp2p and rust-libp2p can connect. In December we added nim-libp2p, in 2023 we will add js-libp2p. -At this point, rust-libp2p is a large complex codebase. -In August we added a [coding guideline](https://github.com/libp2p/rust-libp2p/pull/2780) to the project, allowing us to agree on a set of rules to enforce consistency across the project and enable newcomers to hit the ground running. -Projects outside of the libp2p realm might find this guideline useful, as it documents an opinionated way of doing asynchronous networking in Rust. - In 2022 we published 9 releases of the main `libp2p` crate and a total of 268 releases across the workspace including sub-crates and patch releases. ## What's Next? From 6cb3e00836af96719d54b024d4db6be47752c810 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Tue, 10 Jan 2023 22:14:59 +0100 Subject: [PATCH 16/17] Format to one line per paragraph --- src/_blog/rust-libp2p-2022.md | 63 +++++++++-------------------------- 1 file changed, 15 insertions(+), 48 deletions(-) diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index f8a3bbd2..c8a94522 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -13,85 +13,52 @@ author: Max Inden # The rust-libp2p Project: A Recap of 2022 -The [rust-libp2p](https://github.com/libp2p/rust-libp2p) project has made significant strides in 2022, with numerous technical advancements and improvements to the project itself. -Let's take a closer look at some of the technical highlights and on the meta level developments of the project itself. -This is the work of many across various organizations including [Protocol Labs](https://protocol.ai/), [Parity Technologies](https://www.parity.io/), [Sigma Prime](https://sigmaprime.io/), [Iroh](https://iroh.computer/), [Actyx](https://www.actyx.com/) and [Little Bear Labs](https://littlebearlabs.io/). +The [rust-libp2p](https://github.com/libp2p/rust-libp2p) project has made significant strides in 2022, with numerous technical advancements and improvements to the project itself. Let's take a closer look at some of the technical highlights and on the meta level developments of the project itself. This is the work of many across various organizations including [Protocol Labs](https://protocol.ai/), [Parity Technologies](https://www.parity.io/), [Sigma Prime](https://sigmaprime.io/), [Iroh](https://iroh.computer/), [Actyx](https://www.actyx.com/) and [Little Bear Labs](https://littlebearlabs.io/). ## Technical Highlights ### Decentralized Hole Punching -We started the year with the release of the various components needed for [hole punching](https://blog.ipfs.tech/2022-01-20-libp2p-hole-punching/). -We added the [Circuit Relay v2 protocol](https://github.com/libp2p/rust-libp2p/pull/2059), [DCUtR protocol](https://github.com/libp2p/rust-libp2p/pull/2438) and [AutoNAT protocol](https://github.com/libp2p/rust-libp2p/pull/2262). -These features were all included together in rust-libp2p [v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) released in February. -This made `v0.43.0` the first rust-libp2p release with hole punching capabilities. +We started the year with the release of the various components needed for [hole punching](https://blog.ipfs.tech/2022-01-20-libp2p-hole-punching/). We added the [Circuit Relay v2 protocol](https://github.com/libp2p/rust-libp2p/pull/2059), [DCUtR protocol](https://github.com/libp2p/rust-libp2p/pull/2438) and [AutoNAT protocol](https://github.com/libp2p/rust-libp2p/pull/2262). These features were all included together in rust-libp2p [v0.43.0](https://github.com/libp2p/rust-libp2p/releases/tag/v0.43.0) released in February. This made `v0.43.0` the first rust-libp2p release with hole punching capabilities. -Furthermore, to gain insight into how different variables (environments, transports, etc.) affect libp2p hole punching efficacy, the libp2p project started the [_Hole Punching Measurement Campaign_ aka. _Hole Punching Month_](https://discuss.libp2p.io/t/call-for-participation-nat-hole-punching-measurement-campaign/1690) in collaboration with [ProbeLab](https://research.protocol.ai/groups/probelab/). -A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com/libp2p/punchr/) are currently punching holes across the globe, providing valuable data that we can later on use to improve the libp2p specification and the two implementations. +Furthermore, to gain insight into how different variables (environments, transports, etc.) affect libp2p hole punching efficacy, the libp2p project started the [_Hole Punching Measurement Campaign_ aka. _Hole Punching Month_](https://discuss.libp2p.io/t/call-for-participation-nat-hole-punching-measurement-campaign/1690) in collaboration with [ProbeLab](https://research.protocol.ai/groups/probelab/). A multitude of [clients using both go-libp2p and rust-libp2p](https://github.com/libp2p/punchr/) are currently punching holes across the globe, providing valuable data that we can later on use to improve the libp2p specification and the two implementations. ### New Transports Over the year we worked on two new transports, namely [WebRTC (browser-to-server)](https://github.com/libp2p/rust-libp2p/pull/2622) and [QUIC](https://github.com/libp2p/rust-libp2p/issues/2883), which we both released towards the end of the year as alpha/ experimental features. -Our implementation of WebRTC enables [browsers to connect to rust-libp2p based servers](https://github.com/libp2p/specs/tree/master/webrtc#browser-to-public-server) without those servers needing to have signed TLS certificates. -QUIC is a better libp2p transport than the combination of TCP+Noise+Yamux in almost every dimension as it provides faster connection establishment, better native multiplexing, native encryption, and higher hole punching success rates. -Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). +Our implementation of WebRTC enables [browsers to connect to rust-libp2p based servers](https://github.com/libp2p/specs/tree/master/webrtc#browser-to-public-server) without those servers needing to have signed TLS certificates. QUIC is a better libp2p transport than the combination of TCP+Noise+Yamux in almost every dimension as it provides faster connection establishment, better native multiplexing, native encryption, and higher hole punching success rates. Along the way, given that QUIC already requires TLS, [rust-libp2p can now secure TCP connections with TLS as well](https://github.com/libp2p/rust-libp2p/pull/2945) (previously only Noise). ### User Experience Improvements -Along the way we tackled many smaller improvements, as a whole having a big impact on the user experience. -To mention a couple: [naming consistency across crates](https://github.com/libp2p/rust-libp2p/issues/2217), [refactoing of the many `inject_*` into a single `enum` event handler in both `NetworkBehaviour` and `ConnectionHandler`](https://github.com/libp2p/rust-libp2p/issues/2832), [deprecation of event-based `PollParameters`](https://github.com/libp2p/rust-libp2p/pull/3153), the [rework of our Rust feature flags](https://github.com/libp2p/rust-libp2p/pull/2918), and [removal of listener streams in favor of polling transports directly](https://github.com/libp2p/rust-libp2p/pull/2652). -Still remember the old days with the `NetworkBehaviourEventProcess` trait? -[All gone](https://github.com/libp2p/rust-libp2p/pull/2784) in favor of the much simpler (generated) `OutEvent` mechanism. -The `StreamMuxer` trait received numerous significant simplifications, [basically rewriting](https://github.com/libp2p/rust-libp2p/issues/2722) the trait as well as the trait implementation in yamux, mplex and now QUIC and WebRTC. +Along the way we tackled many smaller improvements, as a whole having a big impact on the user experience. To mention a couple: [naming consistency across crates](https://github.com/libp2p/rust-libp2p/issues/2217), [refactoing of the many `inject_*` into a single `enum` event handler in both `NetworkBehaviour` and `ConnectionHandler`](https://github.com/libp2p/rust-libp2p/issues/2832), [deprecation of event-based `PollParameters`](https://github.com/libp2p/rust-libp2p/pull/3153), the [rework of our Rust feature flags](https://github.com/libp2p/rust-libp2p/pull/2918), and [removal of listener streams in favor of polling transports directly](https://github.com/libp2p/rust-libp2p/pull/2652). Still remember the old days with the `NetworkBehaviourEventProcess` trait? [All gone](https://github.com/libp2p/rust-libp2p/pull/2784) in favor of the much simpler (generated) `OutEvent` mechanism. The `StreamMuxer` trait received numerous significant simplifications, [basically rewriting](https://github.com/libp2p/rust-libp2p/issues/2722) the trait as well as the trait implementation in yamux, mplex and now QUIC and WebRTC. ### DoS Protection -Defense against denial-of-service attacks is a cornerstone of a networking library, especially in the peer-to-peer space. -rust-libp2p saw a lot of related improvements in 2022. -We enforce various limits (e.g. on the [number of streams](https://github.com/libp2p/rust-libp2p/pull/2697) and bytes of a request) and [prioritize local work over new incoming work from a remote](https://github.com/libp2p/rust-libp2p/pull/2627) across the many layers. -Up next is [a patch](https://github.com/libp2p/rust-libp2p/issues/2824) enabling `NetworkBehaviour` implementations to implement their own connection management strategies. +Defense against denial-of-service attacks is a cornerstone of a networking library, especially in the peer-to-peer space. rust-libp2p saw a lot of related improvements in 2022. We enforce various limits (e.g. on the [number of streams](https://github.com/libp2p/rust-libp2p/pull/2697) and bytes of a request) and [prioritize local work over new incoming work from a remote](https://github.com/libp2p/rust-libp2p/pull/2627) across the many layers. Up next is [a patch](https://github.com/libp2p/rust-libp2p/issues/2824) enabling `NetworkBehaviour` implementations to implement their own connection management strategies. ### Metrics and Observability -Understanding large systems is hard. -Understanding distributed systems is even harder. -We made understanding large libp2p networks a bit easier in 2022 introducing a metric crate for rust-libp2p exposing Prometheus metrics, e.g. the [time to establish a connection](https://github.com/libp2p/rust-libp2p/pull/3134) or the [protocols supported by peers](https://github.com/libp2p/rust-libp2p/pull/2734). +Understanding large systems is hard. Understanding distributed systems is even harder. We made understanding large libp2p networks a bit easier in 2022 introducing a metric crate for rust-libp2p exposing Prometheus metrics, e.g. the [time to establish a connection](https://github.com/libp2p/rust-libp2p/pull/3134) or the [protocols supported by peers](https://github.com/libp2p/rust-libp2p/pull/2734). ### Housekeeping & Quality of Life Changes Since January the rust-libp2p monorepo has a [handy CLI tool for libp2p key management](https://github.com/libp2p/rust-libp2p/pull/2453). -In general, we keep up with recent developments of the Rust language, and incorporate some of its new shiny features. -We make use of [Cargo's weak dependencies](https://github.com/libp2p/rust-libp2p/pull/2646). -In November we introduced [a patch using const generics](https://github.com/libp2p/rust-libp2p/pull/2712) (in tests). -In December we merged our [first pull request using GATs](https://github.com/libp2p/rust-libp2p/pull/3239). +In general, we keep up with recent developments of the Rust language, and incorporate some of its new shiny features. We make use of [Cargo's weak dependencies](https://github.com/libp2p/rust-libp2p/pull/2646). In November we introduced [a patch using const generics](https://github.com/libp2p/rust-libp2p/pull/2712) (in tests). In December we merged our [first pull request using GATs](https://github.com/libp2p/rust-libp2p/pull/3239). -At this point, rust-libp2p is a large complex codebase. -In August we added a [coding guideline](https://github.com/libp2p/rust-libp2p/pull/2780) to the project, allowing us to agree on a set of rules to enforce consistency across the project and enable newcomers to hit the ground running. -Projects outside of the libp2p realm might find this guideline useful, as it documents an opinionated way of doing asynchronous networking in Rust. +At this point, rust-libp2p is a large complex codebase. In August we added a [coding guideline](https://github.com/libp2p/rust-libp2p/pull/2780) to the project, allowing us to agree on a set of rules to enforce consistency across the project and enable newcomers to hit the ground running. Projects outside of the libp2p realm might find this guideline useful, as it documents an opinionated way of doing asynchronous networking in Rust. ## Meta - Improvements to the Project -libp2p is an open-community open-source project. -What do I mean by that? -libp2p's source code is open-source and that source code is written by an open community. -libp2p is not developed by one or 10 people, but much rather >100 (part-time) people across many organizations. +libp2p is an open-community open-source project. What do I mean by that? libp2p's source code is open-source and that source code is written by an open community. libp2p is not developed by one or 10 people, but much rather >100 (part-time) people across many organizations. -The core rust-libp2p maintainer team grew from two engineers ([myself](https://github.com/mxinden) and [Thomas](https://github.com/thomaseizinger)) to four, with [Elena](https://github.com/libp2p/rust-libp2p/pull/2656) and [João](https://github.com/libp2p/rust-libp2p/pull/3295) joining the team. -Beyond the core maintainers, a total of [36 people contributed to rust-libp2p's `master` branch in 2022](https://github.com/libp2p/rust-libp2p/graphs/contributors?from=2022-01-01&to=2022-12-31&type=c). +The core rust-libp2p maintainer team grew from two engineers ([myself](https://github.com/mxinden) and [Thomas](https://github.com/thomaseizinger)) to four, with [Elena](https://github.com/libp2p/rust-libp2p/pull/2656) and [João](https://github.com/libp2p/rust-libp2p/pull/3295) joining the team. Beyond the core maintainers, a total of [36 people contributed to rust-libp2p's `master` branch in 2022](https://github.com/libp2p/rust-libp2p/graphs/contributors?from=2022-01-01&to=2022-12-31&type=c). ### Automation -One thing that allows us to be productive despite the large number of people contributing to the project is automation. -We invested heavily into rust-libp2p's automation. +One thing that allows us to be productive despite the large number of people contributing to the project is automation. We invested heavily into rust-libp2p's automation. -Big quality of life improvement was the [introduction of mergify](https://github.com/libp2p/rust-libp2p/pull/3026). -We enforce semver compliance via [`cargo-semver-checks`](https://github.com/libp2p/rust-libp2p/pull/2647). -We adopted the [conventional commit](https://github.com/libp2p/rust-libp2p/pull/3204) specification. -We did a [large refactoring of the CI job structure](https://github.com/libp2p/rust-libp2p/pull/3090), testing crates individually, thus increasing parallelism, improving caching and catching interdependency issues. +Big quality of life improvement was the [introduction of mergify](https://github.com/libp2p/rust-libp2p/pull/3026). We enforce semver compliance via [`cargo-semver-checks`](https://github.com/libp2p/rust-libp2p/pull/2647). We adopted the [conventional commit](https://github.com/libp2p/rust-libp2p/pull/3204) specification. We did a [large refactoring of the CI job structure](https://github.com/libp2p/rust-libp2p/pull/3090), testing crates individually, thus increasing parallelism, improving caching and catching interdependency issues. ### Interoperability -rust-libp2p is one implementation of many of the libp2p specification. -How do we ensure we are compatible across implementations? -In 2022 we started the libp2p interoperability project and, as of [September 2022, we continuously test](https://github.com/libp2p/rust-libp2p/pull/2835) that the various versions of go-libp2p and rust-libp2p can connect. In December we added nim-libp2p, in 2023 we will add js-libp2p. +rust-libp2p is one implementation of many of the libp2p specification. How do we ensure we are compatible across implementations? In 2022 we started the libp2p interoperability project and, as of [September 2022, we continuously test](https://github.com/libp2p/rust-libp2p/pull/2835) that the various versions of go-libp2p and rust-libp2p can connect. In December we added nim-libp2p, in 2023 we will add js-libp2p. In 2022 we published 9 releases of the main `libp2p` crate and a total of 268 releases across the workspace including sub-crates and patch releases. ## What's Next? -To conclude this post, it's worth mentioning the rust-libp2p [project roadmap](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md), which [was added in October](https://github.com/libp2p/rust-libp2p/pull/2997) and outlines the planned developments for the project in the future. -Some notable features to look forward to in 2023 include [improved WASM support](https://github.com/libp2p/rust-libp2p/issues/2617), the [WebRTC browser-to-browser feature](https://github.com/libp2p/specs/pull/497), and the potential implementation of the [new WebTransport transport](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md#webtransport). +To conclude this post, it's worth mentioning the rust-libp2p [project roadmap](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md), which [was added in October](https://github.com/libp2p/rust-libp2p/pull/2997) and outlines the planned developments for the project in the future. Some notable features to look forward to in 2023 include [improved WASM support](https://github.com/libp2p/rust-libp2p/issues/2617), the [WebRTC browser-to-browser feature](https://github.com/libp2p/specs/pull/497), and the potential implementation of the [new WebTransport transport](https://github.com/libp2p/rust-libp2p/blob/master/ROADMAP.md#webtransport). From f8cc9c1cd12335c9fb237a0f9b51fbdb0263a740 Mon Sep 17 00:00:00 2001 From: Prithvi Shahi Date: Thu, 12 Jan 2023 09:45:27 -0800 Subject: [PATCH 17/17] add blog header and update date --- src/_blog/rust-libp2p-2022.md | 6 +++--- src/assets/rust-libp2p-2022-header.png | Bin 0 -> 143848 bytes 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 src/assets/rust-libp2p-2022-header.png diff --git a/src/_blog/rust-libp2p-2022.md b/src/_blog/rust-libp2p-2022.md index c8a94522..dbc610b2 100644 --- a/src/_blog/rust-libp2p-2022.md +++ b/src/_blog/rust-libp2p-2022.md @@ -4,10 +4,10 @@ tags: - rust title: rust-libp2p in 2022 description: Recapitulating the year 2022 for the rust-libp2p project -date: 2022-12-30 -permalink: "/2022-12-30-rust-libp2p-in-2022" +date: 2023-01-12 +permalink: "/2023-01-12-rust-libp2p-in-2022" translationKey: '' -header_image: +header_image: /rust-libp2p-2022-header.png author: Max Inden --- diff --git a/src/assets/rust-libp2p-2022-header.png b/src/assets/rust-libp2p-2022-header.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3a5131a66d234c8f259c74f2588addf94494f9 GIT binary patch literal 143848 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 literal 0 HcmV?d00001