<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>libp2p - A modular network stack</title>
      <link>https://libp2p.io/preview/pr-30/</link>
      <description>Run your network applications free from runtime and address services, independently of their location.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://libp2p.io/preview/pr-30/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Mon, 02 Feb 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>libp2p Annual Report 2025</title>
          <pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2025-report/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2025-report/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2025-report/">&lt;h4 id=&quot;get-involved-with-libp2p&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#get-involved-with-libp2p&quot; aria-label=&quot;Anchor link for: get-involved-with-libp2p&quot;&gt;&lt;strong&gt;Get involved with libp2p&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;Read the full &lt;a href=&quot;&#x2F;reports&#x2F;annual-reports&#x2F;2025&#x2F;&quot;&gt;libp2p 2025 Report&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Join a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;luma.com&#x2F;libp2p?tag=community&quot;&gt;libp2p community call&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Join our &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;discord.gg&#x2F;MRRgEFMAVN&quot;&gt;Discord&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Explore the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&quot;&gt;libp2p Github&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Build a prototype using libp2p technical support and early collaboration - &lt;a href=&quot;mailto:johanna@libp2p.io&quot;&gt;johanna@libp2p.io&lt;&#x2F;a&gt; - &lt;a href=&quot;mailto:manu@libp2p.io&quot;&gt;manu@libp2p.io&lt;&#x2F;a&gt; - &lt;a href=&quot;mailto:dave.grantham@libp2p.io&quot;&gt;dave.grantham@libp2p.io&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Partner with libp2p for funders and ecosystem partners - &lt;a href=&quot;mailto:partner@libp2p.io&quot;&gt;partner@libp2p.io&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-forefront-of-decentralized-networking-and-ai&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-forefront-of-decentralized-networking-and-ai&quot; aria-label=&quot;Anchor link for: the-forefront-of-decentralized-networking-and-ai&quot;&gt;The Forefront of Decentralized Networking and AI&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In 2025, libp2p became the communication layer behind over $100B in decentralized value flow. What began nearly a decade ago as a modular, secure peer-to-peer networking framework is now one of the most widely deployed foundations for decentralized systems, powering more than 30 blockchain networks, emerging compute fabrics, and next-generation Web3 applications.&lt;&#x2F;p&gt;
&lt;p&gt;Today, libp2p’s influence extends far beyond blockchains. With 10+ active implementations, 300+ monthly contributors, and rapidly expanding research into browser-native connectivity, decentralized AI, and post-quantum-secure networking, libp2p is evolving into a core substrate for a new era of distributed systems spanning Web3, AI infrastructure, edge computing, and embedded systems.&lt;&#x2F;p&gt;
&lt;p&gt;The past year delivered measurable gains in performance, interoperability, and adoption. QUIC and WebTransport matured significantly, reducing latency and improving battery efficiency across mobile and light clients. GossipSub upgrades made cross-client gossip more predictable under load, strengthening Ethereum L1, L2 rollups, shared sequencers, and data availability networks. Browser connectivity advanced through AutoTLS and improved relaying, enabling frontends to communicate directly with sequencing networks and peer-to-peer services without relying on centralized RPC infrastructure.&lt;&#x2F;p&gt;
&lt;p&gt;At the same time, libp2p’s role in decentralized AI and agentic systems became increasingly concrete. As autonomous agents, embedded compute, and on-device intelligence continue to expand, so does the need for trust-minimized, low-latency peer-to-peer messaging. This year’s work positions libp2p as a natural communication layer for agent-to-agent coordination, decentralized inference, and privacy-preserving AI workflows, while ongoing post-quantum and multiformat efforts future-proof the stack for decades to come.&lt;&#x2F;p&gt;
&lt;p&gt;This momentum is already visible in practice. In 2025, the Python implementation of libp2p matured enough to support reference implementations for federated learning and decentralized AI systems. These examples demonstrate peer-to-peer model coordination, gradient and parameter exchange, and privacy-aware training workflows without centralized servers. By lowering the barrier for researchers and AI engineers, Python-libp2p is emerging as a practical bridge between modern ML stacks and decentralized networking.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2026-roadmap&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2026-roadmap&quot; aria-label=&quot;Anchor link for: 2026-roadmap&quot;&gt;&lt;strong&gt;2026 Roadmap&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The year ahead focuses on usability, connectivity, privacy, and maturity, informed by deeper engagement with AI researchers and sustained investment in roadmap-shaping exercises.&lt;&#x2F;p&gt;
&lt;p&gt;Key priorities include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Research Focus: GossipSub&lt;&#x2F;strong&gt; to continue the ongoing research and development to scale decentralized state synchronization&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Research Focus: Browser-native Connectivity&lt;&#x2F;strong&gt; through broader AutoTLS rollout and improved relaying&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Research Focus: Decentralized AI Applications&lt;&#x2F;strong&gt; with destributed MCP and IPFS integration for federated learning&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Research Focus: Mobile-native Advances&lt;&#x2F;strong&gt; with Kotlin and Swift implementations moving toward production readiness&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Advanced Network Simulation and Testing&lt;&#x2F;strong&gt; enabling empirical testing of research implementations at scale&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Easy Mode&lt;&#x2F;strong&gt; enabling minimal-configuration peer-to-peer applications in just a few lines of code&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Unified Developer Center&lt;&#x2F;strong&gt; consolidating documentation, tutorials, and language-specific references&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Universal Connectivity&lt;&#x2F;strong&gt; supported by an updated specification and a continuous cross-language test suite targeting 95% interoperability&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;achievements-2025&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#achievements-2025&quot; aria-label=&quot;Anchor link for: achievements-2025&quot;&gt;&lt;strong&gt;Achievements 2025&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ethereum’s Portal Network&lt;&#x2F;strong&gt; adopted libp2p for ultra-light RPC and decentralized state retrieval, enabling phone-native and home-run Ethereum clients.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sequencer networks&lt;&#x2F;strong&gt; such as Espresso and Astria expanded their use of GossipSub as a coordination layer, with OP Stack teams beginning to integrate compatible meshes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;QUIC and WebTransport improvements&lt;&#x2F;strong&gt; significantly boosted mobile performance and reduced connection overhead, paving the way for emerging “wallet-as-a-node” architectures.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Data availability networks&lt;&#x2F;strong&gt; Celestia, Avail, and EigenDA benefited from upgrades that improved sampling throughput and blob propagation reliability.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Browser connectivity&lt;&#x2F;strong&gt; advanced through AutoTLS and web-to-web relaying, allowing browser-based dApps to participate directly in libp2p networks. The AutoTLS specification itself reflects growing cross-project collaboration, with contributions from nim-libp2p and Waku research teams.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;across-language-ecosystems-implementations-matured-in-parallel&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#across-language-ecosystems-implementations-matured-in-parallel&quot; aria-label=&quot;Anchor link for: across-language-ecosystems-implementations-matured-in-parallel&quot;&gt;Across language ecosystems, implementations matured in parallel&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;go-libp2p and js-libp2p&lt;&#x2F;strong&gt; deepened browser and WebTransport support.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;cpp-libp2p&lt;&#x2F;strong&gt; was revived to support Lean Consensus research&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;c-libp2p and eth-p2p-z (zig-libp2p)&lt;&#x2F;strong&gt; expanded into embedded and constrained environments&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;dotnet-libp2p&lt;&#x2F;strong&gt; reached its first production integrations with Shutter and Optimism&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;py-libp2p&lt;&#x2F;strong&gt; progressed rapidly toward a 1.0 release, unlocking strong integrations with AI and ML workflows. The ecosystem introduced &lt;strong&gt;production-quality examples for federated learning and decentralized AI&lt;&#x2F;strong&gt;, showcasing peer-to-peer training coordination, model synchronization, and research-friendly experimentation using libp2p as the underlying transport.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ecosystem-research-and-education&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ecosystem-research-and-education&quot; aria-label=&quot;Anchor link for: ecosystem-research-and-education&quot;&gt;&lt;strong&gt;Ecosystem, Research, and Education&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;ProbeLab expanded cross-network monitoring across Ethereum, Gnosis, Base, Celestia, Filecoin, Avail, Polkadot, and IPFS, accelerating interoperability testing and improving visibility into network health. Developer education continued to scale through libp2p Days at EthCC and DevConnect, alongside the Universal Connectivity workshop adapted across Rust, Python, and JavaScript.&lt;&#x2F;p&gt;
&lt;p&gt;Academic adoption also grew in 2025. Universities across South Asia began incorporating libp2p into curricula spanning engineering, management, and design. Institutions such as Netaji Subhas University of Technology (NSUT) integrated libp2p into coursework on distributed systems, decentralized applications, and platform design, exposing students to real-world peer-to-peer primitives and open-source collaboration.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;industry-volunteer-contributions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#industry-volunteer-contributions&quot; aria-label=&quot;Anchor link for: industry-volunteer-contributions&quot;&gt;&lt;strong&gt;Industry &amp;amp; Volunteer Contributions&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;A defining strength of libp2p in 2025 was the depth of industry participation. Engineers from Huddle01, NVIDIA, DDN (Data Direct Networks), Hypertensor, and Linux Foundation Edge contributed code, specifications, performance testing, and real-world operational feedback.&lt;&#x2F;p&gt;
&lt;p&gt;These contributions improved transport efficiency, observability, browser and media-path networking, AI-adjacent workflows, and large-scale deployment resilience. Participation from engineers working in video infrastructure, high-performance computing, enterprise systems, and edge platforms reinforced libp2p’s role as a neutral, production-grade networking layer serving both Web3-native and traditional infrastructure organizations.&lt;&#x2F;p&gt;
&lt;p&gt;Beyond libp2p itself, critical improvements to quic-go and webtransport-go, used by thousands of projects outside Web3 received critical performance, security, and standards-alignment improvements, benefiting the wider internet as much as decentralized systems.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;div class=&quot;blog-logo-grid&quot;&gt;
    &lt;div class=&quot;blog-logo-grid__card&quot;&gt;
        &lt;img src=&quot;..&#x2F;..&#x2F;img&#x2F;logos&#x2F;powered-by-libp2p-logo.svg&quot; alt=&quot;libp2p&quot;&gt;
    &lt;&#x2F;div&gt;
    &lt;div class=&quot;blog-logo-grid__card&quot;&gt;
        &lt;img src=&quot;..&#x2F;..&#x2F;img&#x2F;logos&#x2F;filecoin-logo.svg&quot; alt=&quot;Filecoin&quot;&gt;
    &lt;&#x2F;div&gt;
    &lt;div class=&quot;blog-logo-grid__card&quot;&gt;
        &lt;img src=&quot;..&#x2F;..&#x2F;img&#x2F;logos&#x2F;ethereum-logo.svg&quot; alt=&quot;Ethereum&quot;&gt;
    &lt;&#x2F;div&gt;
    &lt;div class=&quot;blog-logo-grid__card&quot;&gt;
        &lt;img src=&quot;..&#x2F;..&#x2F;img&#x2F;logos&#x2F;ipfs-logo.svg&quot; alt=&quot;IPFS&quot;&gt;
    &lt;&#x2F;div&gt;
    &lt;div class=&quot;blog-logo-grid__card&quot;&gt;
        &lt;img src=&quot;..&#x2F;..&#x2F;img&#x2F;logos&#x2F;celestia-logo.svg&quot; alt=&quot;Celestia&quot;&gt;
    &lt;&#x2F;div&gt;
    &lt;div class=&quot;blog-logo-grid__card&quot;&gt;
        &lt;img src=&quot;..&#x2F;..&#x2F;img&#x2F;logos&#x2F;optimism-logo.svg&quot; alt=&quot;Optimism&quot;&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;funding-partnerships&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#funding-partnerships&quot; aria-label=&quot;Anchor link for: funding-partnerships&quot;&gt;&lt;strong&gt;Funding &amp;amp; Partnerships&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;strong&gt;libp2p Core Fund&lt;&#x2F;strong&gt;, established in 2024, continued investing in the project’s long-term health. Support from the Ethereum Foundation, Protocol Labs, Filecoin Foundation, Celestia, and Optimism enabled sustained maintenance, research, interoperability work, and ecosystem growth.&lt;&#x2F;p&gt;
&lt;p&gt;Notable contributions include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ethereum Foundation&lt;&#x2F;strong&gt;: Advancing Eth2 networking, GossipSub tuning, instrumentation, developer documentation, and collaborative ZK and privacy tooling with PLDG.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Filecoin Foundation&lt;&#x2F;strong&gt;: Stress-testing libp2p at massive scale and feeding research-driven improvements back into every implementation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Celestia&lt;&#x2F;strong&gt;: Supporting performance tuning, data-availability retrieval testing, and networking standards for modular blockchain architectures.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Protocol Labs&lt;&#x2F;strong&gt;: Funding cross-implementation maintenance, multiformats and IPLD standards, and ProbeLab’s research.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Optimism&lt;&#x2F;strong&gt;: Pioneering cross-rollup networking and sequencing infrastructure.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Together with industry volunteers and academic partners, these organizations reflect a shared vision: &lt;strong&gt;a secure, neutral, high-performance networking layer for the decentralized internet—and for the AI systems increasingly built on top of it&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;&lt;strong&gt;Conclusion&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Libp2p’s growth in 2025 was not only technical but structural. Multiple implementations matured in parallel, browser and mobile support strengthened, and decentralized AI systems increasingly relied on peer to peer networking as a foundational primitive.&lt;&#x2F;p&gt;
&lt;p&gt;With Python based reference implementations for federated learning and decentralized AI, growing industry participation, and expanding academic adoption, libp2p is no longer just infrastructure. It is an enabling layer for the next generation of distributed intelligence.&lt;&#x2F;p&gt;
&lt;p&gt;As libp2p enters 2026, it stands at the center of a global shift toward open, resilient, and autonomous compute. The work delivered this year, from AutoTLS and QUIC improvements to decentralized AI examples and university curricula, lays the groundwork for a decade in which distributed systems do not just scale, but become more connected and resilient.&lt;&#x2F;p&gt;
&lt;p&gt;The future of networking is decentralized.&lt;&#x2F;p&gt;
&lt;p&gt;Libp2p is building it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;feedback&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#feedback&quot; aria-label=&quot;Anchor link for: feedback&quot;&gt;&lt;strong&gt;Feedback&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We welcome your feedback.&lt;&#x2F;p&gt;
&lt;p&gt;libp2p is shaped by the builders, researchers, and operators who rely on it. If you have insights on this report, areas we should explore further, or perspectives that can help strengthen the project, please share them with us in the discussion thread:
https:&#x2F;&#x2F;discuss.libp2p.io&#x2F;t&#x2F;libp2p-annual-report-2025&#x2F;3693&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing the release of nim-libp2p v1.15.2</title>
          <pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/releases/2026-02-02-nim-libp2p/</link>
          <guid>https://libp2p.io/preview/pr-30/releases/2026-02-02-nim-libp2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/releases/2026-02-02-nim-libp2p/">&lt;p&gt;&lt;code&gt;nim-libp2p v1.15.2&lt;&#x2F;code&gt; has just shipped.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hotfix&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hotfix&quot; aria-label=&quot;Anchor link for: hotfix&quot;&gt;Hotfix&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;fix(gossipsub): race condition issue causing nil pointer exception when sendConn is not set by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;chaitanyaprem&quot;&gt;@chaitanyaprem&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vacp2p&#x2F;nim-libp2p&#x2F;pull&#x2F;2049&quot;&gt;#2049&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#contributors&quot; aria-label=&quot;Anchor link for: contributors&quot;&gt;Contributors&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;chaitanyaprem&quot;&gt;@chaitanyaprem&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Full Changelog:&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vacp2p&#x2F;nim-libp2p&#x2F;compare&#x2F;v1.15.1...v1.15.2&quot;&gt;v1.15.1...v1.15.2&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Refactoring the libp2p Test Framework: A Fresh Start</title>
          <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/new-test-plans/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/new-test-plans/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/new-test-plans/">&lt;p&gt;The libp2p ecosystem spans multiple programming languages, transports, and protocols. Testing interoperability across this diverse landscape has always been challenging. Today, we&#x27;re announcing a complete rewrite of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;test-plans&quot;&gt;test-plans repository&lt;&#x2F;a&gt; that fundamentally improves how we test libp2p implementations.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-a-complete-rewrite&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-a-complete-rewrite&quot; aria-label=&quot;Anchor link for: why-a-complete-rewrite&quot;&gt;Why a Complete Rewrite?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The original test framework was built with TypeScript, Docker Compose, and various npm dependencies. While functional, it presented several challenges:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complex dependency chains&lt;&#x2F;strong&gt;: Node.js, npm, and Python dependencies created friction for contributors and a perpetual dependency maintenance headache&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Platform inconsistencies&lt;&#x2F;strong&gt;: Tests behaved differently across Linux, macOS, and Windows&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Limited reproducibility&lt;&#x2F;strong&gt;: Recreating test failures was difficult without considerable effort&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rigid test selection&lt;&#x2F;strong&gt;: Running specific subsets of tests required manual configuration&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Slow iteration cycles&lt;&#x2F;strong&gt;: The build and test pipeline was optimized for CI, not local development&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;More importantly, 2026 marks a pivotal year for libp2p research efforts focused on scaling and optimization. As we push the boundaries of what&#x27;s possible with peer-to-peer networking, we need a test framework that can keep pace. Researchers investigating new transport protocols, scaling strategies, and exploring AI-driven dynamic protocols require fast feedback loops, reproducible experiments, and the ability to quickly iterate on implementations across multiple languages. The old framework simply couldn&#x27;t support the velocity and rigor that this research demands.&lt;&#x2F;p&gt;
