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

Go Core WG Roadmap #4

Merged
merged 4 commits into from
Mar 18, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 178 additions & 0 deletions WG_GO_CORE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# IPFS Go Core Dev Team - Roadmap 2019

The Go IPFS Working Group is responsible for the development of the Go IPFS implementation and participating in the planning and development of IPFS in general.

### Responsibilities include:
* Implement new features in the Go IPFS implementation
* Support Go IPFS, fixing bugs and improving stability and performance
* Develop specifications for new IPFS protocols and capabilities

## Current Projects
* go-ipfs
* IPLD
* gx
* Data Exchange/Transfer - improve performance of data transfer
* Data Management - improve ability of Go IPFS to manage large data sets
* Provider Strategies - improve efficiency of DHT use
* Commands Lib
* API
* Base32 CIDv1

## Major 2019 goals to achieve
1. Benchmarks for Go IPFS that measure IPFS behavior across data lifecycle for a broad set of inputs.
2. ‘Indefinite’ refactors are complete; code is maintainable and understandable
3. Improve data transfer speed so that it is at least 0.8 times that of bittorrent/rsync, (whichever is faster) for a given set of peers and data
4. Support adding/getting/pinning large volumes of data efficiently. Go-IPFS can add (and provide) 10TB of small files (< 1MB each) at > 0.5 times the speed of a simple dd] copy.
5. Make storing, looking up, and retrieving provider data in the DHT reliable and fast.
6. Complete, documented, performant, stable APIs for interacting with a running Go IPFS node.

## Milestones

### 📦 Package managers

* `M (P0)`: The IPFS core team understands the needs of package management communities and engages their interest
* Meet people from various package management communities -- both distros and language tooling -- and learn about their needs
* Support interested package manager communities with DRIs
* F-droid
* Guix
* Snapshots.debian.org ?
* `M (P0)`: We have understanding and documentation of what kind of scale (in terms of size at one time; and change in size over time) mirroring a package manager archive requires.
* Ex: document how long mirroring npm into IPFS takes
* Ex: VictorBjelkholm/arch-mirror also exists, let’s make sure we gather stats
* `M (P1)`: Develop documentation for what Package Distribution with IPFS should look like.
* There is documentation and guidelines to help maintainers from existing package management communities learn about IPFS, explore common alternatives, and figure out what would work for their system
* Document and highlight best practices for dealing with the common hurdles in moving to immutable-first: e.g. “save packages in a merkle tree; build a package index merkle tree; use IPNS to handle updates of the tip of package index tree”.
* `M (P1)`: There is a way to prioritize different peers to optimize network utilization
* Bitswap peer prioritization supports pinning local / responsive peers


### 🗂 Large Files

Go-IPFS is fast, efficient and stable when handling and transferring large amounts of data. (“large files” = 10GB - 1TB, “many small files” = 10K-1M 1MB files). The goals in this section are exclusive of finding the data (DHT/providers etc.). This is just the speed of transferring data when already connected to IPFS nodes that have that data.

* Q1 - `M (P0)`: Awesome go-ipfs benchmark test suite exists comparing ipfs performance and transfer size relative to bittorrent
* Q2 - `M (P0)`: Expand benchmark test suite to compare relative to rsync, http, cp, dd
* `M (P0)`: Go-IPFS bitswap (or equivalent) can transfer large files from many peers at 0.8 times the speed of BitTorrent.
* Q1 - Bitswap session improvements that improve transfer efficiency by reducing duplicate blocks and efficiently fetching related data from many peers simultaneously.
* Graphsync selector implementation that can understand non-overlapping subsets of data to select from multiple hosts and the driver that can build up graphsync requests for many peers to maximize efficiency and throughput.
* `M (P0)`: Go-IPFS can transfer many small files at 0.8 times the speed of rsync (for single peers) or BitTorrent (for many peers)
* Bitswap session improvements
* Graph Exchange that can route requests efficiently

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* Graph Exchange that can route requests efficiently
* Q1 - Graph Exchange that can route requests efficiently

* Q1 - Graphsync makes accessing files in large directories log(n) faster
* Q1 - Flexible provider strategies
* `M (P1)`: Go-IPFS can transfer large files from a single peer at 0.8 times the speed of HTTP.
* Q1 - Flexible provider strategies to use the DHT efficiently (and therefore not slow IPFS down while adding/fetching files) while still preserving the reachability of data.
* `M (P1)`: Go-IPFS can add a directory of many small files at 50% the speed of a simple local hard drive copy (or dd) (10k x 1MB files)
* Flexible provider strategies to limit the number of DHT provider advertisements we make
* Q1 - Faster datastore (Badger or equivalent) that doesn’t slow down as the number of blocks stored grows large
* GC improvements (transactions, speed)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* GC improvements (transactions, speed)
* Q2 - GC improvements (transactions, speed)

