Skip to content

Benchmarks

How Binius measures up in key real-world tasks

We report benchmark results below in the following form:

  • aws_instance (e.g. C7i.16xlarge, C8g.16xlarge, G6.2xlarge)
  • arch (e.g. GPU/x86/aarch64)
    • Note: For x86/aarch64 we report st/mt to indicate single- vs multi-threaded operation
  • Witness generation time [ms]
  • Proof generation time [ms]
  • Proof verification time [ms]
  • Proof size [KiB]

In order to reproduce our benchmarks in AWS, you can check out our user guide.

Ethereum ECDSA Signature Aggregation

We report our ethsign (ECDSA signature over a 67-byte message) performance.

ProverAWS InstanceArchitectureWitness generation [ms]Proof generation [ms]Proof verification [ms]Proof size [KiB]
Binius64C7i.8xlargex86-mt9.57557.7333.65187.75
Binius64C7i.8xlargex86-st8.403,760.90320.99187.75
Binius64C8g.8xlargeaarch64-mt12.48306.3617.62187.75
Binius64C8g.8xlargeaarch64-st11.323,060.30243.39187.75
Binius64C7i.16xlargex86-mt9.76294.3017.35187.75
Binius64C7i.16xlargex86-st8.63258.4526.33187.75
Binius64C8g.16xlargeaarch64-mt12.78293.9315.19187.75
Binius64C8g.16xlargeaarch64-st11.53402.6834.66187.75

Reproduce Binius64 benchmarks using:

ETHSIGN_SIGNATURES=1 ETHSIGN_MSG_BYTES=67 cargo bench --no-default-features --bench ethsign # single threaded
ETHSIGN_SIGNATURES=1 ETHSIGN_MSG_BYTES=67 cargo bench --bench ethsign # multi threaded

Hash-based Signature Aggregation

We benchmarks a post-quantum hash-based signature aggregation scheme that combines XMSS (eXtended Merkle Signature Scheme) with Winternitz one-time signatures (WOTS), using Keccak-256 for all cryptographic operations (i.e., so suitable for Ethereum).

Configuration parameters:

  • Validators: 16 concurrent signers
  • XMSS tree height: 13 (8,192 signature capacity)
  • WOTS paramters: 4-bit digit resolution and target sum 297
ProverAWS InstanceArchitectureWitness generation [ms]Proof generation [ms]Proof verification [ms]Proof size [KiB]
Binius64C7i.8xlargex86-mt285.603,157.00790.28322.11
Binius64C7i.8xlargex86-st279.2542,148.0010,795.00322.11
Binius64C8g.8xlargeaarch64-mt329.161,685.10342.12322.11
Binius64C8g.8xlargeaarch64-st323.784,187.307,861.60322.11
Binius64C7i.16xlargex86-mt317.51845.92241.48322.11
Binius64C7i.16xlargex86-st317.495,553.501,690.20322.11
Binius64C8g.16xlargeaarch64-mt337.79627.53135.34322.11
Binius64C8g.16xlargeaarch64-st332.918,698.401,027.60322.11

Reproduce Binius64 benchmarks using:

HASHSIGN_VALIDATORS=16 HASHSIGN_TREE_HEIGHT=13 HASHSIGN_SPEC=2 cargo bench --no-default-features -p binius-examples --bench hashsign # single threaded
HASHSIGN_VALIDATORS=16 HASHSIGN_TREE_HEIGHT=13 HASHSIGN_SPEC=2 cargo bench -p binius-examples --bench hashsign # multi threaded

Hashing

We compare our Keccak-256 and Blake2s performance against Polygon Zero's Plonky3 and StarkWare's Stwo provers, respectively.

Keccak-256

In each benchmark, we prove 1,365 keccak-f permutations (matching the benchmark Plonky3 runs):

ProverAWS InstanceArchitectureWitness generation [ms]Proof generation [ms]Proof verification [ms]Proof size [KiB]
Binius64C7i.16xlargex86-mt28.42142.2729.18304.45
Binius64C7i.16xlargex86-st29.18499.26154.66304.45
Binius64C8g.16xlargeaarch64-mt41.00111.8221.74304.45
Binius64C8g.16xlargeaarch64-st41.01711.94111.26304.45
Plonky3C7i.16xlargex86-mt16.70265.0015.801,861.32
Plonky3C7i.16xlargex86-st111.003,920.0015.101,861.08
Plonky3C8g.16xlargeaarch64-mt17.70261.0039.401,861.32
Plonky3C8g.16xlargeaarch64-st108.006,550.0035.701,861.08

Reproduce Binius64 benchmarks using:

KECCAK_PERMUTATIONS=1365 cargo bench --no-default-features --bench keccak # single threaded
KECCAK_PERMUTATIONS=1365 cargo bench --bench keccak # multi threaded
Git info: Plonky3

Blake2s

Here, we test 2,048 Blake2s compressions (matching what Stwo's benchmark does):

ProverAWS InstanceArchitectureWitness generation [ms]Proof generation [ms]Proof verification [ms]Proof size [KiB]
Binius64C7i.16xlargex86-mt17.81222.8171.60360.14
Binius64C7i.16xlargex86-st17.841,030.10478.36360.14
Binius64C8g.16xlargeaarch64-mt26.23166.1545.45360.14
Binius64C8g.16xlargeaarch64-st26.231,537.70249.99360.14
StwoC7i.16xlargex86-mt925.80442.302.5092.50
StwoC7i.16xlargex86-st1,163.301,676.502.6092.50
StwoC8g.16xlargeaarch64-mt1,755.50541.303.3092.50
StwoC8g.16xlargeaarch64-st2,404.103,183.403.3092.50

Reproduce Binius64 benchmarks using:

BLAKE2S_MAX_BYTES=131072 cargo bench --no-default-features -p binius-examples --bench blake2s # single threaded
BLAKE2S_MAX_BYTES=131072 cargo bench -p binius-examples --bench blake2s # multi threaded
Git info: Stwo

Hashing Throughput Comparison

We believe that a fair metric by which to compare provers is hashing throughput, i.e. the amount of input data that these provers can generate a proof-of-hash about, per unit of time. The following charts compare the hashing throughputs of Binius64, Plonky3 and Stwo provers, each generating proofs about Keccak-256 and Blake2s hashes. In each benchmark, we generate a proof about exactly 1 MiB of total input data.

Reproduce Binius64 benchmarks using:

KECCAK_PERMUTATIONS=8192 cargo bench --no-default-features --bench keccak # single threaded
KECCAK_PERMUTATIONS=8192 cargo bench --bench keccak # multi threaded
 
BLAKE2S_MAX_BYTES=1048576 cargo bench --no-default-features -p binius-examples --bench blake2s # single threaded
BLAKE2S_MAX_BYTES=1048576 cargo bench -p binius-examples --bench blake2s # multi threaded
 
BLAKE2B_MAX_BYTES=1048576 cargo bench --no-default-features -p binius-examples --bench blake2b # single threaded
BLAKE2B_MAX_BYTES=1048576 cargo bench -p binius-examples --bench blake2b # multi threaded

Hashing Throughput Comparison (ST)

Hashing Throughput Comparison (MT)