Skip to content

Commit 03f5199

Browse files
authored
Merge pull request #45 from 2color/add-technical-doc
docs: add technical implementation details
2 parents 4f5591b + fe0b655 commit 03f5199

File tree

1 file changed

+27
-3
lines changed

1 file changed

+27
-3
lines changed

README.md

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ A readonly implementation of fsspec for IPFS.
55
## Installation
66

77
You can install `ipfsspec` directly from git with the following command:
8+
89
```bash
910
pip install ipfsspec
1011
```
@@ -22,8 +23,31 @@ with fsspec.open("ipfs://QmZ4tDuvesekSs4qM5ZBKpXiZGun7S2CYtEZRB3DYXkjGx", "r") a
2223

2324
The current implementation uses a HTTP gateway to access the data. It uses [IPIP-280](https://github.com/ipfs/specs/pull/280) to determine which gateway to use. If you have a current installation of an IPFS node (e.g. kubo, IPFS Desktop etc...), you should be fine. In case you want to use a different gateway, you can use any of the methods specified in IPIP-280, e.g.:
2425

25-
* create the file `~/.ipfs/gateway` with the gateway address as first line
26-
* define the environment variable `IPFS_GATEWAY` to the gateway address
27-
* create the file `/etc/ipfs/gateway` with the gateway address as first line
26+
- create the file `~/.ipfs/gateway` with the gateway address as first line
27+
- define the environment variable `IPFS_GATEWAY` to the gateway address
28+
- create the file `/etc/ipfs/gateway` with the gateway address as first line
2829

2930
No matter which option you use, the gateway has to be specified as an HTTP(S) url, e.g.: `http://127.0.0.1:8080`.
31+
32+
## Implementation details
33+
34+
ipfsspec supports retrieval and verification of [UnixFS](https://specs.ipfs.tech/unixfs/) encoded files and directories. UnixFS HAMTs have not been implemented yet.
35+
36+
fsspec uses entry points to discover filesystem implementations. When you install ipfsspec, it registers itself via an entry point in its [pyproject.toml](./pyproject.toml):
37+
38+
```toml
39+
[project.entry-points."fsspec.specs"]
40+
ipfs = "ipfsspec.AsyncIPFSFileSystem"
41+
```
42+
43+
When you call `fsspec.open("ipfs://...")`:
44+
45+
1. fsspec scans entry points in the `fsspec.specs` group using Python's package metadata
46+
2. Finds the ipfs entry point that points to `ipfsspec.AsyncIPFSFileSystem`
47+
3. Dynamically loads and instantiates that class to handle the request
48+
49+
ipfsspec just needs to be installed and have the right entry point declared, and fsspec automatically discovers it.
50+
51+
The actual filesystem class (`AsyncIPFSFileSystem`) in [async_ipfs.py](./ipfsspec/async_ipfs.py) inherits from `fsspec.asyn.AsyncFileSystem` and implements the required methods like `_cat_file()`, `_ls()`, etc. to fetch and verify data from [IPFS HTTP trustless gateways](https://specs.ipfs.tech/http-gateways/trustless-gateway/).
52+
53+
All data fetched is verified to match the CID by fetching [CAR files](https://ipld.io/specs/transport/car/carv1/) which contain the merkle proofs. This means you don't need to trust the gateway.

0 commit comments

Comments
 (0)