&lt;p&gt;We set out to address these issues with a clear set of goals.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-10-primary-goals&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-10-primary-goals&quot; aria-label=&quot;Anchor link for: the-10-primary-goals&quot;&gt;The 10 Primary Goals&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-cross-platform-support&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-cross-platform-support&quot; aria-label=&quot;Anchor link for: 1-cross-platform-support&quot;&gt;1. Cross-Platform Support&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The new framework runs natively on Linux, macOS, and Windows (via WSL). We&#x27;ve eliminated platform-specific code paths and ensured consistent behavior across all environments. A developer on macOS can reproduce the exact test that failed in CI on Linux.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-minimal-dependencies&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-minimal-dependencies&quot; aria-label=&quot;Anchor link for: 2-minimal-dependencies&quot;&gt;2. Minimal Dependencies&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We reduced dependencies to the essentials:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bash 4.0+&lt;&#x2F;strong&gt; (for associative arrays and modern shell features)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Docker 20.10+&lt;&#x2F;strong&gt; with Docker Compose v2&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;yq 4.0+&lt;&#x2F;strong&gt; (for YAML processing)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Git 2.0+&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;No Node.js. No npm. No Python. No pip. Just standard tools available on any development machine.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-reproducible-testing-in-ci-cd-and-local-environments&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-reproducible-testing-in-ci-cd-and-local-environments&quot; aria-label=&quot;Anchor link for: 3-reproducible-testing-in-ci-cd-and-local-environments&quot;&gt;3. Reproducible Testing in CI&#x2F;CD and Local Environments&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The framework is optimized for both CI pipelines and local development. You can run the same commands locally that CI runs, with identical results. Quick feedback loops enable faster iteration. The snapshot capability supports capturing the entire test setup—including inputs, docker images, and environment variables—into a downloadable artifact that can be unpacked locally and re-run with a single command, fully reproducing the exact same test pass that was executed on the CI&#x2F;CD infrastructure. This local reproducibility greatly increases the velocity of developers debugging tests and fixing compatibility issues. It also helps with optimization work by recreating the same conditions locally that led to the measured results in the CI&#x2F;CD environment.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-follow-ci-cd-and-programming-conventions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#4-follow-ci-cd-and-programming-conventions&quot; aria-label=&quot;Anchor link for: 4-follow-ci-cd-and-programming-conventions&quot;&gt;4. Follow CI&#x2F;CD and Programming Conventions&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We adhere to standard patterns: clear exit codes, structured logging to stderr, machine-readable output to stdout, and conventional command-line arguments. The barrier to entry is low for anyone familiar with shell scripting.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;5-code-reusability-via-shared-library&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#5-code-reusability-via-shared-library&quot; aria-label=&quot;Anchor link for: 5-code-reusability-via-shared-library&quot;&gt;5. Code Reusability via Shared Library&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;code&gt;lib&#x2F;&lt;&#x2F;code&gt; directory contains 19 reusable shell scripts (~4,000+ lines) that provide common functionality:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Filter engine&lt;&#x2F;strong&gt; with alias expansion and negation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Image building&lt;&#x2F;strong&gt; for GitHub, local, and browser sources&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Caching&lt;&#x2F;strong&gt; with content-addressed keys&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Test execution&lt;&#x2F;strong&gt; coordination with Redis&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Output formatting&lt;&#x2F;strong&gt; for consistent terminal UI&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Each test suite (perf, transport, hole-punch) imports these libraries, ensuring consistency and reducing duplication.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;6-aggressive-caching&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#6-aggressive-caching&quot; aria-label=&quot;Anchor link for: 6-aggressive-caching&quot;&gt;6. Aggressive Caching&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Three levels of caching dramatically improve performance:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cache Type&lt;&#x2F;th&gt;&lt;th&gt;Miss&lt;&#x2F;th&gt;&lt;th&gt;Hit&lt;&#x2F;th&gt;&lt;th&gt;Speedup&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Test matrix&lt;&#x2F;td&gt;&lt;td&gt;2-5s&lt;&#x2F;td&gt;&lt;td&gt;50-200ms&lt;&#x2F;td&gt;&lt;td&gt;10-100x&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GitHub snapshots&lt;&#x2F;td&gt;&lt;td&gt;5-30s&lt;&#x2F;td&gt;&lt;td&gt;1-2s&lt;&#x2F;td&gt;&lt;td&gt;5-15x&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Docker images&lt;&#x2F;td&gt;&lt;td&gt;30-300s&lt;&#x2F;td&gt;&lt;td&gt;0.1s&lt;&#x2F;td&gt;&lt;td&gt;300-3000x&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;The test matrix cache uses a content-addressed key computed from &lt;code&gt;images.yaml&lt;&#x2F;code&gt; and all filter parameters. Change a filter, get a new key. Same filters, same cached matrix.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;7-fine-grained-filtering&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#7-fine-grained-filtering&quot; aria-label=&quot;Anchor link for: 7-fine-grained-filtering&quot;&gt;7. Fine-Grained Filtering&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The two-stage filtering model provides precise control:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Stage 1 (SELECT)&lt;&#x2F;strong&gt;: Narrow from the complete list&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-select&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;~rust|~go&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;  # Only rust and go implementations&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Stage 2 (IGNORE)&lt;&#x2F;strong&gt;: Remove from selected set&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-ignore&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;experimental&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;  # Exclude experimental versions&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Filter dimensions include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--impl-select&#x2F;ignore&lt;&#x2F;code&gt;: Filter implementations&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;--transport-select&#x2F;ignore&lt;&#x2F;code&gt;: Filter transports (tcp, quic-v1, ws, etc.)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;--secure-select&#x2F;ignore&lt;&#x2F;code&gt;: Filter secure channels (noise, tls)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;--muxer-select&#x2F;ignore&lt;&#x2F;code&gt;: Filter muxers (yamux, mplex)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;--test-select&#x2F;ignore&lt;&#x2F;code&gt;: Filter by test name pattern&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Aliases make common patterns easy:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-select&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;~rust&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;  # Expands to rust-v0.56|rust-v0.55|rust-v0.54|...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-ignore&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;!~rust&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;  # Everything NOT matching rust (negation)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;8-yaml-configuration-with-comments&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#8-yaml-configuration-with-comments&quot; aria-label=&quot;Anchor link for: 8-yaml-configuration-with-comments&quot;&gt;8. YAML Configuration with Comments&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;All configuration uses YAML files with extensive comments:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;images.yaml&lt;&#x2F;strong&gt;: Implementation definitions with versions, transports, and sources&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;inputs.yaml&lt;&#x2F;strong&gt;: Auto-generated capture of all test parameters&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;test-matrix.yaml&lt;&#x2F;strong&gt;: Generated test combinations with metadata&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Human-readable configuration lowers the barrier to understanding and modification.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;9-local-and-remote-test-applications-with-patching&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#9-local-and-remote-test-applications-with-patching&quot; aria-label=&quot;Anchor link for: 9-local-and-remote-test-applications-with-patching&quot;&gt;9. Local and Remote Test Applications with Patching&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Testing local changes doesn&#x27;t require forking repositories. The patching strategy lets you:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Clone an implementation locally&lt;&#x2F;li&gt;
&lt;li&gt;Make your changes&lt;&#x2F;li&gt;
&lt;li&gt;Generate a patch file&lt;&#x2F;li&gt;
&lt;li&gt;Reference it in &lt;code&gt;images.yaml&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The framework downloads the upstream snapshot, applies your patch, and builds the image. See our &lt;a href=&quot;&#x2F;guides&#x2F;local-testing-strategies&#x2F;&quot;&gt;Local Testing Strategies&lt;&#x2F;a&gt; guide for details.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;10-docker-for-arbitrary-network-layouts&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#10-docker-for-arbitrary-network-layouts&quot; aria-label=&quot;Anchor link for: 10-docker-for-arbitrary-network-layouts&quot;&gt;10. Docker for Arbitrary Network Layouts&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Each test suite uses Docker to create isolated, reproducible network environments:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transport tests&lt;&#x2F;strong&gt;: Simple dialer&#x2F;listener on a shared network&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Performance tests&lt;&#x2F;strong&gt;: Controlled environment for accurate measurements&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hole-punch tests&lt;&#x2F;strong&gt;: Complex topology with NAT routers, relay servers, and isolated LANs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The hole-punch tests create five containers per test with three networks, simulating realistic NAT traversal scenarios.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-changed-by-the-numbers&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-changed-by-the-numbers&quot; aria-label=&quot;Anchor link for: what-changed-by-the-numbers&quot;&gt;What Changed: By the Numbers&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Between commits &lt;code&gt;f58b7472&lt;&#x2F;code&gt; and &lt;code&gt;d6e5bea1&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;196 commits&lt;&#x2F;strong&gt; of focused development&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;284 files&lt;&#x2F;strong&gt; changed&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;+73,488 insertions&lt;&#x2F;strong&gt;, &lt;strong&gt;-49,912 deletions&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;11 new documentation files&lt;&#x2F;strong&gt; (~6,000+ lines)&lt;&#x2F;li&gt;
&lt;li&gt;Migration from TypeScript to &lt;strong&gt;~4,000+ lines&lt;&#x2F;strong&gt; of shared bash libraries&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The result is a simpler, more maintainable codebase that&#x27;s easier to understand and extend.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;test-suites&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#test-suites&quot; aria-label=&quot;Anchor link for: test-suites&quot;&gt;Test Suites&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;performance-benchmarking-perf&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#performance-benchmarking-perf&quot; aria-label=&quot;Anchor link for: performance-benchmarking-perf&quot;&gt;Performance Benchmarking (&lt;code&gt;perf&#x2F;&lt;&#x2F;code&gt;)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Measures the overhead that libp2p introduces:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Upload throughput&lt;&#x2F;strong&gt; (bytes&#x2F;second)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Download throughput&lt;&#x2F;strong&gt; (bytes&#x2F;second)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Latency&lt;&#x2F;strong&gt; with statistical distribution (min, q1, median, q3, max, outliers)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Baseline tests against iperf, raw QUIC, and HTTPS establish reference points for measuring libp2p overhead.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;transport-interoperability-transport&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#transport-interoperability-transport&quot; aria-label=&quot;Anchor link for: transport-interoperability-transport&quot;&gt;Transport Interoperability (&lt;code&gt;transport&#x2F;&lt;&#x2F;code&gt;)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Verifies cross-implementation compatibility:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dial success&#x2F;failure&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Handshake latency&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ping latency&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Tests run in parallel (default: CPU core count) for fast feedback on large test matrices.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hole-punch-nat-traversal-hole-punch&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hole-punch-nat-traversal-hole-punch&quot; aria-label=&quot;Anchor link for: hole-punch-nat-traversal-hole-punch&quot;&gt;Hole-Punch NAT Traversal (&lt;code&gt;hole-punch&#x2F;&lt;&#x2F;code&gt;)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Tests the DCUtR protocol for establishing direct connections through NAT:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Realistic network topology with NAT routers&lt;&#x2F;li&gt;
&lt;li&gt;Relay server coordination&lt;&#x2F;li&gt;
&lt;li&gt;Direct connection verification&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Each test gets unique subnets calculated from the test key, enabling parallel execution without network conflicts.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;implementation-coverage&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#implementation-coverage&quot; aria-label=&quot;Anchor link for: implementation-coverage&quot;&gt;Implementation Coverage&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The test suite covers implementations in:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rust&lt;&#x2F;strong&gt; (rust-libp2p)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Go&lt;&#x2F;strong&gt; (go-libp2p)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;&#x2F;strong&gt; (js-libp2p v1.x, v2.x, v3.x)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;&#x2F;strong&gt; (py-libp2p)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Nim&lt;&#x2F;strong&gt; (nim-libp2p)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;JVM&lt;&#x2F;strong&gt; (jvm-libp2p)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;C&lt;&#x2F;strong&gt; (c-libp2p)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;.NET&lt;&#x2F;strong&gt; (dotnet-libp2p)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Zig&lt;&#x2F;strong&gt; (zig-libp2p)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Browsers&lt;&#x2F;strong&gt; (via WebRTC and WebTransport)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With 40+ implementation variations across different versions and configurations.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#getting-started&quot; aria-label=&quot;Anchor link for: getting-started&quot;&gt;Getting Started&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;check-dependencies&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#check-dependencies&quot; aria-label=&quot;Anchor link for: check-dependencies&quot;&gt;Check Dependencies&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #66D9EF;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; perf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --check-deps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;list-available-implementations&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#list-available-implementations&quot; aria-label=&quot;Anchor link for: list-available-implementations&quot;&gt;List Available Implementations&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --list-images&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;preview-test-selection&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#preview-test-selection&quot; aria-label=&quot;Anchor link for: preview-test-selection&quot;&gt;Preview Test Selection&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-select&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;~rust&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --list-tests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;run-tests&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#run-tests&quot; aria-label=&quot;Anchor link for: run-tests&quot;&gt;Run Tests&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;# Performance tests with rust implementations&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #66D9EF;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; perf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-select&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;~rust&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --iterations 5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;# Transport interoperability&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #66D9EF;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; transport&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-select&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;~rust|~go&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;# Hole-punch tests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #66D9EF;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; hole-punch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-select&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;~rust&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;create-reproducible-snapshots&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#create-reproducible-snapshots&quot; aria-label=&quot;Anchor link for: create-reproducible-snapshots&quot;&gt;Create Reproducible Snapshots&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --impl-select&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;quot;~rust&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; --snapshot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The snapshot captures everything needed to reproduce the test run.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reproducibility-with-inputs-yaml&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#reproducibility-with-inputs-yaml&quot; aria-label=&quot;Anchor link for: reproducibility-with-inputs-yaml&quot;&gt;Reproducibility with inputs.yaml&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Every test run generates an &lt;code&gt;inputs.yaml&lt;&#x2F;code&gt; file capturing:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;All command-line arguments&lt;&#x2F;li&gt;
&lt;li&gt;Environment variables&lt;&#x2F;li&gt;
&lt;li&gt;Filter settings&lt;&#x2F;li&gt;
&lt;li&gt;Test-specific parameters&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;To reproduce a previous run:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;cp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &#x2F;srv&#x2F;cache&#x2F;test-run&#x2F;perf-abc12345&#x2F;inputs.yaml .&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;.&#x2F;run.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The framework reads &lt;code&gt;inputs.yaml&lt;&#x2F;code&gt; at startup and applies the same configuration.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;future-work&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#future-work&quot; aria-label=&quot;Anchor link for: future-work&quot;&gt;Future Work&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Remote host testing&lt;&#x2F;strong&gt; via Docker Swarm for real network conditions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Additional test suites&lt;&#x2F;strong&gt; for other protocols&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Improved reporting&lt;&#x2F;strong&gt; with historical comparisons&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Community contributions&lt;&#x2F;strong&gt; welcome for new implementations&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;resources&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resources&quot; aria-label=&quot;Anchor link for: resources&quot;&gt;Resources&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;test-plans&quot;&gt;test-plans repository&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;guides&#x2F;local-testing-strategies&#x2F;&quot;&gt;Local Testing Strategies&lt;&#x2F;a&gt; - Installation, filtering, and patching&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;guides&#x2F;write-a-perf-test-app&#x2F;&quot;&gt;Write a Performance Test Application&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;guides&#x2F;write-a-transport-test-app&#x2F;&quot;&gt;Write a Transport Test Application&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;guides&#x2F;write-a-hole-punch-test-app&#x2F;&quot;&gt;Write a Hole-Punch Test Application&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We believe this rewrite significantly improves the developer experience for testing libp2p implementations. The combination of cross-platform support, powerful filtering, reproducibility, and comprehensive documentation makes it easier than ever to ensure your libp2p implementation works correctly with the rest of the ecosystem.&lt;&#x2F;p&gt;
&lt;p&gt;Try it out, and let us know what you think!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing the release of go-libp2p v0.47</title>
          <pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/releases/2026-01-25-go-libp2p/</link>
          <guid>https://libp2p.io/preview/pr-30/releases/2026-01-25-go-libp2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/releases/2026-01-25-go-libp2p/">&lt;p&gt;&lt;code&gt;go-libp2p v0.47&lt;&#x2F;code&gt; has just shipped.&lt;&#x2F;p&gt;
&lt;p&gt;A relatively small release. The main changes are dependency updates and a
couple of bug fixes. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3435&quot;&gt;#3435&lt;&#x2F;a&gt;
changes autonatv2 reachability logic, which should be a net win for most users.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-changed&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-changed&quot; aria-label=&quot;Anchor link for: what-s-changed&quot;&gt;What&#x27;s Changed&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;fix(autonatv2): secondary addrs inherit reachability from primary by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lidel&quot;&gt;@lidel&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3435&quot;&gt;#3435&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Update simnet by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MarcoPolo&quot;&gt;@MarcoPolo&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3449&quot;&gt;#3449&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;mod tidy test-plans package by @MarcoPolo in #3450&lt;&#x2F;li&gt;
&lt;li&gt;fix(basic_host): stream.Close() blocks indefinitely on unresponsive peers by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lidel&quot;&gt;@lidel&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3448&quot;&gt;#3448&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;fix: handle error from mh.Sum in IDFromPublicKey by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MozirDmitriy&quot;&gt;@MozirDmitriy&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3437&quot;&gt;#3437&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;update webtransport-go to v0.10.0 and quic-go to v0.59.0 by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;marten-seemann&quot;&gt;@marten-seemann&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3452&quot;&gt;#3452&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;rcmgr: expose resource limits to Prometheus by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sneaxhuh&quot;&gt;@sneaxhuh&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3433&quot;&gt;#3433&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;new-contributors&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#new-contributors&quot; aria-label=&quot;Anchor link for: new-contributors&quot;&gt;New Contributors&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MozirDmitriy&quot;&gt;@MozirDmitriy&lt;&#x2F;a&gt; made their first contribution in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3437&quot;&gt;#3437&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sneaxhuh&quot;&gt;@sneaxhuh&lt;&#x2F;a&gt; made their first contribution in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;pull&#x2F;3433&quot;&gt;#3433&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Full Changelog:&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;compare&#x2F;v0.46.0...v0.47.0&quot;&gt;v0.46.0...v0.47.0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing the tag of py-libp2p v0.5.0</title>
          <pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/releases/2025-12-21-py-libp2p/</link>
          <guid>https://libp2p.io/preview/pr-30/releases/2025-12-21-py-libp2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/releases/2025-12-21-py-libp2p/">&lt;p&gt;&lt;code&gt;py-libp2p v0.5.0&lt;&#x2F;code&gt; has just shipped.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-changed&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-changed&quot; aria-label=&quot;Anchor link for: what-s-changed&quot;&gt;What&#x27;s Changed&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Full Changelog:&lt;&#x2F;strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;py-libp2p&#x2F;compare&#x2F;v0.4.0...v0.5.0&quot;&gt;v0.4.0...v0.5.0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing the release of js-libp2p v3.0.0</title>
          <pubDate>Tue, 30 Sep 2025 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/releases/2025-09-30-js-libp2p/</link>
          <guid>https://libp2p.io/preview/pr-30/releases/2025-09-30-js-libp2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/releases/2025-09-30-js-libp2p/">&lt;p&gt;&lt;code&gt;libp2p@3.x.x&lt;&#x2F;code&gt; has just shipped, representing our once-yearly roll-up of breaking changes.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s find out what&#x27;s changed and why, and how you can upgrade your project to the latest and greatest.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-new&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-new&quot; aria-label=&quot;Anchor link for: what-s-new&quot;&gt;What&#x27;s new?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;streams-as-eventtargets&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#streams-as-eventtargets&quot; aria-label=&quot;Anchor link for: streams-as-eventtargets&quot;&gt;Streams as EventTargets&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Prior to v3, streams were streaming iterables. This convention has not been adopted outside the libp2p project, which raises the bar for new developers, and leans heavily on promises which can introduce surprising latency to simple operations.&lt;&#x2F;p&gt;
