Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: add Roadmap #1412

Merged
merged 12 commits into from
Oct 20, 2022
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,11 @@ To sum up, libp2p is a "network stack" -- a protocol suite -- that cleanly separ

## Roadmap

Our roadmap for js-libp2p can be found here: https://github.com/libp2p/js-libp2p/blob/master/ROADMAP.md
This document represents current projects the js-libp2p team is focused on and provides an estimation of completion targets. It is a completementary roadmap to the overarching libp2p project roadmap: https://github.com/libp2p/specs/blob/master/ROADMAP.md
The js-libp2p roadmap can be found here: https://github.com/libp2p/js-libp2p/blob/master/ROADMAP.md

It represents current projects the js-libp2p maintainers are focused on and provides an estimation of completion targets.

It is completementary to the overarching libp2p project roadmap: https://github.com/libp2p/specs/blob/master/ROADMAP.md

## Install

Expand Down
57 changes: 26 additions & 31 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ https://github.com/libp2p/js-libp2p/issues/1438
- [Mid Q4 (November)](#mid-q4-november)
- [End of Q4 (December)](#end-of-q4-december)
- [2023](#2023)
- [Early Q1 (January)](#early-q1-january)
- [Mid Q1 (February)](#mid-q1-february)
- [End of Q1 (March)](#end-of-q1-march)
- [Early Q2 (April)](#early-q2-april)
Expand All @@ -34,21 +35,15 @@ https://github.com/libp2p/js-libp2p/issues/1438
- [2. Circuit Relay v2](#2-circuit-relay-v2)
- [3. Add QUIC Transport](#3-add-quic-transport)
- [4. Hole Punching](#4-hole-punching)
- [C. 🔮 Future-proof Observability](#c--future-proof-observability)
- [1. Benchmark transfer performance in CI](#1-benchmark-transfer-performance-in-ci)
- [2. Add introspection to js-libp2p](#2-add-introspection-to-js-libp2p)
- [libp2p Project Roadmap](#libp2p-project-roadmap)
- [C. 🔮 Ergonomic Observability](#c--ergonomic-observability)
- [1. Ergonomic metrics API](#1-ergonomic-metrics-api)

## About the Roadmap

### Vision
The tenets of the libp2p team are:
- Security
- We strive to ensure that libp2p is reliable & secure for users & applications. We seek to minimize vulnerabilities and act quickly to address issues.
- Stability
- We do not break deployed features and maintain cross version compatibility across libp2p releases.
- Performance
- We aim to make libp2p as performant as possible and strive to ensure comparable performance to widely used protocols on the Internet. We avoid regressions and performance degradations in new releases.
We, the maintainers, are committed to upholding libp2p's shared core tenets and ensuring js-libp2p is: [**Secure, Stable, Specified, and Performant.**](https://github.com/libp2p/specs/blob/master/ROADMAP.md#core-tenets)

Roadmap items in this document were sourced in part from the [overarching libp2p project roadmap.](https://github.com/libp2p/specs/blob/master/ROADMAP.md)

### Sections
This document consists of two sections: [Milestones](#️-milestones) and the [Appendix](#-appendix)
Expand All @@ -73,13 +68,13 @@ The "Definition of Done" for projects/sub-projects that involve writing new prot
Supporting projects (such as testing or benchmarking) may have different criteria.

### Benchmarking and Testing
As mentioned in our [vision](#vision), performance and stability are core libp2p tenets. Rigorous benchmarking and testing help us uphold them. Related projects are listed in the [libp2p/test-plans roadmap](https://github.com/libp2p/test-plans/pull/44) and the [testground/testground roadmap](https://github.com/testground/testground/pull/1484). Our major priorities in Q4’22 and Q1’23 are:
As mentioned in our [vision](#vision), performance and stability are core libp2p tenets. Rigorous benchmarking and testing help us uphold them. Related projects are listed in the [libp2p/test-plans roadmap](https://github.com/libp2p/test-plans/blob/master/ROADMAP.md) and the [testground/testground roadmap](https://github.com/testground/testground/blob/master/ROADMAP.md). Our major priorities in Q4’22 and Q1’23 are:
- [interoperability testing](https://github.com/libp2p/test-plans/issues/53) (across implementations & versions and between transports, muxers, & security protocols)
- [add a browser environment test harness to support testing browser features](https://github.com/testground/testground/issues/1386)
p-shahi marked this conversation as resolved.
Show resolved Hide resolved
- test DHT Server Mode at scale (testbed of at least >20 nodes; ideally 100/1000+) in Testground
- performance benchmark js-libp2p using Testground (create a benchmark suite to run in CI)
- [performance benchmark js-libp2p using Testground](https://github.com/testground/testground/pull/1425) (create a benchmark suite to run in CI)

These projects are parallel workstreams, weighed equally with roadmap items in this document. Some efforts like interoperability testing have a higher priority than implementation projects. The js-libp2p co-owns these efforts with the go-libp2p, rust-libp2p, and Testground/IPDX teams.
These projects are parallel workstreams, weighed equally with roadmap items in this document. Some efforts like interoperability testing have a higher priority than implementation projects. The js-libp2p maintainers co-own these efforts with the go-libp2p, rust-libp2p, and Testground maintainers.

## 🛣️ Milestones
### 2022
Expand All @@ -88,7 +83,8 @@ These projects are parallel workstreams, weighed equally with roadmap items in t
- [A.1 📺 WebTransport](#1-webtransport)

#### Mid Q4 (November)
- [C.1 🔮 Benchmark transfer performance in CI](#1-benchmark-transfer-performance-in-ci)
- [***➡️ test-plans/Interop tests for all existing/developing features***](https://github.com/libp2p/test-plans/blob/master/ROADMAP.md#2-interop-test-plans-for-all-existingdeveloping-transports)
p-shahi marked this conversation as resolved.
Show resolved Hide resolved
- [***➡️ test-plans/Benchmarking using nix-builders***](https://github.com/libp2p/test-plans/blob/master/ROADMAP.md#1-benchmarking-using-nix-builders)

#### End of Q4 (December)
- [A.2 📺 WebRTC: Browser to Server](#2-webrtc-browser-to-server)
Expand All @@ -97,18 +93,23 @@ These projects are parallel workstreams, weighed equally with roadmap items in t

### 2023

#### Early Q1 (January)
- [C.1 🔮 Ergonomic metrics API](#1-ergonomic-metrics-api)
- [***➡️ test-plans/DHT server mode scale test***](https://github.com/libp2p/test-plans/blob/master/ROADMAP.md##1-dht-server-mode-scale-test)

#### Mid Q1 (February)
- [C.2 🔮 Add introspection to js-libp2p](#2-add-introspection-to-js-libp2p)
- [A.3 📺 WebRTC: Browser to Browser](#3-webrtc-browser-to-browser)

#### End of Q1 (March)
- [B.3 🥊 Add QUIC Transport](#3-add-quic-transport)
- [***➡️ test-plans/Benchmarking using remote runners***](https://github.com/libp2p/test-plans/blob/master/ROADMAP.md#2-benchmarking-using-remote-runners)

#### Early Q2 (April)
- [B.4 🥊 Hole Punching](#4-hole-punching)
- 🎉 Estimated Project Completion

### Up Next
- [A.3 📺 WebRTC: Browser to Browser](#3-webrtc-browser-to-browser)
- [***➡️ test-plans/Expansive protocol test coverage***](https://github.com/libp2p/test-plans/blob/master/ROADMAP.md#d-expansive-protocol-test-coverage)

## 📖 Appendix
### A. 📺 Universal Browser Connectivity
Expand All @@ -127,29 +128,23 @@ Even though this use case is made possible by [webrtc-star](https://github.com/l

### B. 🥊 Decentralized Hole Punching
<!--- TODO: Link to GitHub Epic -->
**Why**: P2P networks can have a combination of both public and private nodes. While private nodes can dial nodes on the public Internet, they are unreachable from the outside as they are behind a NAT or a firewall. We need a mechanism to dial them. A [previous DHT crawl found that almost 63%](https://github.com/libp2p/specs/blob/master/ROADMAP.md#-hole-punching-on-tcp-and-quic) of the network was undialable. This project aims to implement Decentralized Hole Punching in js-libp2p and bring it to parity with the Go and Rust implementations.
**Why**: P2P networks can have a combination of both public and private nodes. While private nodes can dial nodes on the public Internet, they are unreachable from the outside as they are behind a NAT or a firewall. We need a mechanism to dial them. A [previous DHT crawl found that almost 63%](https://github.com/libp2p/specs/blob/master/ROADMAP.md#-hole-punching-on-tcp-and-quic) of the network was undialable.

**Goal**:
**Goal:** Implement Decentralized Hole Punching in js-libp2p and bring it to parity with the Go and Rust implementations.
#### 1. [AutoNat](https://github.com/libp2p/js-libp2p/issues/1005)
Determine whether a node is public or private (located behind a firewall or a NAT.) This is a dependency for enabling the DHT in server mode by default for projects like js-ipfs.
#### 2. [Circuit Relay v2](https://github.com/libp2p/js-libp2p/issues/1029)
Connect to, request reservations, and establish a secure relay connection through discovered public relay node.
#### 3. Add QUIC Transport
Hole punching is [more reliable with UDP](https://www.notion.so/pl-strflt/NAT-Hole-punching-Success-Rate-2022-09-29-Data-Analysis-8e72705ca3cc49ab983bc5e8792e3e98#5b76991da8d24736abd486aa93e85a97) (therefore QUIC) than TCP. This requires adding support for QUIC in js-libp2p. There is some work [being done here](https://github.com/nodejs/node/pull/44325) to add support in node.js which we depend on.
Hole punching is [more reliable with UDP (therefore QUIC)](https://www.notion.so/pl-strflt/NAT-Hole-punching-Success-Rate-2022-09-29-Data-Analysis-8e72705ca3cc49ab983bc5e8792e3e98#5b76991da8d24736abd486aa93e85a97) than TCP. This requires adding support for QUIC in js-libp2p. There is some work [being done here](https://github.com/nodejs/node/pull/44325) to add support in node.js which we depend on.
#### 4. Hole Punching
Use [DCUtR](https://github.com/libp2p/specs/blob/master/relay/DCUtR.md) to synchronize hole punching

### C. 🔮 Future-proof Observability
***Why*** We release new versions of js-libp2p and we should analyze/profile each version for regressions. Furthrmore, we already expose [per-component metrics](https://github.com/libp2p/js-libp2p/issues/1060) in js-libp2p, we can improve this by adding introspection.
### C. 🔮 Ergonomic Observability
***Why*** Though we already expose [per-component metrics](https://github.com/libp2p/js-libp2p/issues/1060) in js-libp2p, the overhead of recording metrics is high (excessive object allocation per metric to record). This will be helpful to [our users](https://github.com/chainsafe/lodestar) who record metrics on the order of thousands/second.

***Goal***
For each js-libp2p release, we ensure transfer performance does not degrade. We can observe/get introspective data for a running js-libp2p instance.
Introduce an introspection protocol to js-libp2p, so we can hook into the [observer-toolkit](https://github.com/libp2p/observer-toolkit).

#### 1. Benchmark transfer performance in CI
Add [js-libp2p-transfer-performance](https://github.com/ipfs-shipyard/js-libp2p-transfer-performance) to a CI job to benchmark transfer times across releases.
#### 2. [Add introspection to js-libp2p](https://github.com/libp2p/js-libp2p-daemon/pull/45)
Add an introspection protocol for js-libp2p such that users of js-ipfs can utilize observer-toolkit to visualize introspection data.
We make the lives of js-libp2p easier by adding an improved metrics API.

## libp2p Project Roadmap
Roadmap items in this document were sourced from our the overarching libp2p project roadmap: https://github.com/libp2p/specs/blob/master/ROADMAP.md
#### 1. Ergonomic metrics API
Create a ergonomic, generalized metrics recording interface which addresses current allocation overhead and duplication of information. Do not bloat the browser bundle with [prom-client](https://github.com/siimon/prom-client).)