It would certainly be nice if this was Q1, but I'm going to guess that Q2 is more likely?

* `M (P2)`: Data transferred over the network is no more than 1.2x the size of the data being transferred
* Bitswap session improvements to reduce duplicates
* Graphsync


### 🔄 Decentralized Web

go-ipfs is the go-to backend for building DApps.

* `M (P0)`: Provider lookups are efficient (<1 sec) in real-world network conditions (ex between physically distant peers)
* `M (P0)`: ipfs://, ipns:// work in web browsers
* Q1 - Base32 CIDs by default
* Q2 - Base32 IPNS keys (or make IPNS keys CIDs)
* `M (PX)`: <1 sec IPNS resolution for any IPNS record
momack2 marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* `M (PX)`: <1 sec IPNS resolution for any IPNS record
* `M (PX)`: <5 sec IPNS resolution for any IPNS record

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SGTM.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although I'm a bit worried that this just isn't viable. That is, 5s to resolve something is really slow (but we're not going to get much better on our DHT). @lgierth what's the status of your dns-based IPNS system?

* QUIC
* NAT detection/traversal
* Only "reachable" nodes join the DHT
* `M (P1)`: IPFS provides a clean way to persist data (dapps need to store stuff)
* `M (PX)`: IPFS supports basic dapp requirements for security and private content
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we're going to get to this until Q2 at the earliest, but it'd be nice to take a pass on this work before doing a security audit to make that analysis more valuable. So maybe API security in Q2 and examples/documentation in Q3?

Suggested change
* `M (PX)`: IPFS supports basic dapp requirements for security and private content
* `M (PX)`: IPFS supports basic dapp requirements for security and private content
* Q2 - dapps are secure (api security, multi tenancy). Apps can't read each other's state
* Q3 - There are examples and documentation for ipfs users to create private-content dapps using IPFS (aka handling encryption on the client side)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree.

* dapps are secure (api security, multi tenancy). Apps can't read each other's state
* There are examples and documentation for ipfs users to create private-content dapps using IPFS (aka handling encryption on the client side)
* `M (PX)`: IPFS is usable for building wordpress-level decentralized sites
* API doesn't suck (and is fast)
* We can build an interactive blogging engine with a built-in editor/publisher entirely in a webapp (backed by a go-ipfs instance). And it's *easy* to do this.

### 🤝 IPFS Contributors and Developers

Developers using IPFS can rely on go-ipfs as a platform on which to build their product, app, or ecosystem, and new contributors are well supported.

* `M (P0)`: (all) Go-IPFS is approachable as a new contributor
* Go-IPFS internals are well documented
* Technical debt is paid off, all "indefinitely-in-progress" refactors are completed.
* Cleanup/rethink abstraction layers with 20-20 hindsight.
* Re-structure repos into reusable but not fragmented components.
* `Q1 - M (P0)`: (all) Go-IPFS is usable without gx
* Fix the versions (make them all sub-0)
* Add go.mod files to every package
* Merge #5435.
* `M (P0)`: (all) Users can reliably transfer data between any two nodes.
* Reliable NAT traversal (AutoNAT, relay, TURN, etc).
* Connection manager doesn't kill useful connections.
* Scalable content routing
* Reliable DHT: unreliable nodes don't join the DHT.
* `M (P0)`: (dapps) ipfs:// and ipns:// work in web browsers
* Base32 CIDs
* Base32 IPNS or IPNS uses CIDs
* `M (P1)`: (all) Go-IPFS is approachable as a user/app developer
* User documentation.
* Well designed API interface
* Well designed API transport
* `M (P1)`: (Dapps) Fast (< 3s), mutable name resolution (IPNS)
* Reliable DHT.
* QUIC (for fast connection establishment).
* Better protocol negotiation (multistream-2.0)
* Delegated Routing
* `M (P1)`: (Dapps) IPFS Realtime Story is as good as using a centralized service (e.g. Socket.io, Pusher, etc)
* The API for doing secure (authenticated) broadcast updates exists
* `M (P2)`: Go-ipfs can handle large datasets (>1TiB, >1M nodes)
* Scalable content routing (providing)
* DagSync (or at least better bitswap)
momack2 marked this conversation as resolved.
Show resolved Hide resolved
* Reliable, performant datastore
* `M (P2)`: (all, Dapps) IPFS is pluggable and extensible (9/10 users don't need custom features)
* The go-ipfs plugins system is expanded to support new datastores, exchanges, etc
* Exchanges support multiple protocols (that diagram from hack week)
* Multi-DHT (https://github.com/ipfs/notes/issues/291#issuecomment-414495124)
* UnixFS-V2 is implemented
* `M (P2)`: (machine-learning/package managers) IPFS can handle (and transfer) large (>1M entries) sharded indexes (objects, directories)
* Bitswap Improvements (sessions, prediction, etc)
* UnixFS-V2 (better directory structure)
* `M (P3)`: (Dapps) IPFS can locally share data without a shared network
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mgoelzer @raulk - FYI a bluetooth(like) transport for locally sharing data without a shared network is a requested item in our go-ipfs 2019 roadmap

Copy link

@ghost ghost Dec 18, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey, thanks for pinging me on this. I'm really interested in the BT transport (and Wifi), but I'm not sure who would work on it. From past conversations with @whyrusleeping I believe it requires someone who has done low-level Bluetooth development before, and there is no one at PL (afaik) who falls in this category. We discussed this at the Lisbon Hack Week in May 2018 and I believe @mafintosh (think it was him?) said he knew someone with this experience, but we never followed up on it. @whyrusleeping also has done some research on this in the past, but lately he's been focusing on other projects.

If 2019 is the year that we get serious about a BT transport in libp2p, I think we should put our heads together and (1) create an RFP with acceptance criteria for exactly what we want, and (2) think of who we know who might be able to take this on.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a crosslink in the libp2p roadmap: https://docs.google.com/document/d/1Rd4yNw1TNQBvfRrKeEMSTseb6fvPzS-C--obOn0nul8/edit?disco=AAAACYoDclo We need to get better at tracking these crosslinks in a visual manner.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Creating an RFP in Q1 would allow us to find folks interested in working on this in Q2, allowing others to build on this capability in H2.

Suggested change
* `M (P3)`: (Dapps) IPFS can locally share data without a shared network
* `M (P3)`: (Dapps) IPFS can locally share data without a shared network
* Q1 - Draft RFP for bluetooth (or like) transport and find owner
* Q2 - Implement bluetooth (or like) transport

* A bluetooth (or like) transport
* `M (P4)`: (anti-censorship) Our IPFS implementations are secure and don't leak sensitive information
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally we do a security pass as a team prior to a 3rd party security audit, and then have explicit time for fixes and documentation. Question - should we wait on privacy-preserving efforts until after we have audited the security of the core of IPFS, or should we have some experimental privacy-preserving efforts that are evaluated as part of our security audit?

Q1 - find 3rd security auditors
Q2 - Implement api security, multi tenancy
End of Q2 - Security audit
Q3 - Implement fixes based on security audit
Q3 - document how to use IPFS securely
?? - Privacy-preserving DHT / Transport

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can start those efforts but I'm not sure if it's worth including them in a security audit (ever).

* Get a security audit
* Implement the privacy preserving DHT (https://github.com/ipfs/notes/issues/291#issuecomment-396003860)
* Add a download-only mode (avoid serving local data)
* Investigate a privacy-preserving transport

### 🧠 Strategic goals

* `M (P0)`: We have a stable core that people can add things to without breaking changes
* UnixFS is stable and extensible
* UnixFS v2 (with a good HAMT)
* The DHT is extensible
* Multi-DHT: https://github.com/ipfs/notes/issues/291#issuecomment-414495124
* `Q1 - M (P0)`: Have a solution for testing/benchmarking
* Available for offline testing.
* Reproducibility (across different platforms).
* Provide realistic Internet/WAN simulations (with delays and dropped packets).
* `M (P0)`: Support allow- and deny-lists for content
* Required for exposing data by libraries and archives (allowlist)
* Required for ease of Copyright compliance (denylist)
* `M (P1)`: Support read only gateways (not-offline)
* Might be more fitting for partners
* `M (P1)`: Interfaces are future-proof enough for 1.0
* CoreAPI
* Plugins
* `M (P1)`: Grow our own team processes / active contributors to add more project coordination support
* `M (P2)`: Investigate IPNS that would continue working offline/in small network segment (for future goals)
* `M (P2)`: Certificate based private networks

## ⏳ Timeline

- Q1
- Q2
- Q3
- Q4

## ⁉️ Want to get involved?
- File an issue here with questions, or make a PR to suggest an alternate path or addition
- Want to help make this happen? [Open an issue on the Go IPFS Working Group repo!](https://github.com/ipfs/go-ipfs/issues)