#binary-encoding #json-format #decimal #bls12-381 #serialization #circom #fr #human-readable-formats #ark-serialize #g1-affine

taceo-ark-serde-compat

Various 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.

7 unstable releases (3 breaking)

Uses new Rust 2024

new 0.4.1 Feb 5, 2026
0.4.0 Feb 2, 2026
0.3.0 Dec 10, 2025
0.2.1 Nov 20, 2025
0.1.0 Oct 29, 2025

#231 in Encoding

Download history 93/week @ 2025-10-23 870/week @ 2025-10-30 690/week @ 2025-11-06 754/week @ 2025-11-13 1595/week @ 2025-11-20 990/week @ 2025-11-27 1874/week @ 2025-12-04 1092/week @ 2025-12-11 281/week @ 2025-12-18 238/week @ 2025-12-25 535/week @ 2026-01-01 2135/week @ 2026-01-08 4173/week @ 2026-01-15 4639/week @ 2026-01-22 4568/week @ 2026-01-29

15,877 downloads per month
Used in 16 crates (5 directly)

MIT/Apache

95KB
1.5K SLoC

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 CBOR (uses compressed ark-serialize)
let mut b = Vec::new();
ciborium::into_writer(&my_struct, &mut b)?;

License

See the repository LICENSE file for details.

Dependencies

~6MB
~109K SLoC