Skip to content

Proof benchmarks ​

The benchmark target runs the real production APIs for the three shipped proof families: exact-key bearer with revocation, exact-key holder-bound, and a private proof of VALID revocation-list membership. It measures circuit construction where exposed, first proof generation, randomized repeat generation where exposed, and successful verification. Proof-component sizes and available circuit dimensions are recorded alongside the timings.

Wall-clock values are descriptive observations from a particular machine. They are not thresholds or release promises. Randomized proof encodings can vary in length, so raw samples are retained and the Markdown report shows byte-size ranges rather than treating one run as a fixed size.

Reproduce locally ​

Configure the opt-in real-proof lane against an installed Longfellow package:

sh
cmake -S . -B build-benchmark -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_PREFIX_PATH=/path/to/installed/longfellow \
  -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
  -DSD_JWT_ZK_ENABLE_EXPENSIVE_PROOF_TESTS=ON \
  -DSD_JWT_ZK_BENCHMARK_ITERATIONS=2
cmake --build build-benchmark --target benchmark --parallel 1

The target writes:

  • build-benchmark/benchmarks/sd-jwt-zk-benchmarks.csv — one row per family, operation, and iteration;
  • build-benchmark/benchmarks/sd-jwt-zk-benchmarks.json — the same raw measurements plus commit, version, CPU, OS, compiler, and CMake metadata;
  • build-benchmark/benchmarks/sd-jwt-zk-benchmarks.md — median/min/max timing and proof-component tables for people.

SD_JWT_ZK_BENCHMARK_OUTPUT_DIR changes the destination. The runner can also be invoked directly with python3 scripts/run_benchmarks.py --help when the three real-proof executables have already been built.

proof_bytes is the aggregate proof payload carried by the corresponding API envelope. Component columns split presentation, credential, KB, and revocation proof bytes where those components are independently framed.

Published results ​

The benchmarked-release GitHub workflow attaches all three formats to every semantic release, along with Linux x86-64 and source archives and SHA256SUMS. The Markdown report is also copied into the workflow summary so timings and sizes are visible without downloading an asset.

The first tag in a tagless repository is v1.0.0. Later versions are computed from Conventional Commits by ietf-tools/semver-action: breaking changes bump the major version, feat bumps minor, and fix, perf, refactor, and test commits bump patch. Commits without a configured release prefix do not replace an existing release.