Skip to main content

A reasonably fast DAG-CBOR encoder/decoder for Python

Project description

dag-cbrrr

Convert between DAG-CBOR and Python objects at hundreds of megabytes per second. Take a look at the benchmarks

Other than speed, a distinguishing feature is that it operates non-recursively. This means you can decode or encode arbitrarily deeply nested objects without running out of call stack (although of course you might still run out of heap).

Finally, cbrrr aims to be maximally strict regarding DAG-CBOR canonicalization rules. See below for further details.

Installation

From pypi:

python3 -m pip install cbrrr

From git:

git clone https://github.com/DavidBuchanan314/dag-cbrrr
cd dag-cbrrr
python3 -m pip install -v .

Quickstart

Here's the basics:

import cbrrr

encoded = cbrrr.encode_dag_cbor({"hello": [b"world", 1, 2, 3]})
print(encoded)  # b'\xa1ehello\x84Eworld\x01\x02\x03'
decoded = cbrrr.decode_dag_cbor(encoded)
print(decoded)  # {'hello': [b'world', 1, 2, 3]}

For more detailed API information, take a look at the commented python source, which provides an ergonomic wrapper for the native module (more docs coming soon™)

TL;DR:

class CID:
	def __init__(self, cid_bytes: bytes) -> None:
		...
	def decode(cls, data: Union[bytes, str]) -> "CID":
		...
	def encode(self, base="base32") -> str:
		...
	...

DagCborTypes = Union[str, bytes, int, bool, float, CID, list, dict, None]

def decode_dag_cbor(
	data: bytes,
	atjson_mode: bool=False,
	cid_ctor: Callable[[bytes], Any]=CID
) -> DagCborTypes:
	...

def decode_multi_dag_cbor_in_violation_of_the_spec(
	data: bytes,
	atjson_mode: bool=False,
	cid_ctor: Callable[[bytes], Any]=CID
) -> Iterator[DagCborTypes]:
	...

def encode_dag_cbor(
	obj: DagCborTypes,
	atjson_mode: bool=False,
	cid_type: Type=CID
) -> bytes:
	...

"atjson_mode" refers to the representation used in atproto HTTP APIs, documented here here. It is not a round-trip-safe representation.

Strictness

cbrrr aims to conform to all the strictness rules set out in the DAG-CBOR specification.

It decodes strictly, and there is no non-strict mode available. This means, among other things:

  • Maps must not have duplicate keys
  • Map keys must be strings
  • Map keys must be canonically sorted
  • Only 64-bit floats are allowed
  • All integers/lengths must be minimally encoded
  • Only tag type 42 is allowed (NOTE: For now, CID values themselves are not validated)

In its default configuration, valid DAG-CBOR should round-trip perfectly, i.e. encode_dag_cbor(decode_dag_cbor(data)) == data. (This is not necessarily true if you specify atjson_mode=True, or pass a custom CID type (see below) that misbehaves in some way).

Using multiformats.CID

cbrrr brings its own performance-oriented CID class, but it's relatively bare-bones (supporting only base32, for now). If you want more features and broader compatibility, you can use the CID class from hashberg-io/multiformats like so:

import cbrrr
import multiformats

encoded = cbrrr.encode_dag_cbor(
	multiformats.CID.decode("bafkreibm6jg3ux5qumhcn2b3flc3tyu6dmlb4xa7u5bf44yegnrjhc4yeq"),
	cid_type=multiformats.CID
)

decoded = cbrrr.decode_dag_cbor(encoded, cid_ctor=multiformats.CID.decode)
print(decoded)  # zb2rhZfjRh2FHHB2RkHVEvL2vJnCTcu7kwRqgVsf9gpkLgteo

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cbrrr-1.0.1.tar.gz (17.5 kB view details)

Uploaded Source

File details

Details for the file cbrrr-1.0.1.tar.gz.

File metadata

  • Download URL: cbrrr-1.0.1.tar.gz
  • Upload date:
  • Size: 17.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.7

File hashes

Hashes for cbrrr-1.0.1.tar.gz
Algorithm Hash digest
SHA256 2dc5f78a71b67849e1b364053819053f03cd2032797ce6adbe1d02e8d602698c
MD5 c6d9e39c0467f5abc71e914a882d7022
BLAKE2b-256 a32e321b68b2b12c99864f0872feb8ce80f03483b59c113730f7cb4465a49e0e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page