&lt;p&gt;As of v3, streams have become EventTargets. These follow a familiar pattern where you attach event listeners for incoming message events and write data synchronously.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; { createLibp2p }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;#39;libp2p&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; { peerIdFromString }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;#39;@libp2p&#x2F;peer-id&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; node&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; = await&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt; createLibp2p&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; peer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt; peerIdFromString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;#39;123Foo...&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; = await&lt;&#x2F;span&gt;&lt;span&gt; node.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;dialProtocol&lt;&#x2F;span&gt;&lt;span&gt;(peer,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;#39;&#x2F;my-protocol&#x2F;1.0.0&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  signal: AbortSignal.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;timeout&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt;5_000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;&#x2F;&#x2F; register a listener for incoming data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stream.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;addEventListener&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;#39;message&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FD971F;font-style: italic;&quot;&gt;evt&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  console.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;info&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt; TextDecoder&lt;&#x2F;span&gt;&lt;span&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;decode&lt;&#x2F;span&gt;&lt;span&gt;(evt.data.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;subarray&lt;&#x2F;span&gt;&lt;span&gt;()))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;})&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;&#x2F;&#x2F; send some data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stream.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt; TextEncoder&lt;&#x2F;span&gt;&lt;span&gt;().&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;encode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;#39;hello world&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Synchronous streams have shown a small increase in throughput and more predictable behavior.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;write-back-pressure&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#write-back-pressure&quot; aria-label=&quot;Anchor link for: write-back-pressure&quot;&gt;Write back pressure&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Streams can apply back pressure by their &lt;code&gt;.send()&lt;&#x2F;code&gt; method returning false. Once this returns false, the sender should wait for a &lt;code&gt;&#x27;drain&#x27;&lt;&#x2F;code&gt; event before continuing:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; buf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; of&lt;&#x2F;span&gt;&lt;span&gt; bufs) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;stream.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;send&lt;&#x2F;span&gt;&lt;span&gt;(buf)) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;    await&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt; pEvent&lt;&#x2F;span&gt;&lt;span&gt;(stream,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;#39;drain&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      rejectionEvents: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;#39;close&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;other-improvements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#other-improvements&quot; aria-label=&quot;Anchor link for: other-improvements&quot;&gt;Other improvements&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Better TypeScript types&lt;&#x2F;li&gt;
&lt;li&gt;Improved error handling&lt;&#x2F;li&gt;
&lt;li&gt;Performance optimizations&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Check out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p&#x2F;blob&#x2F;main&#x2F;UPGRADING.md&quot;&gt;migration guide&lt;&#x2F;a&gt; for detailed upgrade instructions.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing the release of rust-libp2p v0.56</title>
          <pubDate>Sat, 28 Jun 2025 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/releases/2025-06-28-rust-libp2p/</link>
          <guid>https://libp2p.io/preview/pr-30/releases/2025-06-28-rust-libp2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/releases/2025-06-28-rust-libp2p/">&lt;p&gt;&lt;code&gt;rust-libp2p v0.56&lt;&#x2F;code&gt; has just shipped.&lt;&#x2F;p&gt;
&lt;p&gt;See individual &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;rust-libp2p&#x2F;blob&#x2F;libp2p-v0.56.0&#x2F;CHANGELOG.md&quot;&gt;changelogs&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-new&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-new&quot; aria-label=&quot;Anchor link for: what-s-new&quot;&gt;What&#x27;s new?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Notably, we&#x27;ve removed support for &lt;code&gt;async-std&lt;&#x2F;code&gt; in all crates, as &lt;code&gt;async-std&lt;&#x2F;code&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;async-rs&#x2F;async-std&#x2F;pull&#x2F;1099&quot;&gt;has been discontinued&lt;&#x2F;a&gt;. Users
should switch to using tokio instead. For now, we&#x27;ve kept the abstractions for
supporting alternative runtimes, although not all parts may be public. Please
open an issue if you are planning to support a custom runtime and run into any
issues with that..&lt;&#x2F;p&gt;
&lt;p&gt;Thanks to everyone who contributed to the release!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing AutoTLS: Bridging the Gap Between libp2p and the Web</title>
          <pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/autotls/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/autotls/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/autotls/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.ipfs.tech&#x2F;shipyard-hello-world&#x2F;&quot;&gt;Interplanetary Shipyard&lt;&#x2F;a&gt; is excited to announce &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;registration.libp2p.direct&#x2F;&quot;&gt;AutoTLS&lt;&#x2F;a&gt;, a new service that automates the issuance of Let&#x27;s Encrypt wildcard TLS certificates for libp2p nodes.&lt;&#x2F;p&gt;
