Skip to content

IPIP: Data Onboarding via HTTP POST (and future ipfs:// POST|PUT) #375

Open
@lidel

Description

Problem statement

HTTP Gateways are the most successful way for retrieving content-addressed data. Successful use of HTTP for retrieval use cases proves that IPFS does not replace HTTP, but augment it by providing variability and resiliency. IPFS over HTTP brings more value than the sum of its parts.

Removing the need for implementation specific RPC APIs (like one in Kubo) allowed not only faster adoption of CIDs on the web, but enabled alternative implementations of IPFS (like Iroh in Rust) to test compliance and benchmark thenselves against each other.

While we have HTTP Gateways as a standard HTTP-based answer to the retrieval of data stored with IPFS (including verifiable application/vnd.ipld.raw and application/vnd.ipld.car responses), the data onboarding over HTTP is currently done with vendor-specific APIs.

The status quo at 2023 Q1 is pretty bad from the end user/developer’s perspective: every IPFS implementation, including online services providing storage and pinning services, exposes custom opinionated HTTP API for onboarding data to IPFS.

Why we need IPIP for HTTP Data Onboarding

To illustrate, some prominent examples (2022 Q4):

Click to expand 🙈

And the CAR upload API insanity corca 2024 Q1:

This state of things introduces an artificial barrier to adoption: the user needs to learn what APIs are available, and then “pick winners” – decide which implementations and services are the most future-proof. And even then, many choices are burdened by legacy of Kubo RPC and it’s degraded performance and DX/UX in web browsers.

Goal: create data onboarding protocol for both HTTP and native IPFS

The intention here is to create IPIP with a vendor-agnostic protocol for onboarding data that:

  • is easy to use and implement in HTTP (POST https://)
    • does not require any libraries or documentation,
    • and is as easy to work with from JS with fetch API as it is in the command-line with curl
  • follow the retrieval story, where ipfs:// behavior is analogous to subdomain gateways
    • 👉 what we want, is to have a protocol that can be represented as both POST https:// AND POST ipfs:// APIs

IPIP scope

We want two IPIPs: one for onboarding data with HTTP POST, and one for authoring (modifying/pathing) it with HTTP PUT.
This allows us to ship most useful onboarding first, and then do authoring as an optional add-on, which services may support, but dont have to (if they are only onboarding to filecoin etc).

For now, focusing on the POST

POST Requests (Onboarding)

👉 This is the minimal scope we need to cover from the day one, ensuring every use case has a vendor-agnostic spec.

  • Delegated
    • Single File (UnixFS) or single (DAG-)CBOR/JSON document
    • Arbitrary Directory tree (UnixFS)
      • Option A: TAR stream
        • open question: how does this handle interrupted upload? can server tell some data is missing?
      • Option B: custom form-data? (think twice, we have lessons learned around RPC at /api/v0/add in Kubo)
  • Native
    • Raw block
    • CAR stream

The working code for this will be reference implementation that replaces/updates the legacy Gateway.Writable feature in Kubo with the above feature set.

PUT/PATCH/DELETE Requests (Authoring)

This will be a separate IPIP, but flagging this as long term plans that should feel idiomatic too.

  • TBD: Delegated vs Native
  • Critical: ensure no surprises, UX/DX is paramount. Needs research and analysis.
    • One idea is to keep it limited to patching UnixFS paths and DAG-JSON/CBOR documents.
    • Other idea is to have syntax parity with JSON-based IPLD Path and have the same JSON syntax as dag diff and dag patch commands.

References

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

Labels

IPIP(InterPlanetary) Improvement ProposalP2Medium: Good to have, but can wait until someone steps upneed/analysisNeeds further analysis before proceeding

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions