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
15,877 downloads per month
Used in 16 crates
(5 directly)
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-serializewith compressed mode for efficient binary serialization.
Features
bn254: Enables serialization support for BN254 curve typesbls12-381: Enables serialization support for BLS12-381 curve typesbabyjubjub: 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