&lt;p&gt;This is a major leap for the libp2p ecosystem, as it allows connectivity between browsers and libp2p nodes using Secure WebSockets, opening up a new class of use cases for libp2p that were previously cumbersome.&lt;&#x2F;p&gt;
&lt;p&gt;This blog post explores the use-cases for AutoTLS, challenges of browser-node connectivity, how AutoTLS works, and how it fits into the libp2p project and the browser ecosystem.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re interested in trying it out, we have an example with go-libp2p and js-libp2p:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;tree&#x2F;master&#x2F;examples&#x2F;autotls&quot;&gt;AutoTLS example for go-libp2p&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p-example-auto-tls&quot;&gt;AutoTLS example for js-libp2p&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If you prefer a turn-key implementation:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ipfs.tech&#x2F;install&#x2F;command-line&#x2F;&quot;&gt;IPFS Kubo&lt;&#x2F;a&gt; &amp;gt;= 0.33: Opt-in via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipfs&#x2F;kubo&#x2F;blob&#x2F;master&#x2F;docs&#x2F;config.md#autotlsenabled&quot;&gt;&lt;code&gt;AutoTLS.Enabled&lt;&#x2F;code&gt; configuration flag&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ipfs.tech&#x2F;install&#x2F;ipfs-desktop&#x2F;&quot;&gt;IPFS Desktop&lt;&#x2F;a&gt; &amp;gt;= 0.41: enabled by default&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;npmjs.com&#x2F;package&#x2F;helia&quot;&gt;Helia&lt;&#x2F;a&gt; &amp;gt;= 5.2.0: enabled by default&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;use-cases-for-autotls&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#use-cases-for-autotls&quot; aria-label=&quot;Anchor link for: use-cases-for-autotls&quot;&gt;Use-cases for AutoTLS&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Browser-node connectivity is foundational to any libp2p based network or application looking to expand its user base, through web-based clients. Since the libp2p ecosystem exhibits a wide range of network topologies, we&#x27;ve identified a few use-cases that benefit from AutoTLS.&lt;&#x2F;p&gt;
&lt;p&gt;The core idea is that AutoTLS enables reliable browser-based clients to connect to libp2p nodes, regardless of the network topology; which improves resilience and opens up a window to more capable browser clients.&lt;&#x2F;p&gt;
&lt;p&gt;Blockchains using libp2p, such as Ethereum, Celestia, and Filecoin, could integrate AutoTLS and improve access to chain state for browser-based &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ethereum.org&#x2F;en&#x2F;developers&#x2F;docs&#x2F;nodes-and-clients&#x2F;light-clients&#x2F;#why-are-light-clients-important&quot;&gt;light clients&lt;&#x2F;a&gt; and wallets. This would promote client-side transaction and state verification.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;autotls&#x2F;networks-using-libp2p.jpg&quot; alt=&quot;Chains using libp2p&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Though it remains to be seen how practical browser-based light clients will be, we&#x27;re already seeing interest in AutoTLS from the community. For example, AutoTLS has already proven to be instrumental for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;eigerco&#x2F;lumina&quot;&gt;Celestia Lumina client implementation&lt;&#x2F;a&gt;, a Rust implementation of Celestia&#x27;s data availability node, which compiles to WASM. When &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lumina.rs&#x2F;&quot;&gt;running in a browser&lt;&#x2F;a&gt;, it can reliably connect to more capable bridge and full Celestia nodes with TLS certificates issued by AutoTLS. What&#x27;s more, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;probelab.io&#x2F;&quot;&gt;ProbeLab team&lt;&#x2F;a&gt; has integrated AutoTLS into &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;probe-lab&#x2F;ants-watch&quot;&gt;Ants Watch&lt;&#x2F;a&gt;, which monitors the Celestia DHT, and already have &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;probelab.io&#x2F;celestia&#x2F;dht&#x2F;2025-02&#x2F;#lightnode-population&quot;&gt;insight into the distribution&lt;&#x2F;a&gt; of browser-based Lumina clients in the network.&lt;&#x2F;p&gt;
&lt;p&gt;Another example, which also served as the initial catalyst for AutoTLS, is to enable direct browser retrieval from IPFS nodes, without needing intermediary gateways. The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;inbrowser.link&quot;&gt;Service Worker Gateway&lt;&#x2F;a&gt; supports discovery and retrieval from AutoTLS-enabled IPFS nodes.&lt;&#x2F;p&gt;
&lt;p&gt;With that in mind, let&#x27;s explore the challenges of browser-node connectivity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-is-browser-node-connectivity-hard&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-is-browser-node-connectivity-hard&quot; aria-label=&quot;Anchor link for: why-is-browser-node-connectivity-hard&quot;&gt;Why is browser-node connectivity hard?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Historically, the Web relied solely on unencrypted HTTP as the default transport, undermining user privacy and exposing users to MITM attacks. With the advent of TLS, HTTPS, and automated Certificate Authorities like Let&#x27;s Encrypt, encryption is now the norm. So much so that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.google&#x2F;products&#x2F;chrome&#x2F;milestone-chrome-security-marking-http-not-secure&#x2F;&quot;&gt;Chrome warns users &quot;Not secure&quot;&lt;&#x2F;a&gt; when they&#x27;re visiting a site over an unencrypted HTTP connection, or produce &quot;mixed-content&quot; errors when a page tries to fetch unencrypted subresources.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;autotls&#x2F;computer-says-no.png&quot; alt=&quot;Chrome warning&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In libp2p, &lt;a href=&quot;&#x2F;guides&#x2F;secure-channels-overview&#x2F;&quot;&gt;all connections are encrypted&lt;&#x2F;a&gt; by default, using either Noise or TLS.&lt;&#x2F;p&gt;
&lt;p&gt;For as long as libp2p has existed, browser-node connectivity has been a challenge. Browsers do not consider libp2p&#x27;s encryption layer for WebSocket connections as part of &quot;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;Security&#x2F;Secure_Contexts&quot;&gt;Secure Context&lt;&#x2F;a&gt;&quot;, leaving us with browser-negotiated TLS encryption as the only viable option.&lt;&#x2F;p&gt;
&lt;p&gt;Up until recently, configuring a libp2p node to be connectable from browsers required additional effort, as node operators had to own and manually configure a domain name and obtain a TLS certificate signed by a certificate authority (CA).&lt;&#x2F;p&gt;
&lt;p&gt;Recent investments in &lt;a href=&quot;&#x2F;guides&#x2F;browser-connectivity#webtransport&quot;&gt;WebTransport&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;guides&#x2F;browser-connectivity#webrtc&quot;&gt;WebRTC&lt;&#x2F;a&gt; helped circumvent this problem, by removing the need for CA-signed TLS certificate, but they have their own drawbacks outlined below.&lt;&#x2F;p&gt;
&lt;p&gt;Experience has shown that WebSockets are still the most common and reliable way to establish a bidirectional streaming connection from a browser. That&#x27;s not to say that WebSockets are perfect. Most notably, in libp2p, &lt;a href=&quot;&#x2F;guides&#x2F;browser-connectivity#websocket&quot;&gt;Secure WebSockets require 5 round trips to establish a connection&lt;&#x2F;a&gt;, no support for backpressure on streams (except for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.chrome.com&#x2F;docs&#x2F;capabilities&#x2F;web-apis&#x2F;websocketstream&quot;&gt;&lt;code&gt;WebSocketStream&lt;&#x2F;code&gt; in Chrome&lt;&#x2F;a&gt;), and Secure WebSockets in libp2p require &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;pull&#x2F;625&quot;&gt;double encryption&lt;&#x2F;a&gt;, which is inefficient.&lt;&#x2F;p&gt;
&lt;p&gt;By comparison, &lt;a href=&quot;&#x2F;guides&#x2F;browser-connectivity#webtransport&quot;&gt;WebTransport requires 3 round trips&lt;&#x2F;a&gt;, which is why we believe WebTransport is well positioned to be the recommended transport for browser-node connectivity, alas, only once WebTransport is stable and widely supported by browsers.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-autotls-works&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-autotls-works&quot; aria-label=&quot;Anchor link for: how-autotls-works&quot;&gt;How AutoTLS works&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;With AutoTLS, the end result is:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Your libp2p node, identified by a &lt;a href=&quot;&#x2F;guides&#x2F;peers&#x2F;#peer-id&quot;&gt;PeerID&lt;&#x2F;a&gt;, has a wild card certificate for &lt;code&gt;*.&amp;lt;PeerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;The authoritative DNS server of &lt;code&gt;libp2p.direct&lt;&#x2F;code&gt; (part of the AutoTLS service) maps DNS names to your libp2p node&#x27;s IP addresses statelessly.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;&#x2F;strong&gt; &lt;code&gt;&amp;lt;PeerID&amp;gt;&lt;&#x2F;code&gt; is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cid.ipfs.tech&#x2F;#k51qzi5uqu5dh72mdzh50ohq411bo2tzdcdirjw0597vujl9w4hmkn4r8550r0&quot;&gt;base36 encoded&lt;&#x2F;a&gt; to keep the DNS label length under 63 characters (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tools.ietf.org&#x2F;html&#x2F;rfc1034#page-7&quot;&gt;RFC 1034&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;With that in mind, let&#x27;s track back how AutoTLS works starting with Let&#x27;s Encrypt and ACME.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;let-s-encrypt-and-acme&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#let-s-encrypt-and-acme&quot; aria-label=&quot;Anchor link for: let-s-encrypt-and-acme&quot;&gt;Let&#x27;s Encrypt and ACME&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Let&#x27;s Encrypt is a free, automated, and open certificate authority (CA) service. To obtain a certificate, you need to prove that you control the domain name using a protocol called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;letsencrypt.org&#x2F;how-it-works&#x2F;&quot;&gt;ACME&lt;&#x2F;a&gt;, which defines a set of challenges that you need to pass to prove that you control the domain name.&lt;&#x2F;p&gt;
&lt;p&gt;For example, to obtain a wildcard certificate for &lt;code&gt;*.&amp;lt;PeerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt;, you need to prove that you control the domain name by setting a TXT record at &lt;code&gt;_acme-challenge.&amp;lt;PeerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt; with a value that matches the ACME challenge.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;autotls-components&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#autotls-components&quot; aria-label=&quot;Anchor link for: autotls-components&quot;&gt;AutoTLS components&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;AutoTLS has two main components:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;registration.libp2p.direct&lt;&#x2F;code&gt;: An ACME DNS-01 challenge broker that authenticates PeerIDs, verifies your node is reachable on the address you provided, and sets the &lt;code&gt;_acme-challenge.&amp;lt;PeerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt; TXT record for the ACME challenge.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;libp2p.direct&lt;&#x2F;code&gt;: Authoritative DNS server that maps DNS names to the libp2p node&#x27;s IP addresses &lt;strong&gt;statelessly&lt;&#x2F;strong&gt; (without needing to persist any state about the node&#x27;s IP addresses).&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;autotls-dns-01-challenge-broker&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#autotls-dns-01-challenge-broker&quot; aria-label=&quot;Anchor link for: autotls-dns-01-challenge-broker&quot;&gt;AutoTLS DNS-01 challenge broker&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;To kick-start the AutoTLS process, your libp2p node requests a TLS certificate for &lt;code&gt;*.&amp;lt;PeerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt; from Let&#x27;s Encrypt. To which Let&#x27;s Encrypt responds with a challenge to prove it controls that domain.&lt;&#x2F;li&gt;
&lt;li&gt;Your libp2p node then calls the AutoTLS DNS-01 challenge broker (&lt;code&gt;registration.libp2p.direct&lt;&#x2F;code&gt;) with the ACME challenge token and your libp2p node&#x27;s multiaddrs.&lt;&#x2F;li&gt;
&lt;li&gt;The DNS-01 challenge broker authenticates your PeerID, verifies your network reachability and sets the TXT DNS record for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;letsencrypt.org&#x2F;docs&#x2F;challenge-types&#x2F;#dns-01-challenge&quot;&gt;ACME challenge&lt;&#x2F;a&gt; at &lt;code&gt;_acme-challenge.&amp;lt;PeerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Once that TXT DNS record is set, your node notifies Let&#x27;s Encrypt that the challenge is complete, validates the challenge, and issues a TLS certificate for &lt;code&gt;*.&amp;lt;PeerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The following diagram illustrates the AutoTLS DNS-01 challenge broker in action:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;autotls&#x2F;auto-tls-1.svg&quot; alt=&quot;AutoTLS&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;autotls-dns-server&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#autotls-dns-server&quot; aria-label=&quot;Anchor link for: autotls-dns-server&quot;&gt;AutoTLS DNS server&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The second part of the AutoTLS service is the authoritative DNS server for &lt;code&gt;libp2p.direct&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Its main role is to map DNS names to the libp2p node&#x27;s IP addresses statelessly. For example, &lt;code&gt;203-0-113-1.&amp;lt;peerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt; resolves to the A record with the IP &lt;code&gt;203.0.113.1&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The trick here is that the &lt;strong&gt;IP address is encoded in the DNS name&lt;&#x2F;strong&gt;. Dots are substituted with dashes to ensure the TLS certificate remains valid. The benefit of this approach is that whenever a libp2p node&#x27;s IP address changes, it&#x27;s resolvable without coordination. This keeps the DNS server stateless and simple to operate.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;autotls&#x2F;auto-tls-2.svg&quot; alt=&quot;AutoTLS part 2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bringing-it-all-together&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bringing-it-all-together&quot; aria-label=&quot;Anchor link for: bringing-it-all-together&quot;&gt;Bringing it all together&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Once a libp2p node has a TLS certificate for &lt;code&gt;*.&amp;lt;PeerID&amp;gt;.libp2p.direct&lt;&#x2F;code&gt;, it will typically announce a matching Secure WebSocket address via the identify protocol.&lt;&#x2F;p&gt;
&lt;p&gt;The multiaddr for a libp2p node with &lt;code&gt;libp2p.direct&lt;&#x2F;code&gt; TLS certificate looks like this (&lt;code&gt;&#x2F;p2p&#x2F;PeerID&lt;&#x2F;code&gt; suffix omitted for brevity):&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;&#x2F;ip4&#x2F;145.40.89.101&#x2F;tcp&#x2F;4002&#x2F;tls&#x2F;sni&#x2F;145-40-89-101.k51qzi5uqu5dj0wvrbb8keygfyxe2v0fi1qbqz4pl3zzozle7oaqhf97mqazo4.libp2p.direct&#x2F;ws&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;&#x2F;strong&gt; Another valid shorter representation of the multiaddr is &lt;code&gt;&#x2F;dns4&#x2F;145-40-89-101.k51qzi5uqu5dj0wvrbb8keygfyxe2v0fi1qbqz4pl3zzozle7oaqhf97mqazo4.libp2p.direct&#x2F;tcp&#x2F;4002&#x2F;tls&#x2F;ws&lt;&#x2F;code&gt;, but it requires a DNS lookup to resolve the IP address. In theory, avoiding the DNS lookup is a performance win, but in practice, browsers don&#x27;t let you manually set the SNI hostname for a WebSocket connection, so the browser WebSocket API requires the DNS name for the Secure WebSocket connection.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;This multiaddr can be dialed from any browser with &lt;code&gt;js-libp2p&lt;&#x2F;code&gt;. You can see this in action with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;helia-identify.on.fleek.co&#x2F;?peer-or-maddr=%2Fdns4%2F145-40-89-101.k51qzi5uqu5dj0wvrbb8keygfyxe2v0fi1qbqz4pl3zzozle7oaqhf97mqazo4.libp2p.direct%2Ftcp%2F4001%2Ftls%2Fws%2Fp2p%2F12D3KooWHVXoJnv2ifmr9K6LWwJPXxkfvzZRHzjiTZMvybeTnwPy&quot;&gt;Helia Identify Tool&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-about-other-browser-transports&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-about-other-browser-transports&quot; aria-label=&quot;Anchor link for: what-about-other-browser-transports&quot;&gt;What about other browser transports?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Solving the problem of browser-node connectivity has been a goal for the libp2p project. In recent years, libp2p introduced support for both &lt;a href=&quot;&#x2F;blog&#x2F;webtransport&quot;&gt;WebTransport&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;blog&#x2F;libp2p-webrtc-browser-to-server&quot;&gt;WebRTC&lt;&#x2F;a&gt; to solve this problem with varying degrees of success.&lt;&#x2F;p&gt;
&lt;p&gt;While these transports have their own strengths and weaknesses, they all share the same goal: enabling browser-node connectivity.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;webtransport&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webtransport&quot; aria-label=&quot;Anchor link for: webtransport&quot;&gt;WebTransport&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;blog&#x2F;webtransport&quot;&gt;Two years ago, the libp2p project bet on the promise of WebTransport&lt;&#x2F;a&gt; and it&#x27;s been a bumpy road.&lt;&#x2F;p&gt;
&lt;p&gt;WebTransport has a lot of promise. It&#x27;s a modern browser protocol based on QUIC (which we already heavily rely on in libp2p), which allows bidirectional streaming communication with many modern improvements over WebSockets. Most notably:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;3 round trips to establish a connection.&lt;&#x2F;li&gt;
&lt;li&gt;Support of authentication using certificate hashes eliminates the need for CA-signed certificates and a domain.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;However, the WebTransport specification is still in draft, and browsers have a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p&#x2F;issues&#x2F;2572&quot;&gt;number of open bugs and issues&lt;&#x2F;a&gt;, that we&#x27;ve been working with the browser vendors to address. As such, browser compatibility breaks as soon as the interoperability target changes.&lt;&#x2F;p&gt;
&lt;p&gt;While we still believe in the longer term promise of WebTransport, we&#x27;ve reoriented our immediate priorities to WebRTC-Direct (which is now available) and Secure WebSockets with AutoTLS. Nonetheless, we continue to work with browser vendors and standard bodies to get WebTransport in libp2p to a stable and interoperable state.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;webrtc&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webrtc&quot; aria-label=&quot;Anchor link for: webrtc&quot;&gt;WebRTC&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;blob&#x2F;master&#x2F;webrtc&#x2F;webrtc-direct.md&quot;&gt;WebRTC-Direct&lt;&#x2F;a&gt; is a libp2p approach using WebRTC to allow browser-to-node communication. It&#x27;s unique in that it doesn&#x27;t require &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Session_Description_Protocol&quot;&gt;SDP&lt;&#x2F;a&gt; signaling, and saves round trips by constructing the SDP from the information in the webrtc-direct multiaddr (a technique called &quot;SDP munging&quot;). Moreover, WebRTC doesn&#x27;t require a domain name and CA-signed TLS certificate.&lt;&#x2F;p&gt;
&lt;p&gt;However, there are a number of drawbacks to WebRTC:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;WebRTC is not supported in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;Service_Worker_API&quot;&gt;Service Workers&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;issues.chromium.org&#x2F;issues&#x2F;41378764&quot;&gt;Chrome limits the number of WebRTC connections per window to 500&lt;&#x2F;a&gt; after which it will prevent establishing new connections.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;origins-vs-peerids&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#origins-vs-peerids&quot; aria-label=&quot;Anchor link for: origins-vs-peerids&quot;&gt;Origins vs. PeerIDs&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The Web security model is anchored to domain names (origins). Moreover, browsers require TLS certificates to be signed by a certificate authority (CA) to ensure that the entity requesting a certificate owns the domain name. The role of certificate authorities is to verify that the entity requesting a certificate owns the domain name.&lt;&#x2F;p&gt;
&lt;p&gt;On the other hand, libp2p&#x27;s security model is anchored to PeerIDs: unique identifiers derived from public keys generated by the libp2p node. Unlike CA-signed TLS certificates, PeerIDs can permissionlessly be generated.&lt;&#x2F;p&gt;
&lt;p&gt;The AutoTLS broker instance at &lt;code&gt;libp2p.direct&lt;&#x2F;code&gt; bridges both worlds while complying with their respective security requirements. The domain was added to https:&#x2F;&#x2F;publicsuffix.org&#x2F; and functions as an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Glossary&#x2F;eTLD&quot;&gt;eTLD&lt;&#x2F;a&gt;, granting each peer its own Origin at &lt;code&gt;{PeerID}.libp2p.direct&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The AutoTLS registration API ensures that only the owner of the private key for a PeerID can request a TLS certificate. Beyond that, the API is used quarterly upon certificate renewal. Secrets never leave the end user&#x27;s machine. And each end user is responsible for the security of their certificates, and revocation is limited to peer-specific subdomains.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;working-towards-a-better-web-platform&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#working-towards-a-better-web-platform&quot; aria-label=&quot;Anchor link for: working-towards-a-better-web-platform&quot;&gt;Working towards a better Web platform&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;A key theme running through this initiative is the challenge of advancing the Web platform to be both more secure and more open. This includes working with browser vendors and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.igalia.com&#x2F;&quot;&gt;Igalia&lt;&#x2F;a&gt; towards the resolution of various issues with WebTransport, WebRTC, etc.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;d like to support our work, please reach out to us at &lt;code&gt;contact [AT] ipshipyard.com&lt;&#x2F;code&gt;, and check out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipfs&#x2F;in-web-browsers&quot;&gt;in-web-browsers&lt;&#x2F;a&gt; repository where we&#x27;re tracking these efforts.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;when-not-to-use-autotls&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#when-not-to-use-autotls&quot; aria-label=&quot;Anchor link for: when-not-to-use-autotls&quot;&gt;When &lt;em&gt;Not&lt;&#x2F;em&gt; to use AutoTLS&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;AutoTLS is designed for production use with Web browsers and should not be used in:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Testing&#x2F;Development&lt;&#x2F;strong&gt;: Unnecessary for local or non-production setups.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CI Systems&lt;&#x2F;strong&gt;: Temporary instances waste certificates and may hit rate limits.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Non-Public Nodes&lt;&#x2F;strong&gt;: If your node is not publicly dialable (e.g., behind a firewall without port forwarding or UPnP) it won&#x27;t benefit from &lt;code&gt;&#x2F;tls&#x2F;ws&lt;&#x2F;code&gt; transport.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Private Networks (PNETs)&lt;&#x2F;strong&gt;: AutoTLS is not compatible with libp2p PNET.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Our long-standing goal at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.ipfs.tech&#x2F;shipyard-hello-world&#x2F;&quot;&gt;Interplanetary Shipyard&lt;&#x2F;a&gt; is building a more resilient and participatory internet through decentralization, and we believe that the Web platform plays an important role in this. We built AutoTLS and run &lt;code&gt;registration.libp2p.direct&lt;&#x2F;code&gt; as a public good service for the libp2p ecosystem. Admittedly, it may seem paradoxical that a centralized public good service like AutoTLS could help the Web become more decentralized. But the reality is that AutoTLS is a necessary step to this end, as well as being lean, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipshipyard&#x2F;p2p-forge&quot;&gt;open source&lt;&#x2F;a&gt;, and built on open standards.&lt;&#x2F;p&gt;
&lt;p&gt;In the long term, WebTransport with self-signed certificates is positioned to become the recommended transport for browser-node connectivity. However, until &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p&#x2F;issues&#x2F;2572&quot;&gt;WebTransport is production ready&lt;&#x2F;a&gt;, AutoTLS and Secure WebSockets are the best way to enable browser-node connectivity.&lt;&#x2F;p&gt;
&lt;p&gt;AutoTLS is an opt-in feature and can be enabled in:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipfs&#x2F;kubo&#x2F;releases&#x2F;tag&#x2F;v0.33.0&quot;&gt;Kubo&lt;&#x2F;a&gt; &amp;gt;= 0.33.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipfs&#x2F;ipfs-desktop&#x2F;releases&#x2F;tag&#x2F;v0.41.0&quot;&gt;IPFS Desktop&lt;&#x2F;a&gt; &amp;gt;= 0.41.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipfs&#x2F;helia&#x2F;releases&#x2F;tag&#x2F;helia-v5.2.0&quot;&gt;Helia&lt;&#x2F;a&gt; &amp;gt;= 5.2.0.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.npmjs.com&#x2F;package&#x2F;@ipshipyard&#x2F;libp2p-auto-tls&quot;&gt;js-libp2p&lt;&#x2F;a&gt; for Node.js.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipshipyard&#x2F;p2p-forge&#x2F;tree&#x2F;main&#x2F;client&quot;&gt;go-libp2p&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;To see code examples of how to use AutoTLS with js-libp2p and go-libp2p, check out the following repositories:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;GO: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;tree&#x2F;master&#x2F;examples&#x2F;autotls&quot;&gt;go-libp2p&#x2F;examples&#x2F;autotls&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;JS: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p-example-auto-tls&quot;&gt;js-libp2p-example-auto-tls&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Try it out and let us know what you think!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing the release of rust-libp2p v0.55</title>
          <pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/releases/2025-01-15-rust-libp2p/</link>
          <guid>https://libp2p.io/preview/pr-30/releases/2025-01-15-rust-libp2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/releases/2025-01-15-rust-libp2p/">&lt;p&gt;&lt;code&gt;rust-libp2p v0.55&lt;&#x2F;code&gt; has just shipped.&lt;&#x2F;p&gt;
&lt;p&gt;See individual &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;rust-libp2p&#x2F;blob&#x2F;libp2p-v0.55.0&#x2F;CHANGELOG.md&quot;&gt;changelogs&lt;&#x2F;a&gt; for details.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks to everyone who contributed to it! ❤️&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Introduction to libp2p Community Meetings</title>
          <pubDate>Mon, 29 Apr 2024 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2024-04-29-libp2p-meetings/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2024-04-29-libp2p-meetings/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2024-04-29-libp2p-meetings/">&lt;p&gt;The libp2p Community is growing a little bit every day since the creation of the libp2p Foundation and the independence of the libp2p Project back in January of 2024.&lt;&#x2F;p&gt;
&lt;p&gt;One such improvement was the centralization of the libp2p Community Calendar to one location: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lu.ma&#x2F;libp2p&quot;&gt;lu.ma&#x2F;libp2p&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This blog post covers all of the current community meetings you will find on the calendar as well as outline how you can organize your own and get it promoted alongside the other libp2p meetings.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-current-calendar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-current-calendar&quot; aria-label=&quot;Anchor link for: the-current-calendar&quot;&gt;The Current Calendar&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Check out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lu.ma&#x2F;libp2p&quot;&gt;libp2p community calendar&lt;&#x2F;a&gt; and add it to your calendar to stay up to date with all the meetings.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;starting-a-new-meeting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#starting-a-new-meeting&quot; aria-label=&quot;Anchor link for: starting-a-new-meeting&quot;&gt;Starting a New Meeting&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The libp2p Community operates on a &quot;2 + you&quot; rule for meetings. If you and two other people would like to start a meeting, let me know and I will help you organize it, list it on the libp2p calendar, announce it on our social media feeds and all of our chat channels.&lt;&#x2F;p&gt;
&lt;p&gt;Find me (@dhuseby) on any of our &lt;a href=&quot;&#x2F;get-involved&#x2F;&quot;&gt;chat rooms&lt;&#x2F;a&gt; and let me know so I can help get it organized.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;current-meetings&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#current-meetings&quot; aria-label=&quot;Anchor link for: current-meetings&quot;&gt;Current Meetings&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;libp2p-community-call&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#libp2p-community-call&quot; aria-label=&quot;Anchor link for: libp2p-community-call&quot;&gt;libp2p Community Call&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This is our main community-wide meeting where we discuss project updates, upcoming events, and community news.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;go-libp2p-meeting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#go-libp2p-meeting&quot; aria-label=&quot;Anchor link for: go-libp2p-meeting&quot;&gt;go-libp2p Meeting&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Regular meetings for the Go implementation of libp2p.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;rust-libp2p-meeting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#rust-libp2p-meeting&quot; aria-label=&quot;Anchor link for: rust-libp2p-meeting&quot;&gt;rust-libp2p Meeting&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Regular meetings for the Rust implementation of libp2p.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;nim-libp2p-meeting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#nim-libp2p-meeting&quot; aria-label=&quot;Anchor link for: nim-libp2p-meeting&quot;&gt;nim-libp2p Meeting&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Regular meetings for the Nim implementation of libp2p.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;js-libp2p-meeting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#js-libp2p-meeting&quot; aria-label=&quot;Anchor link for: js-libp2p-meeting&quot;&gt;js-libp2p Meeting&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Regular meetings for the JavaScript implementation of libp2p.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;libp2p-specifications-meeting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#libp2p-specifications-meeting&quot; aria-label=&quot;Anchor link for: libp2p-specifications-meeting&quot;&gt;libp2p Specifications Meeting&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Meetings to discuss and develop libp2p specifications.&lt;&#x2F;p&gt;
&lt;p&gt;Check the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lu.ma&#x2F;libp2p&quot;&gt;calendar&lt;&#x2F;a&gt; for specific times and dates!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing libp2p-rPGF-1, the first libp2p project RetroPGF Round!</title>
          <pubDate>Mon, 08 Apr 2024 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2024-04-08-libp2p-rpgf/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2024-04-08-libp2p-rpgf/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2024-04-08-libp2p-rpgf/">&lt;p&gt;Today, the libp2p project is excited to announce the &lt;strong&gt;first ever&lt;&#x2F;strong&gt; libp2p retroactive public goods funding round, libp2p-rPGF-1!&lt;&#x2F;p&gt;
&lt;p&gt;The libp2p project is partnering with Gitcoin to retroactively award $125,000 USD worth of OP, recognize impact, and further empower contributors to libp2p.&lt;&#x2F;p&gt;
&lt;p&gt;libp2p will be using a portion of its Optimism rPGF round 3 rewards to contribute back to the broader ecosystem!&lt;&#x2F;p&gt;
&lt;p&gt;libp2p is a public good which powers much of the decentralized web, including projects like Ethereum, Filecoin, Optimism, Polkadot, and more! Moreover, libp2p&#x27;s success as a project is the result of a vast panoply of communities, collaborators, and organizations building together.&lt;&#x2F;p&gt;
&lt;p&gt;However, these efforts are often unrecognized and unrewarded since markets can fail to adequately fund public goods. By embracing RetroPGF, libp2p seeks to bridge that funding gap.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-process&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-process&quot; aria-label=&quot;Anchor link for: the-process&quot;&gt;The Process&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The rounds follow the Optimism template:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Badgeholders selection&lt;&#x2F;li&gt;
&lt;li&gt;Nominations&#x2F;Application submissions&lt;&#x2F;li&gt;
&lt;li&gt;Voting by badgeholders&lt;&#x2F;li&gt;
&lt;li&gt;Publish voting results&lt;&#x2F;li&gt;
&lt;li&gt;Distribute rewards&#x2F;funding&lt;&#x2F;li&gt;
&lt;li&gt;Retrospective to improve future rounds&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;categories&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#categories&quot; aria-label=&quot;Anchor link for: categories&quot;&gt;Categories&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Anyone can nominate a project that has achieved impact in the past 12 months in one of the following categories:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Software &amp;amp; Dependencies&lt;&#x2F;li&gt;
&lt;li&gt;Infrastructure, Tooling, &amp;amp; Utilities&lt;&#x2F;li&gt;
&lt;li&gt;Education, Outreach, and Applications&lt;&#x2F;li&gt;
&lt;li&gt;Research &amp;amp; Development&lt;&#x2F;li&gt;
&lt;li&gt;Other&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This round aims to disburse $125,000 USD worth of OP, with plans to grow in the future.&lt;&#x2F;p&gt;
&lt;p&gt;We would like to thank the participants &amp;amp; sponsors for pushing the ecosystem forward and helping bootstrap public goods funding into the libp2p project!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>libp2p Day at ETHDenver 2024 Recap</title>
          <pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2024-libp2p-day-ethdenver-recap/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2024-libp2p-day-ethdenver-recap/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2024-libp2p-day-ethdenver-recap/">&lt;p&gt;Last month on February 29th, 2024, the libp2p community came together in Denver, Colorado to hold the first libp2p Day in 2024 alongside the ETHDenver conference.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;swot-analysis&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#swot-analysis&quot; aria-label=&quot;Anchor link for: swot-analysis&quot;&gt;SWOT Analysis&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;At the end of the day we had our first &quot;Strengths, Weaknesses, Opportunities and Threats&quot; (SWOT) session of 2024. The highlights:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Strengths&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Our community has expanded to include at least 5 implementations used in production&lt;&#x2F;li&gt;
&lt;li&gt;Several independent communities based around the different implementations&lt;&#x2F;li&gt;
&lt;li&gt;There is some funding to sustain the project going forward&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Weaknesses&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Learning libp2p is still somewhat difficult&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Opportunities&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Focus funding on creation of new learning materials&lt;&#x2F;li&gt;
&lt;li&gt;Make libp2p into the go-to library for distributed systems researchers&lt;&#x2F;li&gt;
&lt;li&gt;Focus on mobile optimization&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Threats&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Continued funding is always going to be a threat to the health of the community&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;talks&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#talks&quot; aria-label=&quot;Anchor link for: talks&quot;&gt;Talks&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We had a great event with 12 different sessions focusing on topics such as public goods funding, probing p2p networks, synchronization protocols in blockchains, designing peer-to-peer social networks and others.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;highlighted-talks&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#highlighted-talks&quot; aria-label=&quot;Anchor link for: highlighted-talks&quot;&gt;Highlighted Talks&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;funding-and-project-update-by-juan-benet&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#funding-and-project-update-by-juan-benet&quot; aria-label=&quot;Anchor link for: funding-and-project-update-by-juan-benet&quot;&gt;Funding and Project update by Juan Benet&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;6-X1wcygmsI&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h4 id=&quot;revolutionizing-data-governance-with-libp2p-by-techieteee&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#revolutionizing-data-governance-with-libp2p-by-techieteee&quot; aria-label=&quot;Anchor link for: revolutionizing-data-governance-with-libp2p-by-techieteee&quot;&gt;Revolutionizing Data Governance with libp2p by TechieTeee&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;BBLRX6AkMOs&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h4 id=&quot;probing-libp2p-networks-with-filecoin-station-by-miroslav-bajtos&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#probing-libp2p-networks-with-filecoin-station-by-miroslav-bajtos&quot; aria-label=&quot;Anchor link for: probing-libp2p-networks-with-filecoin-station-by-miroslav-bajtos&quot;&gt;Probing libp2p Networks with Filecoin Station by Miroslav Bajtoš&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;iMWeMq1UwqE&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h4 id=&quot;programming-peer-to-peer-scenarios-with-aqua&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#programming-peer-to-peer-scenarios-with-aqua&quot; aria-label=&quot;Anchor link for: programming-peer-to-peer-scenarios-with-aqua&quot;&gt;Programming Peer-to-Peer Scenarios with Aqua&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;jsqEM6MuUKI&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h4 id=&quot;gitcoin-and-open-source-funding-mechanism-by-sov-from-gitcoin&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#gitcoin-and-open-source-funding-mechanism-by-sov-from-gitcoin&quot; aria-label=&quot;Anchor link for: gitcoin-and-open-source-funding-mechanism-by-sov-from-gitcoin&quot;&gt;Gitcoin and Open Source Funding Mechanism by Sov from Gitcoin&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;3XIoD6X-n-s&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;full-playlist&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#full-playlist&quot; aria-label=&quot;Anchor link for: full-playlist&quot;&gt;Full Playlist&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Watch the full playlist of talks from libp2p Day at ETHDenver 2024 on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLX9e-uG608s8gXfpFi9fbx51RmYtmARSt&quot;&gt;YouTube&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>rust-libp2p in the Browser with WebRTC!</title>
          <pubDate>Wed, 21 Feb 2024 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/rust-libp2p-browser-webrtc/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/rust-libp2p-browser-webrtc/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/rust-libp2p-browser-webrtc/">&lt;p&gt;We are excited to announce that rust-libp2p running in the browser can now establish WebRTC connections. Before now, WebRTC was only available on the server in rust-libp2p, but after months of coding and reviews, it is available on both the server and in the browser.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-webrtc-for-rust-libp2p&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-webrtc-for-rust-libp2p&quot; aria-label=&quot;Anchor link for: why-webrtc-for-rust-libp2p&quot;&gt;Why WebRTC for rust-libp2p?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;easier-node-operation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#easier-node-operation&quot; aria-label=&quot;Anchor link for: easier-node-operation&quot;&gt;Easier node operation&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Modern browsers require served connections to use TLS. In the case of WebSockets, certificates need to be signed by a Certificate Authority, meaning you need to set up DNS and Let&#x27;s Encrypt. These steps create a barrier to entry.&lt;&#x2F;p&gt;
&lt;p&gt;With WebRTC, we can use self-signed certificates, removing the need for domain names and trusted Certificate Authorities!&lt;&#x2F;p&gt;
&lt;p&gt;Imagine being able to write a web app in Rust that connects to a Rust node running on your desktop at home, without having to set up DNS, Let&#x27;s Encrypt, or any external server infrastructure!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;improved-connectivity&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#improved-connectivity&quot; aria-label=&quot;Anchor link for: improved-connectivity&quot;&gt;Improved connectivity&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;WebRTC also allows connecting two browsers directly. With the ease of setting up a libp2p WebRTC server, anyone can set up their own signalling server or use one embedded into a Rust application!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benefits-of-full-stack-rust-libp2p&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#benefits-of-full-stack-rust-libp2p&quot; aria-label=&quot;Anchor link for: benefits-of-full-stack-rust-libp2p&quot;&gt;Benefits of Full Stack rust-libp2p&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Now that we have rust-libp2p over WebRTC on both server and browser, we can share code between the two layers! Writing isomorphic code speeds up development and makes reviews and debugging easier.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-does-libp2p-use-webrtc&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-does-libp2p-use-webrtc&quot; aria-label=&quot;Anchor link for: how-does-libp2p-use-webrtc&quot;&gt;How does libp2p use WebRTC?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;data-channels&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#data-channels&quot; aria-label=&quot;Anchor link for: data-channels&quot;&gt;Data Channels&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;WebRTC&#x27;s flagship purpose is connecting media (audio and video). However, there is also a powerful data channel API which allows exchanging data streams. This is what libp2p uses at the transport layer.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;breaking-down-the-stack&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#breaking-down-the-stack&quot; aria-label=&quot;Anchor link for: breaking-down-the-stack&quot;&gt;Breaking down the stack&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;The browser provides WebRTC through the Web API&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;wasm-bindgen&lt;&#x2F;code&gt; provides bindings through &lt;code&gt;web-sys&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;rust-libp2p wraps these bindings to implement a WebRTC Transport&lt;&#x2F;li&gt;
&lt;li&gt;This Transport is available for applications (Kademlia, Gossipsub, etc.)&lt;&#x2F;li&gt;
&lt;li&gt;Finally, Rust code is compiled to WebAssembly and runs in the browser&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;demo&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#demo&quot; aria-label=&quot;Anchor link for: demo&quot;&gt;Demo&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;There is a full stack example &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;rust-libp2p&#x2F;tree&#x2F;master&#x2F;examples&#x2F;browser-webrtc&quot;&gt;in the repo&lt;&#x2F;a&gt; that runs a local server, compiles browser code to WebAssembly, and demonstrates pinging back and forth.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-next&quot; aria-label=&quot;Anchor link for: what-s-next&quot;&gt;What&#x27;s next?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Now that we have browser to server connections, the next step is browser to browser connections using the WebRTC circuit relay pattern. Stay tuned for updates!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Announcing the release of js-libp2p v1.0.0</title>
          <pubDate>Tue, 12 Dec 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/releases/2023-12-12-js-libp2p/</link>
          <guid>https://libp2p.io/preview/pr-30/releases/2023-12-12-js-libp2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/releases/2023-12-12-js-libp2p/">&lt;p&gt;js-libp2p has been used in production for many years in IPFS and Ethereum, as well as a wide variety of other ecosystems. Today, we&#x27;re excited to announce the release of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p&#x2F;releases&#x2F;tag&#x2F;libp2p-v1.0.0&quot;&gt;js-libp2p v1.0.0&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-new&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-new&quot; aria-label=&quot;Anchor link for: what-s-new&quot;&gt;What&#x27;s new?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;smart-dialing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#smart-dialing&quot; aria-label=&quot;Anchor link for: smart-dialing&quot;&gt;Smart Dialing&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;One of the major inefficiencies we recognized was how we dialed peers, particularly in the browser. Smart dialing is a dialing strategy that is more aware of the network topology and the reachability of the multiaddrs it is dialing. This has led to a significant reduction in the number of dials made and failed dials.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;circuit-relay-v2&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#circuit-relay-v2&quot; aria-label=&quot;Anchor link for: circuit-relay-v2&quot;&gt;Circuit Relay v2&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Circuit relay was introduced as a means to establish connectivity between libp2p nodes that wouldn&#x27;t otherwise be able to establish a direct connection. Circuit Relay v2 has significant improvements over v1, including support for resource reservation and limitations on durations and data caps.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;nat-hole-punching-with-dcutr&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#nat-hole-punching-with-dcutr&quot; aria-label=&quot;Anchor link for: nat-hole-punching-with-dcutr&quot;&gt;NAT Hole punching with DCUtR&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The libp2p DCUtR (Direct Connection Upgrade through Relay) is a protocol for establishing direct connections between nodes through hole punching, without a signaling server. Implementing this in js-libp2p has benefitted browser nodes significantly.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;webrtc-private-to-private-connectivity&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webrtc-private-to-private-connectivity&quot; aria-label=&quot;Anchor link for: webrtc-private-to-private-connectivity&quot;&gt;WebRTC Private-to-Private Connectivity&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Currently js-libp2p is the only implementation that supports private-to-private browser connectivity using WebRTC. This allows direct peer-to-peer connectivity within the browser regardless of whether nodes are located behind NATs&#x2F;Firewalls.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;webtransport&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webtransport&quot; aria-label=&quot;Anchor link for: webtransport&quot;&gt;WebTransport&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;WebTransport is a new web standard built on top of QUIC that allows establishing WebTransport connections to servers that only have self-signed certificates.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;performance-improvements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#performance-improvements&quot; aria-label=&quot;Anchor link for: performance-improvements&quot;&gt;Performance Improvements&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;reducing-latency&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#reducing-latency&quot; aria-label=&quot;Anchor link for: reducing-latency&quot;&gt;Reducing latency&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We&#x27;ve made an 80%+ improvement in the time it takes to establish a connection between two js-libp2p nodes.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;js-libp2p-v1-latency-improvements.png&quot; alt=&quot;Latency Improvements&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;increasing-throughput&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#increasing-throughput&quot; aria-label=&quot;Anchor link for: increasing-throughput&quot;&gt;Increasing throughput&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Currently js-libp2p has the highest throughput of any of the libp2p implementations, averaging 2.06GB&#x2F;s on both uploads and downloads!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;js-libp2p-v1-throughput-improvements.png&quot; alt=&quot;Throughput Improvements&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;reducing-dependencies&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#reducing-dependencies&quot; aria-label=&quot;Anchor link for: reducing-dependencies&quot;&gt;Reducing Dependencies&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We reduced the bundle size by over 40% by removing modules that are tangential for many use cases.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;developer-experience-improvements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#developer-experience-improvements&quot; aria-label=&quot;Anchor link for: developer-experience-improvements&quot;&gt;Developer Experience Improvements&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;monorepo-setup&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#monorepo-setup&quot; aria-label=&quot;Anchor link for: monorepo-setup&quot;&gt;Monorepo Setup&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The js-libp2p ecosystem once consisted of over 81 repositories! We consolidated all of the repositories into a single monorepo.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;modernization-of-tooling&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#modernization-of-tooling&quot; aria-label=&quot;Anchor link for: modernization-of-tooling&quot;&gt;Modernization of Tooling&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We&#x27;ve completely re-written our codebase in TypeScript and standardized our modules through ESM.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;documentation-improvements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#documentation-improvements&quot; aria-label=&quot;Anchor link for: documentation-improvements&quot;&gt;Documentation Improvements&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We&#x27;ve introduced tools to automate and validate our docs, including a JS-docs based documentation generator and architectural diagrams.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-next&quot; aria-label=&quot;Anchor link for: what-s-next&quot;&gt;What&#x27;s next?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;React Native Support&lt;&#x2F;li&gt;
&lt;li&gt;QUIC support&lt;&#x2F;li&gt;
&lt;li&gt;Improved documentation&lt;&#x2F;li&gt;
&lt;li&gt;Improved observability and metrics&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;resources-and-how-you-can-contribute&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resources-and-how-you-can-contribute&quot; aria-label=&quot;Anchor link for: resources-and-how-you-can-contribute&quot;&gt;Resources and how you can contribute&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p&#x2F;discussions&quot;&gt;js-libp2p Discussions&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;filecoinproject.slack.com&#x2F;archives&#x2F;C03K82MU486&quot;&gt;Slack - the libp2p-implementers channel&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;&quot;&gt;libp2p Specifications&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Thank you for reading!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>HTTP-P2P, HTTP with more Ps</title>
          <pubDate>Wed, 20 Sep 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2023-09-20-http-p2p/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2023-09-20-http-p2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2023-09-20-http-p2p/">&lt;p&gt;We&#x27;re introducing a new experimental API in go-libp2p, enabling developers to utilize libp2p with the well-known semantics of HTTP. This isn&#x27;t a special flavor of HTTP; it&#x27;s standard HTTP, but enhanced with libp2p.&lt;&#x2F;p&gt;
&lt;p&gt;Developers can now benefit from HTTP intermediaries such as CDN caching and layer 7 load balancing. This allows developers to create HTTP applications that operate over NATs and tap into libp2p&#x27;s diverse transport options.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;use-cases&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#use-cases&quot; aria-label=&quot;Anchor link for: use-cases&quot;&gt;Use Cases&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Fetch content from peers over the IPFS Path Gateway protocol, regardless of whether they&#x27;re a CDN, R2 bucket, random server, laptop, or browser&lt;&#x2F;li&gt;
&lt;li&gt;HTTP Edge compute nodes can behave as peers in the libp2p network&lt;&#x2F;li&gt;
&lt;li&gt;Simple HTTP clients like curl can participate in the libp2p network&lt;&#x2F;li&gt;
&lt;li&gt;Browsers can make secure HTTP requests using WebTransport or WebRTC&lt;&#x2F;li&gt;
&lt;li&gt;Operators can use layer 7 load balancing with projects like Envoy&lt;&#x2F;li&gt;
&lt;li&gt;Port existing HTTP applications like Mastodon or Gitea to a p2p environment&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;technical-details&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#technical-details&quot; aria-label=&quot;Anchor link for: technical-details&quot;&gt;Technical details&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This new API implements the libp2p+HTTP spec with three main features:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;a-new-http-transport&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-new-http-transport&quot; aria-label=&quot;Anchor link for: a-new-http-transport&quot;&gt;A new HTTP Transport&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A libp2p node can now listen on an HTTP transport and advertise its address as a multiaddr ending in &lt;code&gt;&#x2F;tls&#x2F;http&lt;&#x2F;code&gt; (or &lt;code&gt;&#x2F;https&lt;&#x2F;code&gt;). The HTTP transport lives alongside other transports (tcp+tls+yamux, QUIC, WebRTC, etc.).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;http-semantics&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#http-semantics&quot; aria-label=&quot;Anchor link for: http-semantics&quot;&gt;HTTP Semantics&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;HTTP semantics are the abstract form of HTTP, defined by RFC 9110. We can use WebTransport, WebRTC, or a hole-punched QUIC connection to make an HTTP request, allowing developers to create applications using familiar HTTP tools in a p2p setting.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;well-known-libp2p&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#well-known-libp2p&quot; aria-label=&quot;Anchor link for: well-known-libp2p&quot;&gt;.well-known&#x2F;libp2p&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;This solves protocol discovery in a p2p setting. A node provides information about supported protocols at the &lt;code&gt;&#x2F;.well-known&#x2F;libp2p&lt;&#x2F;code&gt; resource. For example:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt;&amp;quot;&#x2F;hello&#x2F;1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt;&amp;quot;path&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CFCFC2;&quot;&gt;&amp;quot;&#x2F;hello-path&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;}}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We&#x27;re hoping to get early feedback as the API solidifies. Please try it out and let us know what you think in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;discussions&quot;&gt;go-libp2p Discussions forum&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Adding a QUIC API for Go&#x27;s standard library TLS package</title>
          <pubDate>Wed, 13 Sep 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2023-09-13-quic-crypto-tls/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2023-09-13-quic-crypto-tls/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2023-09-13-quic-crypto-tls/">&lt;p&gt;QUIC is becoming the most important transport in libp2p. For example, QUIC accounts for 80-90% of the connections made to PL-run bootstrappers participating in the public IPFS DHT.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;quic-go&#x2F;quic-go&quot;&gt;quic-go&lt;&#x2F;a&gt; is a QUIC implementation written in pure Go that is used in go-libp2p, Caddy, Adguard, syncthing, and many other projects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quic-and-tls-1-3&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#quic-and-tls-1-3&quot; aria-label=&quot;Anchor link for: quic-and-tls-1-3&quot;&gt;QUIC and TLS 1.3&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;All QUIC connections use TLS 1.3 to encrypt messages. However, due to running on top of UDP, QUIC&#x27;s interactions with the TLS stack differs from how TLS over TCP functions.&lt;&#x2F;p&gt;
&lt;p&gt;When QUIC was standardized, it became necessary for TLS stacks to expose new APIs. For the longest time, Go&#x27;s crypto&#x2F;tls lacked an API for this purpose. The quic-go project had to fork crypto&#x2F;tls to add the required APIs.&lt;&#x2F;p&gt;
&lt;p&gt;This meant:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Extra effort every time a new Go version was released&lt;&#x2F;li&gt;
&lt;li&gt;Security fixes in crypto&#x2F;tls required updating quic-go&lt;&#x2F;li&gt;
&lt;li&gt;Lack of forwards-compatibility with future Go versions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;solving-the-problem&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#solving-the-problem&quot; aria-label=&quot;Anchor link for: solving-the-problem&quot;&gt;Solving the Problem&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To tackle this situation, we joined forces with Filippo Valsorda, who maintains crypto&#x2F;tls. Filippo is sponsored by Protocol Labs for his remarkable open-source work.&lt;&#x2F;p&gt;
&lt;p&gt;Our first joint endeavor established an API for crypto&#x2F;tls that enables QUIC implementations to use it. After long discussions, we arrived at a much cleaner proposal than our homegrown qtls API.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;0-rtt-support&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#0-rtt-support&quot; aria-label=&quot;Anchor link for: 0-rtt-support&quot;&gt;0-RTT Support&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;0-RTT allows clients to resume connections and send encrypted data in the first packet. Adding support for 0-RTT was a large endeavor requiring coordination between the TLS and QUIC stacks.&lt;&#x2F;p&gt;
&lt;p&gt;The server typically encrypts transport parameters and stores them in the session ticket. When the client restores the session, it sends the session ticket allowing the server to restore parameters without persisting them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;current-status&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#current-status&quot; aria-label=&quot;Anchor link for: current-status&quot;&gt;Current Status&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;After an intense period of collaboration, we are thrilled to have all these changes included in Go 1.21. The implementation was performed by Damien Neil and Filippo Valsorda.&lt;&#x2F;p&gt;
&lt;p&gt;The changes have been released in quic-go v0.37 and go-libp2p v0.30. We anticipate that these changes will work seamlessly once users update their dependencies and compiler version.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Testing all the libp2ps</title>
          <pubDate>Wed, 23 Aug 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/multidim-interop/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/multidim-interop/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/multidim-interop/">&lt;p&gt;There are many &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;libp2p#implementations&quot;&gt;implementations&lt;&#x2F;a&gt; of libp2p with varying degrees of feature completeness. Each implementation has transports, secure channels, and muxers that they support. How do we make sure that each implementation can communicate with every other implementation? And how do we check that they can communicate over each supported combination?&lt;&#x2F;p&gt;
&lt;p&gt;In this post I&#x27;ll cover how we test every implementation on every strategy, on many versions, and highlight some open problems that you can contribute to.&lt;&#x2F;p&gt;
&lt;p&gt;Testing connectivity interoperability is as simple as starting up two libp2p nodes and having them ping each other. The difficulty arises in how we make a reproducible environment for every implementation and connection strategy.&lt;&#x2F;p&gt;
&lt;p&gt;The first attempt used Testground, but it was too complicated and slow for what we wanted to do. The next attempt used Docker&#x27;s compose directly with some TypeScript to help generate the compose files. This was much easier to build.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problems-to-solve&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#problems-to-solve&quot; aria-label=&quot;Anchor link for: problems-to-solve&quot;&gt;Problems to solve&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Compose handles spinning up the test environment, but there were still problems to solve:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;How do we define this test environment?&lt;&#x2F;li&gt;
&lt;li&gt;How do we share the listener&#x27;s address to the dialer?&lt;&#x2F;li&gt;
&lt;li&gt;How do we build each implementation?&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;We solved the first problem with Sqlite. The problem of finding all combinations of implementations and parameters is equivalent to a Join operation.&lt;&#x2F;p&gt;
&lt;p&gt;The second problem we solved using Redis as a synchronization point. The listener pushes its address to Redis, and the dialer blocks until it can read it.&lt;&#x2F;p&gt;
&lt;p&gt;For building implementations, we use Makefiles and Docker container images with caching in S3.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;coverage&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#coverage&quot; aria-label=&quot;Anchor link for: coverage&quot;&gt;Coverage&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Right now, the system tests 6 different libp2p implementations and runs about 1700 tests. The tests are also run on each PR in Go, Rust, JS, Nim, and Zig libp2p.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;multidim-interop-coverage.png&quot; alt=&quot;Multidim Interop coverage matrix&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;See the latest full run at the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;test-plans&#x2F;actions&#x2F;workflows&#x2F;transport-interop.yml?query=branch%3Amaster&quot;&gt;GitHub Actions page&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;impact-realized-so-far&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#impact-realized-so-far&quot; aria-label=&quot;Anchor link for: impact-realized-so-far&quot;&gt;Impact realized so far&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The system has already helped catch several bugs:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;quic-go wrong cipher selection&lt;&#x2F;li&gt;
&lt;li&gt;Interop failure with Firefox WebRTC&lt;&#x2F;li&gt;
&lt;li&gt;zig-libp2p multistream-select issue&lt;&#x2F;li&gt;
&lt;li&gt;Interop issue with Yamux between rust-libp2p and js-libp2p&lt;&#x2F;li&gt;
&lt;li&gt;Wrong default Noise handshake pattern&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It has also validated big code changes like the new WebTransport transport for rust-libp2p in Wasm.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#next-steps&quot; aria-label=&quot;Anchor link for: next-steps&quot;&gt;Next steps&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;There&#x27;s still room for improvement, especially in making tests faster. The biggest optimization would be reducing the Docker overhead.&lt;&#x2F;p&gt;
&lt;p&gt;Beyond basic connectivity, we want to add tests for mDNS and test interoperability of libp2p protocols like Kademlia, GossipSub, and more.&lt;&#x2F;p&gt;
&lt;p&gt;Are you working on a libp2p implementation? Check out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;test-plans&#x2F;blob&#x2F;master&#x2F;multidim-interop&#x2F;README.md&quot;&gt;test-plans README&lt;&#x2F;a&gt; for specifics on how to implement these tests.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Metrics in go-libp2p</title>
          <pubDate>Tue, 15 Aug 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2023-08-15-metrics-in-go-libp2p/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2023-08-15-metrics-in-go-libp2p/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2023-08-15-metrics-in-go-libp2p/">&lt;p&gt;go-libp2p is the core networking component for many go-based implementations like Kubo (IPFS), Lotus (Filecoin), and Prysm (Ethereum Beacon Chain).&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ve added instrumentation to collect metrics from various components, which have already helped debug nuanced issues and develop features.&lt;&#x2F;p&gt;
&lt;p&gt;Check out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;tree&#x2F;master&#x2F;dashboards&#x2F;README.md#public-dashboards&quot;&gt;public dashboards&lt;&#x2F;a&gt; to see metrics from different libp2p components in production.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-prometheus&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-prometheus&quot; aria-label=&quot;Anchor link for: why-prometheus&quot;&gt;Why Prometheus?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We chose Prometheus over OpenCensus and OpenTelemetry because:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;OpenCensus creates a lot of allocations, leading to increased GC pressure&lt;&#x2F;li&gt;
&lt;li&gt;OpenTelemetry&#x27;s metrics API is still unstable&lt;&#x2F;li&gt;
&lt;li&gt;Prometheus is performant (zero-alloc) and ubiquitous&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We also added ready-to-use Grafana dashboards.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-to-enable-metrics&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-enable-metrics&quot; aria-label=&quot;Anchor link for: how-to-enable-metrics&quot;&gt;How to Enable Metrics&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Metrics are enabled by default since go-libp2p v0.26.0. Just setup a Prometheus exporter:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;func&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    http.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;Handle&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;&#x2F;metrics&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, promhttp.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;Handler&lt;&#x2F;span&gt;&lt;span&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;    go func&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;ListenAndServe&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;:2112&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AE81FF;&quot;&gt; nil&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    host, err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span&gt; libp2p.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;New&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;    &#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Point your Prometheus instance to scrape from &lt;code&gt;:2112&#x2F;metrics&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;discovering-available-metrics&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#discovering-available-metrics&quot; aria-label=&quot;Anchor link for: discovering-available-metrics&quot;&gt;Discovering Available Metrics&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;go-libp2p provides metrics and Grafana dashboards for all major subsystems. Check the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;tree&#x2F;master&#x2F;dashboards&quot;&gt;dashboards directory&lt;&#x2F;a&gt; for available Grafana dashboards.&lt;&#x2F;p&gt;
&lt;p&gt;To discover metrics, type &lt;code&gt;libp2p_(libp2p-package-name)_&lt;&#x2F;code&gt; in the Prometheus UI and find available metrics from autocomplete.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;metrics-in-go-libp2p-prometheus-ui.png&quot; alt=&quot;Prometheus UI&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;impact&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#impact&quot; aria-label=&quot;Anchor link for: impact&quot;&gt;Impact&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;These metrics have already helped us:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Debug AutoNAT issues&lt;&#x2F;li&gt;
&lt;li&gt;Optimize the Resource Manager&lt;&#x2F;li&gt;
&lt;li&gt;Improve connection handling&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We encourage users to deploy these dashboards and share feedback!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>libp2p at IPFS þing 2023 Recap</title>
          <pubDate>Thu, 11 May 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2023-libp2p-ipfs-thing-recap/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2023-libp2p-ipfs-thing-recap/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2023-libp2p-ipfs-thing-recap/">&lt;p&gt;Last month, April 15th - 19th 2023, the IPFS community came together in Brussels, Belgium for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.ipfs.tech&#x2F;2023-ipfs-thing-recap&#x2F;&quot;&gt;IPFS þing 2023&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The libp2p users and contributors community came out to meet up once again, interface with the broader IPFS community, and share all of the great accomplishments and new work going on in the libp2p project.&lt;&#x2F;p&gt;
&lt;p&gt;Over the course of five days the libp2p community gave 6 different talks on recent developments and finished strong with a workshop where participants built their own peer-to-peer chat application.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;goals&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#goals&quot; aria-label=&quot;Anchor link for: goals&quot;&gt;Goals&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The goals of the libp2p contributors attending IPFS þing 2023 were to:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Build excitement by demonstrating the Universal Connectivity application&lt;&#x2F;li&gt;
&lt;li&gt;Give updates on performance, dealing with non-uniform network topology, interoperability improvements, and lowering barriers to libp2p compatibility&lt;&#x2F;li&gt;
&lt;li&gt;Reconnect with community contributors and build up the greater libp2p community&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;recap-of-talks&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#recap-of-talks&quot; aria-label=&quot;Anchor link for: recap-of-talks&quot;&gt;Recap of Talks&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;connecting-everything-everywhere-all-at-once-with-libp2p&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#connecting-everything-everywhere-all-at-once-with-libp2p&quot; aria-label=&quot;Anchor link for: connecting-everything-everywhere-all-at-once-with-libp2p&quot;&gt;Connecting Everything, Everywhere, All at Once with libp2p&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Max Inden (rust-libp2p maintainer)&lt;&#x2F;p&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;4v-iIB0C9_8&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Max&#x27;s talk about the Universal Connectivity demonstrator app broke the record for the most people involved! The live demo showed a go-libp2p node talking to a rust-libp2p node talking to a laptop talking to js-libp2p browsers using a variety of transports including QUIC, WebRTC Direct, WebRTC, and WebTransport.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;libp2p-performance&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#libp2p-performance&quot; aria-label=&quot;Anchor link for: libp2p-performance&quot;&gt;libp2p Performance&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Max Inden &amp;amp; Marco Munizaga&lt;&#x2F;p&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;2h9jth3nvJw&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Watch Max and Marco describe how libp2p maintainers think about and measure performance, plus learn about some optimizations in the latest versions.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-incredible-benefits-of-libp2p-http&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-incredible-benefits-of-libp2p-http&quot; aria-label=&quot;Anchor link for: the-incredible-benefits-of-libp2p-http&quot;&gt;The Incredible Benefits of libp2p + HTTP&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Marten Seemann &amp;amp; Marco Munizaga&lt;&#x2F;p&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;Ixyo1G2tJZE&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Marten and Marco demonstrated using js-libp2p and service workers to intercept normal HTTP calls in the browser and re-route them over libp2p connections.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;how-to-build-your-own-compatible-libp2p-stack-from-scratch&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-build-your-own-compatible-libp2p-stack-from-scratch&quot; aria-label=&quot;Anchor link for: how-to-build-your-own-compatible-libp2p-stack-from-scratch&quot;&gt;How to Build Your Own Compatible libp2p Stack from Scratch&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Marten Seemann &amp;amp; Marco Munizaga&lt;&#x2F;p&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;aDHymXQJ4bs&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Marten and Marco showed how simple it is to create a compatible libp2p stack out of a QUIC library, the libp2p TLS extension and some code for peer ID encoding.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;enabling-more-applications-to-join-the-libp2p-dht-ecosystem&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#enabling-more-applications-to-join-the-libp2p-dht-ecosystem&quot; aria-label=&quot;Anchor link for: enabling-more-applications-to-join-the-libp2p-dht-ecosystem&quot;&gt;Enabling More Applications to Join the libp2p DHT Ecosystem&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Gui Michel (Research Engineer at Protocol Labs)&lt;&#x2F;p&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;OHrtv1jz2Jc&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;This talk covered improvements to the DHT to enable more applications to participate.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;workshop-build-your-own-p2p-chat&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#workshop-build-your-own-p2p-chat&quot; aria-label=&quot;Anchor link for: workshop-build-your-own-p2p-chat&quot;&gt;Workshop: Build Your Own p2p Chat&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Participants built their own peer-to-peer chat application leveraging the same technology as the Universal Connectivity demonstrator project. It was a great hands-on experience for everyone!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>go-libp2p in 2022</title>
          <pubDate>Mon, 13 Feb 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/go-libp2p-2022/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/go-libp2p-2022/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/go-libp2p-2022/">&lt;p&gt;We are excited to share with you all the progress that has been made on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&quot;&gt;go-libp2p&lt;&#x2F;a&gt; in 2022. It has been a year full of exciting new features, code organization, and a growing team of talented contributors.&lt;&#x2F;p&gt;
&lt;p&gt;Throughout the year, we released seven updates to go-libp2p ranging from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.18.0&quot;&gt;v0.18.0&lt;&#x2F;a&gt; to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.24.0&quot;&gt;v0.24.0&lt;&#x2F;a&gt;, with a number of patch releases in between. In total, we had &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;graphs&#x2F;contributors?from=2022-01-01&amp;amp;to=2022-12-31&amp;amp;type=c&quot;&gt;21 contributors&lt;&#x2F;a&gt; to the project in 2022.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;new-features&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#new-features&quot; aria-label=&quot;Anchor link for: new-features&quot;&gt;New Features&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;transport-protocols&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#transport-protocols&quot; aria-label=&quot;Anchor link for: transport-protocols&quot;&gt;Transport Protocols&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;webtransport&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webtransport&quot; aria-label=&quot;Anchor link for: webtransport&quot;&gt;WebTransport&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;One of the most exciting developments of the year was the release of the WebTransport protocol in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.23.0&quot;&gt;v0.23.0&lt;&#x2F;a&gt;. WebTransport enables browser-to-server connectivity in go-libp2p when paired with a peer running js-libp2p-webtransport in the browser.&lt;&#x2F;p&gt;
&lt;p&gt;To learn more about this exciting feature, check out our blog post on &lt;a href=&quot;&#x2F;blog&#x2F;2022-12-19-libp2p-webtransport&quot;&gt;WebTransport in libp2p&lt;&#x2F;a&gt; and the &lt;a href=&quot;&#x2F;guides&#x2F;webtransport&#x2F;&quot;&gt;WebTransport documentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;webrtc-browser-to-server&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webrtc-browser-to-server&quot; aria-label=&quot;Anchor link for: webrtc-browser-to-server&quot;&gt;WebRTC (Browser to Server)&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;In addition to WebTransport, the go-libp2p team also began work on enabling the WebRTC transport, in partnership with Little Bear Labs. This new transport allows for connectivity between go-libp2p server nodes and js-libp2p browser nodes.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;quic-versions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#quic-versions&quot; aria-label=&quot;Anchor link for: quic-versions&quot;&gt;QUIC Versions&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;We also made developments to the existing QUIC implementation in go-libp2p. In &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.24.0&quot;&gt;v0.24.0&lt;&#x2F;a&gt;, go-libp2p changed to properly distinguish between QUIC versions (in their multiaddresses) and changed the default dial behavior to prefer the new QUIC version.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dos-protection-resource-management&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dos-protection-resource-management&quot; aria-label=&quot;Anchor link for: dos-protection-resource-management&quot;&gt;DoS Protection &amp;amp; Resource Management&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We added the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;tree&#x2F;master&#x2F;p2p&#x2F;host&#x2F;resource-manager#readme&quot;&gt;Resource Manager component&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.18.0&quot;&gt;v0.18.0&lt;&#x2F;a&gt;. This feature allows developers to configure limits on connections, streams, and memory usage.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;faster-handshakes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#faster-handshakes&quot; aria-label=&quot;Anchor link for: faster-handshakes&quot;&gt;Faster Handshakes&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.24.0&quot;&gt;v0.24.0&lt;&#x2F;a&gt;, go-libp2p added optimized muxer selection via TLS&#x27; ALPN extension and Noise extensions. This resulted in saving one round trip during connection establishment.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;autorelay-discovers-circuit-relay-v2&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#autorelay-discovers-circuit-relay-v2&quot; aria-label=&quot;Anchor link for: autorelay-discovers-circuit-relay-v2&quot;&gt;AutoRelay discovers Circuit Relay v2&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.19.0&quot;&gt;v0.19.0&lt;&#x2F;a&gt;, we enabled AutoRelay to discover nodes running Circuit Relay v2, improving the overall performance and reliability of the network.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-improvements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#project-improvements&quot; aria-label=&quot;Anchor link for: project-improvements&quot;&gt;Project Improvements&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;interoperability-testing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#interoperability-testing&quot; aria-label=&quot;Anchor link for: interoperability-testing&quot;&gt;Interoperability Testing&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We began a concerted effort to improve interoperability between go-libp2p and libp2p implementations in other languages. The details can be seen in the shared &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;test-plans&#x2F;blob&#x2F;master&#x2F;ROADMAP.md&quot;&gt;libp2p&#x2F;test-plans Roadmap&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;monorepo-consolidation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#monorepo-consolidation&quot; aria-label=&quot;Anchor link for: monorepo-consolidation&quot;&gt;Monorepo Consolidation&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;go-libp2p is a monorepo as of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.22.0&quot;&gt;v0.22.0 release&lt;&#x2F;a&gt;.&lt;&#x2F;strong&gt; This improvement makes changes and improvements across go-libp2p much easier.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;plans-for-2023&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#plans-for-2023&quot; aria-label=&quot;Anchor link for: plans-for-2023&quot;&gt;Plans for 2023&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Key areas of focus:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Interoperability and end-to-end testing&lt;&#x2F;li&gt;
&lt;li&gt;Expanding seamless browser connectivity&lt;&#x2F;li&gt;
&lt;li&gt;Adding support for libp2p + HTTP&lt;&#x2F;li&gt;
&lt;li&gt;Optimizing performance&lt;&#x2F;li&gt;
&lt;li&gt;Better observability with metrics&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;resources-and-how-you-can-help-contribute&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resources-and-how-you-can-help-contribute&quot; aria-label=&quot;Anchor link for: resources-and-how-you-can-help-contribute&quot;&gt;Resources and how you can help contribute&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We always welcome contributions from the community! Check out &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&#x2F;issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22&quot;&gt;any of these help wanted&#x2F;good first issues&lt;&#x2F;a&gt; to start contributing.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you for reading!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>WebRTC (Browser-to-Server) in libp2p</title>
          <pubDate>Mon, 06 Feb 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/libp2p-webrtc-browser-to-server/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/libp2p-webrtc-browser-to-server/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/libp2p-webrtc-browser-to-server/">&lt;p&gt;This is the second entry in the Universal Browser Connectivity series on how libp2p achieves browser connectivity. Read about WebTransport in the &lt;a href=&quot;&#x2F;blog&#x2F;2022-12-19-libp2p-webtransport&quot;&gt;first post&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#overview&quot; aria-label=&quot;Anchor link for: overview&quot;&gt;Overview&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a href=&quot;&#x2F;&quot;&gt;libp2p project&lt;&#x2F;a&gt; supports many transport protocols across a variety of implementations. These transport protocols enable applications using libp2p to run as server nodes (on a personal laptop or in a datacenter) or as browser nodes (inside a Web browser).&lt;&#x2F;p&gt;
&lt;p&gt;Historically, libp2p has bridged these runtime environments with different node connectivity options in varying degrees:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;server node to server node via TCP and QUIC&lt;&#x2F;li&gt;
&lt;li&gt;browser node to public server node via WebSockets and, more recently, &lt;a href=&quot;&#x2F;blog&#x2F;2022-12-19-libp2p-webtransport&quot;&gt;WebTransport&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;browser node to browser node (via less than ideal solutions)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Today our focus is on advancements in the &lt;strong&gt;browser to public server&lt;&#x2F;strong&gt; use case...&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;re excited to present a new paradigm for browser-to-server connectivity and announce, &lt;strong&gt;native support for WebRTC now exists in libp2p across three implementations!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#acknowledgements&quot; aria-label=&quot;Anchor link for: acknowledgements&quot;&gt;Acknowledgements&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We would like to recognize and express our gratitude to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;littlebearlabs.io&#x2F;&quot;&gt;Little Bear Labs&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.parity.io&#x2F;&quot;&gt;Parity Technologies&lt;&#x2F;a&gt; for their contributions to the development of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;tree&#x2F;master&#x2F;webrtc&quot;&gt;WebRTC specification&lt;&#x2F;a&gt; and implementation in libp2p.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;webrtc-in-the-browser&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webrtc-in-the-browser&quot; aria-label=&quot;Anchor link for: webrtc-in-the-browser&quot;&gt;WebRTC in the browser&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;WebRTC, or Web Real-Time Communication, is a set of standards that enables peer-to-peer connections between browsers, clients, and servers and the exchange of audio, video, and data in real-time. It is built directly into modern browsers and is straightforward to use via its API.&lt;&#x2F;p&gt;
&lt;p&gt;While WebRTC handles audio, video, and data traffic, we&#x27;re just going to focus on the data aspect because that&#x27;s the API leveraged in libp2p WebRTC.&lt;&#x2F;p&gt;
&lt;p&gt;In most cases, peers directly connect to other peers, improving privacy and requiring fewer hops than on a relay. Peers connect via an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;RTCPeerConnection&quot;&gt;RTCPeerConnection&lt;&#x2F;a&gt; interface. Once connected, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;RTCDataChannel&quot;&gt;RTCDataChannels&lt;&#x2F;a&gt; can be added to the connection to send and receive binary data.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;webrtc-in-libp2p&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webrtc-in-libp2p&quot; aria-label=&quot;Anchor link for: webrtc-in-libp2p&quot;&gt;WebRTC in libp2p&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;webrtc_browser_to_server_diagram.png&quot; alt=&quot;WebRTC Browser to Server Diagram&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Connecting from a browser to a public server in the WebRTC implementation in libp2p has some similarities but differs in several ways. Many of the features supported in the WebRTC standard, such as video, audio, and centralized STUN and Turn servers, are not needed in libp2p. The primary WebRTC component that libp2p leverages is the RTCDataChannels.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;server-setup&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#server-setup&quot; aria-label=&quot;Anchor link for: server-setup&quot;&gt;Server Setup&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;To prepare for a connection from the browser, the server:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Generates a self-signed TLS certificate.&lt;&#x2F;li&gt;
&lt;li&gt;Listens on a UDP port for incoming STUN packets.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;browser-connection&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#browser-connection&quot; aria-label=&quot;Anchor link for: browser-connection&quot;&gt;Browser Connection&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;To initiate a connection, the browser:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Assembles the multiaddress of the server, which is either known upfront or discovered.&lt;&#x2F;li&gt;
&lt;li&gt;Creates an RTCPeerConnection.&lt;&#x2F;li&gt;
&lt;li&gt;Generates the server&#x27;s Answer SDP using the components in the multiaddress.&lt;&#x2F;li&gt;
&lt;li&gt;Modifies the SDP, or &quot;munges&quot; it, to include an auto-generated ufrag and password, as well as the server&#x27;s IP and port.&lt;&#x2F;li&gt;
&lt;li&gt;Creates an Offer SDP and modifies it with the same values.&lt;&#x2F;li&gt;
&lt;li&gt;Sets the Offer and Answer SDP on the browser, which triggers the sending of STUN packets to the server.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;server-response&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#server-response&quot; aria-label=&quot;Anchor link for: server-response&quot;&gt;Server Response&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The server responds by creating the browser&#x27;s Offer SDP using the values in the STUN Binding Request.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dtls-handshake&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dtls-handshake&quot; aria-label=&quot;Anchor link for: dtls-handshake&quot;&gt;DTLS Handshake&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The browser and server then engage in a DTLS handshake to open a DTLS connection that WebRTC can run SCTP on top of. A &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;blob&#x2F;master&#x2F;noise&#x2F;README.md&quot;&gt;Noise handshake&lt;&#x2F;a&gt; is initiated by the server using the fingerprints in the SDP as input to the prologue data, and completed by the browser over the Data Channel.&lt;&#x2F;p&gt;
&lt;p&gt;Once the DTLS and Noise handshakes are complete, DTLS-encrypted SCTP data is ready to be exchanged over the UDP socket.&lt;&#x2F;p&gt;









    
    




&lt;div class=&quot;alert alert--tip&quot;&gt;
    &lt;span class=&quot;alert__icon&quot;&gt;&amp;#128161;&lt;&#x2F;span&gt;
    &lt;div class=&quot;alert__content&quot;&gt;
        
        Unlike standard WebRTC, signaling is completely removed in libp2p browser-to-server communication, and Signal Channels are not needed. Removing signaling results in fewer roundtrips to establish a Data Channel and reduces complexity.
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h3 id=&quot;multiaddress&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#multiaddress&quot; aria-label=&quot;Anchor link for: multiaddress&quot;&gt;Multiaddress&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The multiaddress of a WebRTC address begins like a standard UDP address, but adds three additional protocols: &lt;code&gt;webrtc&lt;&#x2F;code&gt;, &lt;code&gt;hash&lt;&#x2F;code&gt;, and &lt;code&gt;p2p&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;ip4&#x2F;1.2.3.4&#x2F;udp&#x2F;1234&#x2F;webrtc&#x2F;certhash&#x2F;&amp;lt;hash&amp;gt;&#x2F;p2p&#x2F;&amp;lt;peer-id&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;webrtc&lt;&#x2F;code&gt;: the name of this transport&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;hash&lt;&#x2F;code&gt;: the multihash of the certificate used in the DTLS handshake&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;p2p&lt;&#x2F;code&gt;: the peer-id of the libp2p node (optional)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;benefits&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#benefits&quot; aria-label=&quot;Anchor link for: benefits&quot;&gt;Benefits&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;self-signed-certificate&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#self-signed-certificate&quot; aria-label=&quot;Anchor link for: self-signed-certificate&quot;&gt;Self-signed Certificate&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;WebRTC enables browsers to connect to public libp2p nodes without the nodes requiring a TLS certificate in the browser&#x27;s certificate chain. WebRTC allows the server to use a self-signed TLS certificate, eliminating the need for additional services like DNS and Let&#x27;s Encrypt.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;broad-support&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#broad-support&quot; aria-label=&quot;Anchor link for: broad-support&quot;&gt;Broad support&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;WebRTC has been supported in Chrome since 2012, and support has since been added to all evergreen browsers. This makes WebRTC widely available and easy to implement in libp2p.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;limitations&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#limitations&quot; aria-label=&quot;Anchor link for: limitations&quot;&gt;Limitations&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;setup-and-configuration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#setup-and-configuration&quot; aria-label=&quot;Anchor link for: setup-and-configuration&quot;&gt;Setup and configuration&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;WebRTC is a complex set of technologies that requires extensive server setup and configuration. While libraries like Pion and webrtc-rs abstract away this functionality, the additional complexity introduced and the configuration fine-tuning required can be a drawback for some users.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;extensive-roundtrips&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#extensive-roundtrips&quot; aria-label=&quot;Anchor link for: extensive-roundtrips&quot;&gt;Extensive Roundtrips&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;Another limitation is the 6 roundtrips required before data is exchanged. This may make other transports, such as WebTransport, more appealing where the browser supports it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;usage&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#usage&quot; aria-label=&quot;Anchor link for: usage&quot;&gt;Usage&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The complexity of WebRTC is abstracted in the libp2p implementations, making it easy to swap in WebRTC as the transport. In the JavaScript implementation, for example, all you need to do is initialize with:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; { webRTC }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt; &amp;#39;js-libp2p-webrtc&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; node&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; = await&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt; createLibp2p&lt;&#x2F;span&gt;&lt;span&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  transports: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt;webRTC&lt;&#x2F;span&gt;&lt;span&gt;()],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  connectionEncryption: [()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #66D9EF;font-style: italic;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E22E;&quot;&gt; Noise&lt;&#x2F;span&gt;&lt;span&gt;()],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;});&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;alternative-transports&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#alternative-transports&quot; aria-label=&quot;Anchor link for: alternative-transports&quot;&gt;Alternative transports&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;WebRTC is just one option for connecting browsers to libp2p nodes. libp2p supports a variety of transports, and choosing the right one for your use case is an important consideration. The &lt;a href=&quot;&#x2F;guides&#x2F;browser-connectivity&quot;&gt;libp2p connectivity guide&lt;&#x2F;a&gt; was designed to help developers consider the available options.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;websocket&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#websocket&quot; aria-label=&quot;Anchor link for: websocket&quot;&gt;WebSocket&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The WebSocket protocol allows for the opening of a two-way socket between a browser and a server over TCP. One limitation of WebSocket is the number of roundtrips required to establish a connection—up to six roundtrips. Additionally, WebSocket requires the server to have a trusted TLS certificate using TCP, unlike WebRTC which can use a self-signed certificate.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;webtransport&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#webtransport&quot; aria-label=&quot;Anchor link for: webtransport&quot;&gt;WebTransport&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;blog&#x2F;2022-12-19-libp2p-webtransport&quot;&gt;WebTransport&lt;&#x2F;a&gt; is the new kid on the block for communication in the browser. WebTransport has many of the same benefits as WebRTC, such as fast, secure, and multiplexed connections, without requiring servers to implement the stack. Additionally, WebTransport requires fewer roundtrips to establish a connection than WebRTC, making it the preferred choice when supported.&lt;&#x2F;p&gt;
&lt;p&gt;Currently, it is only implemented in Chrome and is still under development. Until WebTransport is supported by all major browsers, WebRTC can serve as a good fallback option.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;can-i-use-webrtc-now&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#can-i-use-webrtc-now&quot; aria-label=&quot;Anchor link for: can-i-use-webrtc-now&quot;&gt;Can I use WebRTC now?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Yes, you can use libp2p-webrtc in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;rust-libp2p&#x2F;tree&#x2F;master&#x2F;transports&#x2F;webrtc&quot;&gt;Rust&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p-webrtc&quot;&gt;JavaScript&lt;&#x2F;a&gt; implementations! The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;go-libp2p&quot;&gt;Go&lt;&#x2F;a&gt; implementation is also available.&lt;&#x2F;p&gt;
&lt;p&gt;For how to use WebRTC browser-to-server, you can take a look at the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;js-libp2p-webrtc&#x2F;tree&#x2F;main&#x2F;examples&#x2F;browser-to-server&quot;&gt;examples in the js-libp2p-webrtc repo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-next&quot; aria-label=&quot;Anchor link for: what-s-next&quot;&gt;What&#x27;s next?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;WebRTC offers the capability for browsers to connect to browsers. The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;pull&#x2F;497&quot;&gt;WebRTC browser-to-browser connectivity spec&lt;&#x2F;a&gt; has been authored and development is underway.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;resources-and-how-you-can-help-contribute&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resources-and-how-you-can-help-contribute&quot; aria-label=&quot;Anchor link for: resources-and-how-you-can-help-contribute&quot;&gt;Resources and how you can help contribute&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;guides&#x2F;webrtc-browser-connectivity&#x2F;&quot;&gt;WebRTC Docs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;guides&#x2F;browser-connectivity#webrtc&quot;&gt;WebRTC Connectivity&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;tree&#x2F;master&#x2F;webrtc&quot;&gt;WebRTC Spec&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If you would like to contribute, please &lt;a href=&quot;&#x2F;get-involved&#x2F;&quot;&gt;connect with the libp2p maintainers&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you for reading!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>rust-libp2p in 2022</title>
          <pubDate>Thu, 12 Jan 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2023-01-12-rust-libp2p-in-2022/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2023-01-12-rust-libp2p-in-2022/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2023-01-12-rust-libp2p-in-2022/">&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;rust-libp2p&quot;&gt;rust-libp2p&lt;&#x2F;a&gt; project has made significant strides in 2022, with numerous technical advancements and improvements to the project itself. This is the work of many across various organizations including Protocol Labs, Parity Technologies, Sigma Prime, Iroh, Actyx and Little Bear Labs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;technical-highlights&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#technical-highlights&quot; aria-label=&quot;Anchor link for: technical-highlights&quot;&gt;Technical Highlights&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;decentralized-hole-punching&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#decentralized-hole-punching&quot; aria-label=&quot;Anchor link for: decentralized-hole-punching&quot;&gt;Decentralized Hole Punching&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;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. These features were all included together in rust-libp2p &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;rust-libp2p&#x2F;releases&#x2F;tag&#x2F;v0.43.0&quot;&gt;v0.43.0&lt;&#x2F;a&gt; released in February.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;new-transports&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#new-transports&quot; aria-label=&quot;Anchor link for: new-transports&quot;&gt;New Transports&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Over the year we worked on two new transports: WebRTC (browser-to-server) and QUIC, which we both released towards the end of the year as alpha&#x2F;experimental features.&lt;&#x2F;p&gt;
&lt;p&gt;Our implementation of WebRTC enables browsers to connect to rust-libp2p based servers 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.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;user-experience-improvements&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#user-experience-improvements&quot; aria-label=&quot;Anchor link for: user-experience-improvements&quot;&gt;User Experience Improvements&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We tackled many smaller improvements including naming consistency across crates, refactoring of event handlers, deprecation of event-based &lt;code&gt;PollParameters&lt;&#x2F;code&gt;, rework of Rust feature flags, and removal of listener streams in favor of polling transports directly.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dos-protection&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dos-protection&quot; aria-label=&quot;Anchor link for: dos-protection&quot;&gt;DoS Protection&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;rust-libp2p saw a lot of DoS protection improvements in 2022. We enforce various limits and prioritize local work over new incoming work from a remote across the many layers.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;metrics-and-observability&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#metrics-and-observability&quot; aria-label=&quot;Anchor link for: metrics-and-observability&quot;&gt;Metrics and Observability&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We introduced a metric crate for rust-libp2p exposing Prometheus metrics, e.g. the time to establish a connection or the protocols supported by peers.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;meta-improvements-to-the-project&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#meta-improvements-to-the-project&quot; aria-label=&quot;Anchor link for: meta-improvements-to-the-project&quot;&gt;Meta - Improvements to the Project&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The core rust-libp2p maintainer team grew from two engineers to four. Beyond the core maintainers, a total of 36 people contributed to rust-libp2p&#x27;s &lt;code&gt;master&lt;&#x2F;code&gt; branch in 2022.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;automation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#automation&quot; aria-label=&quot;Anchor link for: automation&quot;&gt;Automation&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;We invested heavily into rust-libp2p&#x27;s automation including mergify, &lt;code&gt;cargo-semver-checks&lt;&#x2F;code&gt;, conventional commits, and refactored CI job structure.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;interoperability&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#interoperability&quot; aria-label=&quot;Anchor link for: interoperability&quot;&gt;Interoperability&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;As of September 2022, we continuously test that the various versions of go-libp2p and rust-libp2p can connect.&lt;&#x2F;p&gt;
&lt;p&gt;In 2022 we published 9 releases of the main &lt;code&gt;libp2p&lt;&#x2F;code&gt; crate and a total of 268 releases across the workspace.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-next&quot; aria-label=&quot;Anchor link for: what-s-next&quot;&gt;What&#x27;s Next?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Check out the rust-libp2p &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;rust-libp2p&#x2F;blob&#x2F;master&#x2F;ROADMAP.md&quot;&gt;project roadmap&lt;&#x2F;a&gt; for planned developments including improved WASM support, WebRTC browser-to-browser, and WebTransport.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>libp2p &amp; Ethereum (the Merge)</title>
          <pubDate>Fri, 06 Jan 2023 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/libp2p-and-ethereum/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/libp2p-and-ethereum/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/libp2p-and-ethereum/">&lt;p&gt;If you&#x27;ve kept up with developments in Web3, you&#x27;ve likely heard of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ethereum&#x2F;execution-specs&#x2F;blob&#x2F;master&#x2F;network-upgrades&#x2F;mainnet-upgrades&#x2F;paris.md&quot;&gt;Paris upgrade&lt;&#x2F;a&gt;, more widely known as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ethereum.org&#x2F;en&#x2F;upgrades&#x2F;merge&#x2F;&quot;&gt;The Merge&lt;&#x2F;a&gt;, on the Ethereum network.&lt;&#x2F;p&gt;
&lt;p&gt;You may be wondering... why is the libp2p blog writing about Ethereum and the Merge?&lt;&#x2F;p&gt;
&lt;p&gt;Well, as a result of the Merge, we&#x27;re excited to share that:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;libp2p is integrated into the Ethereum network!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-brief-history-of-libp2p&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-brief-history-of-libp2p&quot; aria-label=&quot;Anchor link for: a-brief-history-of-libp2p&quot;&gt;A Brief History of libp2p&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Protocol Labs first developed libp2p as a networking library inside of IPFS. At the outset, their code and repositories were coupled. However, Protocol Labs soon realized libp2p&#x27;s potential and utility beyond IPFS, and project maintainers split the two codebases apart.&lt;&#x2F;p&gt;
&lt;p&gt;As a result, the libp2p project saw tremendous growth and adoption. Besides IPFS and Filecoin, libp2p is relied on by networks like Polkadot, Polygon, Mina, Celestia, Flow, and many more.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-merge&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-merge&quot; aria-label=&quot;Anchor link for: the-merge&quot;&gt;The Merge&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Ethereum&#x27;s genesis occurred on July 30, 2015 as a part of a milestone called Frontier. The most recent (and arguably the most anticipated) upgrade was Paris, a.k.a. The Merge, executed on September 15, 2022.&lt;&#x2F;p&gt;
&lt;p&gt;The Merge encompassed major changes:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Upgrading the consensus mechanism&lt;&#x2F;strong&gt; - Transitioning to proof-of-stake, away from proof-of-work&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Reducing network energy consumption by 99.95%&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Integrating libp2p&lt;&#x2F;strong&gt; into the mainnet&#x27;s networking layer&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;how-libp2p-was-integrated-into-ethereum&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-libp2p-was-integrated-into-ethereum&quot; aria-label=&quot;Anchor link for: how-libp2p-was-integrated-into-ethereum&quot;&gt;How libp2p was integrated into Ethereum&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In the early days of Ethereum and libp2p, libp2p didn&#x27;t exist when Ethereum was first developed, so it never got a chance to be evaluated and&#x2F;or adopted.&lt;&#x2F;p&gt;
&lt;p&gt;Prior to the Merge, Ethereum solely used devp2p, a dedicated networking stack. Though there were talks between the Ethereum and IPFS&#x2F;libp2p communities to have one solution instead of two, the timing didn&#x27;t work.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;early-days-2016-2017&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#early-days-2016-2017&quot; aria-label=&quot;Anchor link for: early-days-2016-2017&quot;&gt;Early Days (2016-2017)&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;At Devcon 2, David Dias from Protocol Labs gave a talk titled &quot;libp2p ❤ devp2p: IPFS and Ethereum Networking&quot;. He gave an overview of libp2p and demonstrated running the EVM in a browser connecting to a go-ethereum node using libp2p.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;eth-libp2p-2016.png&quot; alt=&quot;Early libp2p and Ethereum collaboration&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-integration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-integration&quot; aria-label=&quot;Anchor link for: the-integration&quot;&gt;The Integration&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The integration of libp2p into Ethereum came through the new consensus layer (beacon chain) that powers proof-of-stake. Beacon nodes use libp2p for peer discovery, establishing connections, and exchanging messages.&lt;&#x2F;p&gt;
&lt;p&gt;This is the work of many across various organizations including the Ethereum Foundation, Prysmatic Labs, Sigma Prime, ChainSafe, Status.im, and Protocol Labs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-ethereum-beacon-nodes-use-libp2p&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-ethereum-beacon-nodes-use-libp2p&quot; aria-label=&quot;Anchor link for: how-ethereum-beacon-nodes-use-libp2p&quot;&gt;How Ethereum Beacon Nodes use libp2p&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Beacon nodes use libp2p in several ways:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Peer Discovery&lt;&#x2F;strong&gt;: Using discv5 for discovery and libp2p for connections&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GossipSub&lt;&#x2F;strong&gt;: For propagating blocks and attestations&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Request&#x2F;Response&lt;&#x2F;strong&gt;: For syncing and specific data requests&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The integration of libp2p into Ethereum represents years of collaboration between the communities. It demonstrates the power of open-source development and the value of modular, reusable networking libraries.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;re excited about this milestone and look forward to continued collaboration with the Ethereum community!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>WebTransport in libp2p</title>
          <pubDate>Mon, 19 Dec 2022 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2022-12-19-libp2p-webtransport/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2022-12-19-libp2p-webtransport/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2022-12-19-libp2p-webtransport/">&lt;p&gt;This is the first entry in a series of posts on how libp2p achieves browser connectivity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#overview&quot; aria-label=&quot;Anchor link for: overview&quot;&gt;Overview&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Seamless browser connectivity is a crucial goal of the &lt;a href=&quot;&#x2F;&quot;&gt;libp2p project&lt;&#x2F;a&gt;. Over many years, libp2p has made many strides to realize that vision. Today, we are proud to announce a significant milestone that puts us much closer to that aim:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;libp2p now supports the new, bleeding-edge WebTransport protocol!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In this article, we:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Introduce WebTransport&lt;&#x2F;li&gt;
&lt;li&gt;Show what it means for apps and how you can use it today&lt;&#x2F;li&gt;
&lt;li&gt;Explain its advantages over existing solutions&lt;&#x2F;li&gt;
&lt;li&gt;Give you a deep dive into how it works&lt;&#x2F;li&gt;
&lt;li&gt;Describe the current state of WebTransport (specs and implementations)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;what-is-webtransport&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-is-webtransport&quot; aria-label=&quot;Anchor link for: what-is-webtransport&quot;&gt;What is WebTransport?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;At a high level, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;webtransport&#x2F;&quot;&gt;WebTransport&lt;&#x2F;a&gt; is a new &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;osi-model.com&#x2F;transport-layer&#x2F;&quot;&gt;transport protocol&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&quot;&gt;Web API&lt;&#x2F;a&gt; currently under development by both the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ietf.org&#x2F;&quot;&gt;Internet Engineering Task Force (IETF)&lt;&#x2F;a&gt; and the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;&quot;&gt;World Wide Web Consortium (W3C)&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;WebTransport is developing to meet &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;w3c&#x2F;webtransport&#x2F;blob&#x2F;main&#x2F;explainer.md#goals&quot;&gt;these goals&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Enable low latency communication between browsers and servers (efficiently transfer data and decrease travel time from browser to server).&lt;&#x2F;li&gt;
&lt;li&gt;Have an API that supports different protocols and use cases (e.g., reliable&#x2F;unreliable and ordered&#x2F;unordered data transmission, client-server and peer-to-peer architectures, transmitting audio&#x2F;video media as well as generic data).&lt;&#x2F;li&gt;
&lt;li&gt;Have the same security properties as current solutions (e.g., WebSocket over TLS.)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With these goals in mind, WebTransport seeks to address a multitude of use cases, including browser gaming, live streaming, multimedia applications, and more.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;websocket-the-old-solution-and-its-challenges&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#websocket-the-old-solution-and-its-challenges&quot; aria-label=&quot;Anchor link for: websocket-the-old-solution-and-its-challenges&quot;&gt;WebSocket: The old solution and its challenges&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Before we delve deeper, let&#x27;s reflect on the history of browser connectivity in libp2p. How did libp2p browser nodes connect to server nodes before the advent of WebTransport, and what challenges existed when bridging browsers to the libp2p ecosystem?&lt;&#x2F;p&gt;
&lt;p&gt;Browsers dial &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Transmission_Control_Protocol&quot;&gt;TCP&lt;&#x2F;a&gt; connections (for HTTP 1.1 and HTTP&#x2F;2) and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rfc-editor.org&#x2F;rfc&#x2F;rfc9000.html&quot;&gt;QUIC&lt;&#x2F;a&gt; connections (for HTTP&#x2F;3) all the time. However, there&#x27;s no way to &lt;em&gt;just&lt;&#x2F;em&gt; dial a TCP or QUIC connection and use it for things other than HTTP.&lt;&#x2F;p&gt;
&lt;p&gt;This posed a problem when integrating browser applications with libp2p. libp2p is built on top of a bidirectional, asynchronous stream abstraction, whereas HTTP is a stateless, unidirectional, synchronous request-response protocol.&lt;&#x2F;p&gt;
&lt;p&gt;Therefore, for the longest time, the only way to connect a libp2p client running in the browser to the rest of the network was using the somewhat dated &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rfc-editor.org&#x2F;rfc&#x2F;rfc6455&quot;&gt;WebSocket protocol&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;WebSocket has multiple drawbacks:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Slow time to connect&lt;&#x2F;strong&gt;: It takes six network roundtrips until the libp2p connection is finally established because of the steps involved in establishing a WebSocket connection.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Inefficiency&lt;&#x2F;strong&gt;: We&#x27;re double-encrypting the data: The first time, it&#x27;s encrypted on the outer (HTTPS) connection, and then again by the libp2p security protocol.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Increased latency&lt;&#x2F;strong&gt;: There&#x27;s no native stream multiplexing in WebSocket, and each internal stream can suffer from head-of-line blocking.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In practice, a different obstacle prevented WebSocket from achieving widespread deployment in libp2p. When a browser connects to a website, in practically all cases, it does so via HTTPS. This means that the server needs a valid TLS certificate signed by a Certificate Authority like Let&#x27;s Encrypt.&lt;&#x2F;p&gt;
&lt;p&gt;However, most libp2p nodes don&#x27;t have such a certificate. This is because libp2p nodes constitute a decentralized peer-to-peer network where participants can run nodes on home laptops or browsers and join or leave the network at will. Most nodes don&#x27;t even possess a domain name.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;meet-webtransport&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#meet-webtransport&quot; aria-label=&quot;Anchor link for: meet-webtransport&quot;&gt;Meet WebTransport&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Thankfully, WebTransport addresses almost all of the pain points when using WebSocket!&lt;&#x2F;p&gt;
&lt;p&gt;Conceptually, WebTransport is similar to WebSocket, although it&#x27;s a new protocol on the wire. The browser can &quot;upgrade&quot; an HTTP&#x2F;2 or an HTTP&#x2F;3 connection to a &lt;strong&gt;WebTransport session&lt;&#x2F;strong&gt;. HTTP&#x2F;3 runs on top of QUIC. A WebTransport session over HTTP&#x2F;3 allows both endpoints to open (very thinly wrapped) QUIC streams to each other. This enables WebTransport to take advantage of QUIC&#x27;s offerings:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Speedy time to connect using a fast handshake (just one network roundtrip)&lt;&#x2F;li&gt;
&lt;li&gt;Native stream multiplexing without head-of-line blocking&lt;&#x2F;li&gt;
&lt;li&gt;Advanced loss recovery and congestion control&lt;&#x2F;li&gt;
&lt;li&gt;Low latency communication and unordered and unreliable delivery of data&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;certificate-hash-verification&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#certificate-hash-verification&quot; aria-label=&quot;Anchor link for: certificate-hash-verification&quot;&gt;Certificate Hash Verification&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The most critical change for our peer-to-peer use case is the new verification option. The WebTransport browser API allows for two distinct modes:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Verification of the TLS certificate chain&lt;&#x2F;strong&gt;: This is precisely what the browser does when checking the certificate for any website it connects to.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Verification of the TLS certificate hash&lt;&#x2F;strong&gt;: The browser will trust the server if the hash of the certificate used during the handshake matches its expected hash.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Option (2) allows us to use WebTransport on &lt;em&gt;any&lt;&#x2F;em&gt; libp2p node without manual configuration!&lt;&#x2F;p&gt;
&lt;p&gt;It works because when setting up a WebTransport server, the libp2p node will generate a self-signed TLS certificate and calculate the certificate hash. It then advertises the following &lt;a href=&quot;&#x2F;guides&#x2F;addressing&#x2F;&quot;&gt;multiaddress&lt;&#x2F;a&gt; to the network:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;&#x2F;ip4&#x2F;1.2.3.4&#x2F;udp&#x2F;4001&#x2F;quic&#x2F;webtransport&#x2F;certhash&#x2F;&amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;certhash&lt;&#x2F;code&gt; component of the multiaddress tells the browser the certificate hash, allowing it to establish the WebTransport connection successfully.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;deep-dive-how-webtransport-works&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#deep-dive-how-webtransport-works&quot; aria-label=&quot;Anchor link for: deep-dive-how-webtransport-works&quot;&gt;Deep dive: How WebTransport works&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;The browser dials a regular HTTP&#x2F;3 connection to the server, verifying the certificate either by its chain of trust or by the certificate&#x27;s hash.&lt;&#x2F;li&gt;
&lt;li&gt;The browser sends an &lt;code&gt;Extended CONNECT&lt;&#x2F;code&gt; request on an HTTP&#x2F;3 stream, requesting establishing a WebTransport session. If the server sends a &lt;code&gt;200&lt;&#x2F;code&gt; HTTP status, the WebTransport session is successfully established.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;WebTransport-blog-post-diagram-1.png&quot; alt=&quot;WebTransport Diagram&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Both sides can now open streams (both bidirectional and unidirectional) and send (unreliable) HTTP datagrams.&lt;&#x2F;p&gt;
&lt;p&gt;In libp2p, we still need to verify the libp2p peer IDs, so we&#x27;re not entirely done yet. The browser opens a new WebTransport stream and starts a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;noiseprotocol.org&#x2F;noise.html&quot;&gt;Noise&lt;&#x2F;a&gt; handshake. This is the same handshake we use to secure connections on top of TCP in libp2p.&lt;&#x2F;p&gt;
&lt;p&gt;Therefore, setting up a WebTransport connection in libp2p takes no more than &lt;strong&gt;three network roundtrips&lt;&#x2F;strong&gt;. Compare that to the six roundtrips we needed for WebSocket!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;limitations&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#limitations&quot; aria-label=&quot;Anchor link for: limitations&quot;&gt;Limitations&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;WebTransport does not support browser-to-browser connectivity. To meet this need, libp2p implementations are adding support for WebRTC browser-to-server connectivity and browser-to-browser connectivity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-the-current-state-of-webtransport-and-where-is-it-supported&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-s-the-current-state-of-webtransport-and-where-is-it-supported&quot; aria-label=&quot;Anchor link for: what-s-the-current-state-of-webtransport-and-where-is-it-supported&quot;&gt;What&#x27;s the current state of WebTransport, and where is it supported?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;state-of-specifications&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#state-of-specifications&quot; aria-label=&quot;Anchor link for: state-of-specifications&quot;&gt;State of Specifications&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The IETF specification of the protocol itself is still in the draft stage with ongoing revisions. The libp2p specification is here: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;tree&#x2F;master&#x2F;webtransport&quot;&gt;libp2p WebTransport spec&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;state-in-browsers&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#state-in-browsers&quot; aria-label=&quot;Anchor link for: state-in-browsers&quot;&gt;State in Browsers&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Currently, WebTransport support is limited to Chromium browsers. See the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;caniuse.com&#x2F;webtransport&quot;&gt;Can I Use? page for more details&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;state-in-libp2p-implementations&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#state-in-libp2p-implementations&quot; aria-label=&quot;Anchor link for: state-in-libp2p-implementations&quot;&gt;State in libp2p implementations&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;WebTransport is supported in two libp2p implementations as an experimental feature:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;go-libp2p as of v0.23.0&lt;&#x2F;li&gt;
&lt;li&gt;js-libp2p through the js-libp2p-webtransport npm package&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;Dt42Ss6X_Vk&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;can-i-use-this-right-now&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#can-i-use-this-right-now&quot; aria-label=&quot;Anchor link for: can-i-use-this-right-now&quot;&gt;Can I use this right now?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Yes, please! WebTransport already works between browsers and servers in applications powered by go-libp2p and js-libp2p.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-use-cases-does-this-unlock&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-use-cases-does-this-unlock&quot; aria-label=&quot;Anchor link for: what-use-cases-does-this-unlock&quot;&gt;What use cases does this unlock?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Enable browser nodes (or light clients) as &quot;full&quot; peers in a decentralized network&lt;&#x2F;li&gt;
&lt;li&gt;Enable browser extension crypto wallets to submit transactions directly to the blockchain&lt;&#x2F;li&gt;
&lt;li&gt;Get data from the DHT by directly connecting to a DHT server node&lt;&#x2F;li&gt;
&lt;li&gt;Upload to Filecoin directly from the browser&lt;&#x2F;li&gt;
&lt;li&gt;Enable decentralized peer-to-peer video streaming as a dapp&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;resources-and-how-you-can-help-contribute&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#resources-and-how-you-can-help-contribute&quot; aria-label=&quot;Anchor link for: resources-and-how-you-can-help-contribute&quot;&gt;Resources and How you can help contribute&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;guides&#x2F;webtransport&#x2F;&quot;&gt;Documentation on WebTransport&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;guides&#x2F;browser-connectivity#webtransport&quot;&gt;Connectivity site section on the protocol&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libp2p&#x2F;specs&#x2F;tree&#x2F;master&#x2F;webtransport&quot;&gt;Specification on WebTransport&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If you would like to contribute, please &lt;a href=&quot;&#x2F;get-involved&#x2F;&quot;&gt;connect with the libp2p maintainers&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you for reading!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>libp2p Day 2022 Recap</title>
          <pubDate>Tue, 22 Nov 2022 00:00:00 +0000</pubDate>
          <author>The libp2p Foundation</author>
          <link>https://libp2p.io/preview/pr-30/blog/2022-11-22-libp2p-day-2022-recap/</link>
          <guid>https://libp2p.io/preview/pr-30/blog/2022-11-22-libp2p-day-2022-recap/</guid>
          <description xml:base="https://libp2p.io/preview/pr-30/blog/2022-11-22-libp2p-day-2022-recap/">&lt;p&gt;Last month, on October 30th 2022, libp2p users and contributors gathered together for the first ever libp2p Day!&lt;&#x2F;p&gt;
&lt;p&gt;The day included talks from maintainers, contributors, community members, and users. Topics included latest libp2p updates, preview of future roadmap items, bleeding-edge demos on browser connectivity using new transport protocols, and much more.&lt;&#x2F;p&gt;
&lt;p&gt;Speakers shared new, exciting developments built on libp2p and represented organizations like Little Bear Labs, ChainSafe Systems, Status.im, Gather, Quiet, Pyrsia, Satellite.im, and Protocol Labs.&lt;&#x2F;p&gt;
&lt;p&gt;In the larger context, libp2p Day was hosted at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;2022.ipfs.camp&#x2F;&quot;&gt;IPFS Camp 2022&lt;&#x2F;a&gt; as a part of a diverse lineup.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;goals&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#goals&quot; aria-label=&quot;Anchor link for: goals&quot;&gt;Goals&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The goals of libp2p Day were to:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Share updates on libp2p and highlight new developments through demos&lt;&#x2F;li&gt;
&lt;li&gt;Gather the libp2p ecosystem, give a spotlight to projects building on libp2p, and energize the community&lt;&#x2F;li&gt;
&lt;li&gt;Empower newcomers and existing users to become contributors and spec authors&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#key-takeaways&quot; aria-label=&quot;Anchor link for: key-takeaways&quot;&gt;Key Takeaways&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;h4 id=&quot;browser-connectivity-unlocked&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#browser-connectivity-unlocked&quot; aria-label=&quot;Anchor link for: browser-connectivity-unlocked&quot;&gt;Browser Connectivity Unlocked&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;First-class support for WebTransport enables libp2p nodes running in the browser to connect directly with peers on a host machine. WebRTC browser-to-server has also made significant progress.&lt;&#x2F;p&gt;
&lt;p&gt;Check out the &lt;a href=&quot;&#x2F;guides&#x2F;browser-connectivity&quot;&gt;new libp2p connectivity guide&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;libp2p-interoperability&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#libp2p-interoperability&quot; aria-label=&quot;Anchor link for: libp2p-interoperability&quot;&gt;libp2p Interoperability&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;The libp2p ecosystem continues to flourish with several implementations, each with its own set of supported features. libp2p teams are focusing on testing interoperability.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;demand-for-libp2p-http&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#demand-for-libp2p-http&quot; aria-label=&quot;Anchor link for: demand-for-libp2p-http&quot;&gt;Demand for libp2p + HTTP&lt;&#x2F;a&gt;&lt;&#x2F;h4&gt;
&lt;p&gt;With the growing demand for libp2p + HTTP, the team has started drafting an HTTP specification.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;recap-of-talks&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#recap-of-talks&quot; aria-label=&quot;Anchor link for: recap-of-talks&quot;&gt;Recap of talks&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;intro-to-libp2p-helping-with-real-world-application-problems&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#intro-to-libp2p-helping-with-real-world-application-problems&quot; aria-label=&quot;Anchor link for: intro-to-libp2p-helping-with-real-world-application-problems&quot;&gt;Intro to libp2p: helping with real world application problems&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Max Inden (rust-libp2p maintainer, Software Engineer at Protocol Labs)&lt;&#x2F;p&gt;







&lt;div class=&quot;video-container video-container--youtube&quot;&gt;
    &lt;iframe
        src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;J7ZWbpo2AZk&quot;
        title=&quot;YouTube video&quot;
        frameborder=&quot;0&quot;
        allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
        allowfullscreen
        loading=&quot;lazy&quot;
    &gt;&lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Max introduced libp2p covering transport protocols, secure channels, multiplexing mechanisms, how libp2p traverses NATs, discovers peers, uses Kademlia for peer-to-peer routing, and GossipSub for pub&#x2F;sub messaging.&lt;&#x2F;p&gt;
&lt;p&gt;For all the talk recordings, visit the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;2022.ipfs.camp&#x2F;&quot;&gt;IPFS Camp 2022 archive&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
