IPLD DAG implementation for Python — codecs for DAG-CBOR, DAG-JSON, DAG-PB, and Raw, aligned with the js-multiformats ecosystem.
Provides:
- DAG-CBOR (
0x71) – Deterministic CBOR with CID links (CBOR tag 42) - DAG-JSON (
0x0129) – Deterministic JSON with CID links ({"/": "bafy..."}) - DAG-PB (
0x70) – Protobuf-based Merkle DAG nodes (legacy IPFS/UnixFS) - Raw (
0x55) – Identity codec for raw binary data - Block API –
Block.encode()/Block.decode()/Block.create() - Codec registry – Pluggable codec architecture with auto-registration
- IPLD Data Model – Full support for Null, Bool, Int, Float, String, Bytes, List, Map, Link kinds
- CID integration – Seamless use of py-cid for content addressing
Read more in the documentation on ReadTheDocs. View the release notes.
from dag import Block
from dag.codecs import dag_cbor, dag_json, dag_pb, raw
block = Block.encode(value={"hello": "world", "n": 42}, codec=dag_cbor.codec)
print(block.cid)
print(block.bytes)
restored = Block.decode(data=block.bytes, codec=dag_cbor.codec)
assert restored.value == {"hello": "world", "n": 42}
child = Block.encode(value={"child": True}, codec=dag_cbor.codec)
parent = Block.encode(
value={"link": child.cid, "type": "parent"},
codec=dag_cbor.codec,
)
for path, cid in parent.links():
print(f"{path} -> {cid}")
json_block = Block.encode(
value={"ref": child.cid, "data": b"\xde\xad"},
codec=dag_json.codec,
)
pb_block = Block.encode(
value={
"Data": b"hello UnixFS",
"Links": [{"Hash": child.cid, "Name": "child", "Tsize": 10}],
},
codec=dag_pb.codec,
)
raw_block = Block.encode(value=b"raw binary", codec=raw.codec)Example scripts are available in examples/, including
Python equivalents of js-multiformats interface demos:
examples/block_interface/block_interface.pyexamples/cid_interface/cid_interface.pyexamples/multicodec_interface/multicodec_interface.pyexamples/multihash_interface/multihash_interface.py
Run them from the repository root:
source venv/bin/activate
python -m examples.block_interface.block_interface
python -m examples.cid_interface.cid_interface
python -m examples.multicodec_interface.multicodec_interface
python -m examples.multihash_interface.multihash_interfaceInstallation (venv, pip/uv, stable and development) and usage are documented in the docs — see Installation and Usage in the table of contents.
From PyPI (stable):
pip install py-ipld-dagFrom source (development):
Same as in CONTRIBUTING.md. With uv (recommended):
git clone https://github.com/ipld/py-ipld-dag.git
cd py-ipld-dag
uv venv && source venv/bin/activate # Windows: venv\Scripts\activate
uv pip install --upgrade pip
uv pip install --group dev -e .
pre-commit installWith pip (requires pip >= 25.1):
python -m venv venv && source venv/bin/activate # Windows: venv\Scripts\activate
pip install --upgrade pip
pip install --group dev -e .
pre-commit installOr run make install-dev after activating a venv (uses uv).
Full usage, API reference, and examples: Documentation.
- Tests:
pytestormake test - Lint:
make lintorpre-commit run --all-files - Docs:
make docs-ci(build docs with Sphinx)
See CONTRIBUTING.md for setup and pull request guidelines.
Changelog and release notes are generated from newsfragments with Towncrier and published in the docs: Release notes.