taceo-ark-serde-compat

Crates.iotaceo-ark-serde-compat
lib.rstaceo-ark-serde-compat
version0.3.0
created_at2025-10-29 12:08:09.679199+00
updated_at2025-12-10 13:20:03.07294+00
descriptionVarious serde compatibility implementations for arkworks-rs types, supporting both human-readable formats (JSON with decimal strings) and non-human readable formats (binary serialization using ark-serialize with compressed mode). The design choices are heavily influenced to work with Circom.
homepage
repositoryhttps://github.com/TaceoLabs/circom-helpers
max_upload_size
id1906486
size92,575
owners (github:taceolabs:owners)

documentation

README

ark-serde-compat

Various serialization helpers for serializing arkworks types using serde.

Overview

This crate provides serde-compatible serialization and deserialization functions for arkworks-rs types, supporting both human-readable and non-human readable formats:

  • Human-readable formats (e.g., JSON): Field elements are serialized as decimal strings, and curve points are serialized as arrays of coordinate strings. This format is designed to work seamlessly with Circom's JSON format expectations.
  • Non-human readable formats (e.g., bincode, CBOR): Uses ark-serialize with compressed mode for efficient binary serialization.

Features

  • bn254: Enables serialization support for BN254 curve types
  • bls12-381: Enables serialization support for BLS12-381 curve types
  • babyjubjub: Enables serialization support for BabyJubJub curve types

None of the features is enabled by default.

Usage

Use the provided functions with serde's field attributes:

use serde::{Serialize, Deserialize};
use ark_bn254::{Fr, G1Affine};

#[derive(Serialize, Deserialize)]
struct MyStruct {
    #[serde(serialize_with = "taceo_ark_serde_compat::bn254::serialize_fr")]
    #[serde(deserialize_with = "taceo_ark_serde_compat::bn254::deserialize_fr")]
    scalar: Fr,

    #[serde(serialize_with = "taceo_ark_serde_compat::bn254::serialize_g1")]
    #[serde(deserialize_with = "taceo_ark_serde_compat::bn254::deserialize_g1")]
    point: G1Affine,
}

Serialization Formats

Human-Readable Formats (JSON)

Field Elements

Field elements (Fr, Fq) are serialized as decimal strings:

"12345678901234567890"

BN254 G1 Points

G1 points are serialized in projective coordinates [x, y, z]:

["1", "2", "1"]

The point at infinity is represented as:

["0", "1", "0"]

BN254 G2 Points

G2 points are serialized as [[x0, x1], [y0, y1], [z0, z1]]:

[["1", "2"], ["3", "4"], ["1", "0"]]

BabyJubJub Points

BabyJubJub points are serialized in affine coordinates [x, y]:

["123", "456"]

Non-Human Readable Formats (Binary)

For non-human readable serializers like bincode and CBOR, all arkworks types are serialized using ark-serialize in compressed mode. This provides efficient binary serialization that is significantly more compact than the JSON representation.

The same serde attributes work for both human-readable and non-human readable formats:

use serde::{Serialize, Deserialize};
use ark_bn254::Fr;

#[derive(Serialize, Deserialize)]
struct MyStruct {
    #[serde(serialize_with = "taceo_ark_serde_compat::serialize_f")]
    #[serde(deserialize_with = "taceo_ark_serde_compat::deserialize_f")]
    field: Fr,
}

// Example usage
let my_struct = MyStruct { field: Fr::from(42u64) };

// Works with JSON
let json = serde_json::to_string(&my_struct)?;

// Also works with bincode (uses compressed ark-serialize)
let binary = bincode::serde::encode_to_vec(&my_struct, bincode::config::standard())?;

License

See the repository LICENSE file for details.

Commit count: 0

cargo fmt