Benchmarks
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 reportst/mt
to indicate single- vs multi-threaded operation
- Note: For
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.
Prover | AWS Instance | Architecture | Witness generation [ms] | Proof generation [ms] | Proof verification [ms] | Proof size [KiB] |
---|---|---|---|---|---|---|
Binius64 | C7i.8xlarge | x86-mt | 9.57 | 557.73 | 33.65 | 187.75 |
Binius64 | C7i.8xlarge | x86-st | 8.40 | 3,760.90 | 320.99 | 187.75 |
Binius64 | C8g.8xlarge | aarch64-mt | 12.48 | 306.36 | 17.62 | 187.75 |
Binius64 | C8g.8xlarge | aarch64-st | 11.32 | 3,060.30 | 243.39 | 187.75 |
Binius64 | C7i.16xlarge | x86-mt | 9.76 | 294.30 | 17.35 | 187.75 |
Binius64 | C7i.16xlarge | x86-st | 8.63 | 258.45 | 26.33 | 187.75 |
Binius64 | C8g.16xlarge | aarch64-mt | 12.78 | 293.93 | 15.19 | 187.75 |
Binius64 | C8g.16xlarge | aarch64-st | 11.53 | 402.68 | 34.66 | 187.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
Prover | AWS Instance | Architecture | Witness generation [ms] | Proof generation [ms] | Proof verification [ms] | Proof size [KiB] |
---|---|---|---|---|---|---|
Binius64 | C7i.8xlarge | x86-mt | 285.60 | 3,157.00 | 790.28 | 322.11 |
Binius64 | C7i.8xlarge | x86-st | 279.25 | 42,148.00 | 10,795.00 | 322.11 |
Binius64 | C8g.8xlarge | aarch64-mt | 329.16 | 1,685.10 | 342.12 | 322.11 |
Binius64 | C8g.8xlarge | aarch64-st | 323.78 | 4,187.30 | 7,861.60 | 322.11 |
Binius64 | C7i.16xlarge | x86-mt | 317.51 | 845.92 | 241.48 | 322.11 |
Binius64 | C7i.16xlarge | x86-st | 317.49 | 5,553.50 | 1,690.20 | 322.11 |
Binius64 | C8g.16xlarge | aarch64-mt | 337.79 | 627.53 | 135.34 | 322.11 |
Binius64 | C8g.16xlarge | aarch64-st | 332.91 | 8,698.40 | 1,027.60 | 322.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):
Prover | AWS Instance | Architecture | Witness generation [ms] | Proof generation [ms] | Proof verification [ms] | Proof size [KiB] |
---|---|---|---|---|---|---|
Binius64 | C7i.16xlarge | x86-mt | 28.42 | 142.27 | 29.18 | 304.45 |
Binius64 | C7i.16xlarge | x86-st | 29.18 | 499.26 | 154.66 | 304.45 |
Binius64 | C8g.16xlarge | aarch64-mt | 41.00 | 111.82 | 21.74 | 304.45 |
Binius64 | C8g.16xlarge | aarch64-st | 41.01 | 711.94 | 111.26 | 304.45 |
Plonky3 | C7i.16xlarge | x86-mt | 16.70 | 265.00 | 15.80 | 1,861.32 |
Plonky3 | C7i.16xlarge | x86-st | 111.00 | 3,920.00 | 15.10 | 1,861.08 |
Plonky3 | C8g.16xlarge | aarch64-mt | 17.70 | 261.00 | 39.40 | 1,861.32 |
Plonky3 | C8g.16xlarge | aarch64-st | 108.00 | 6,550.00 | 35.70 | 1,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
- Repository: https://github.com/Plonky3/Plonky3.git
- Branch:
main
- Commit:
80803612ff4b6634519e12fa4bf075f679afcc1c
Blake2s
Here, we test 2,048 Blake2s compressions (matching what Stwo
's benchmark does):
Prover | AWS Instance | Architecture | Witness generation [ms] | Proof generation [ms] | Proof verification [ms] | Proof size [KiB] |
---|---|---|---|---|---|---|
Binius64 | C7i.16xlarge | x86-mt | 17.81 | 222.81 | 71.60 | 360.14 |
Binius64 | C7i.16xlarge | x86-st | 17.84 | 1,030.10 | 478.36 | 360.14 |
Binius64 | C8g.16xlarge | aarch64-mt | 26.23 | 166.15 | 45.45 | 360.14 |
Binius64 | C8g.16xlarge | aarch64-st | 26.23 | 1,537.70 | 249.99 | 360.14 |
Stwo | C7i.16xlarge | x86-mt | 925.80 | 442.30 | 2.50 | 92.50 |
Stwo | C7i.16xlarge | x86-st | 1,163.30 | 1,676.50 | 2.60 | 92.50 |
Stwo | C8g.16xlarge | aarch64-mt | 1,755.50 | 541.30 | 3.30 | 92.50 |
Stwo | C8g.16xlarge | aarch64-st | 2,404.10 | 3,183.40 | 3.30 | 92.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
- Repository: https://github.com/starkware-libs/stwo.git
- Branch:
dev
- Commit:
d9176e6e22319370a8501f799829b920c0db2eac
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