Performance measurements of libbitcoin-server across machines and configurations, some with Bitcoin Core, libsecp256k1, or UltrafastSecp256k1 comparisons.
See also server performance.
| Acceleration | Algorithm | Applied to | Method |
|---|---|---|---|
| SSE4.1, AVX2, AVX-512 | SHA-256 | block and transaction hashing, merkle roots | 4, 8 or 16 messages per vector |
| SSE4.1, AVX2, AVX-512 | SHA-512 | SHA-512 hashing | 2, 4 or 8 messages per vector |
| SSE4.1, AVX2, AVX-512 | ChaCha20 | P2P encryption (BIP-324), TLS | 4, 8 or 16 keystream blocks per vector |
| SSE4.1, AVX2, AVX-512 | Poly1305 | P2P encryption (BIP-324), TLS | 2, 4 or 8 blocks per vector |
| SSE4.1, AVX2, AVX-512 | SipHash | compact block short ids | 2, 4 or 8 transactions per vector |
| SSE4.1, AVX2, AVX-512 | AES (bitsliced) | TLS AES-GCM without AES-NI | 8, 16 or 32 counter blocks per vector |
| SHA-NI | SHA-256, SHA-1 | block and transaction hashing, merkle roots | native, with two-message interleaved double hash |
| SHA512 | SHA-512 | SHA-512 hashing | native |
| AES-NI, PCLMULQDQ | AES-GCM | TLS | native, 4 counter blocks interleaved, carry-less GHASH |
| VAES, VPCLMULQDQ | AES-GCM | TLS | 8 or 16 counter blocks per vector |
| AVX-IFMA, AVX-512 IFMA | secp256k1 | batch ECDSA and Schnorr verification, silent payment indexing and scanning | 4 or 8 field multiplies per vector |
| CUDA | secp256k1 | batch ECDSA and Schnorr verification, silent payment indexing and scanning | one signature or output per GPU thread |
| Acceleration | Algorithm | Applied to | Method |
|---|---|---|---|
| NEON | SHA-256 | block and transaction hashing, merkle roots | 4 messages per vector |
| NEON | SHA-512 | SHA-512 hashing | 2 messages per vector |
| NEON | ChaCha20 | P2P encryption (BIP-324), TLS | 4 keystream blocks per vector |
| NEON | Poly1305 | P2P encryption (BIP-324), TLS | 2 blocks per vector |
| NEON | SipHash | compact block short ids | 2 transactions per vector |
| NEON | AES (bitsliced) | TLS AES-GCM without AES | 8 counter blocks per vector |
| SHA2 | SHA-256, SHA-1 | block and transaction hashing, merkle roots | native |
| SHA3 | SHA-512 | SHA-512 hashing | native |
| AES, PMULL | AES-GCM | TLS | native, carry-less GHASH |
| CUDA | secp256k1 | batch ECDSA and Schnorr verification, silent payment indexing and scanning | one signature or output per GPU thread |
All are supported on all operating systems and compilers, except CUDA on macOS. CPU intrinsics are selected at build time. CUDA is selected at runtime when an NVIDIA driver is present, otherwise batches run on the CPU.
bs --hardware Hardware configuration (x64)... aesni....... platform:1 compiled:1. vaes........ platform:1 compiled:1. shani....... platform:1 compiled:1. sha512...... platform:0 compiled:0. sse41....... platform:1 compiled:1. avx2........ platform:1 compiled:1. avx512...... platform:1 compiled:1. avxifma..... platform:0 compiled:0. avx512ifma.. platform:1 compiled:1. cuda........ platform:1 compiled:1. cuda ecc.... platform:1 enabled:0.
bs --hardware Hardware configuration (arm64)... aes......... platform:1 compiled:1. sha......... platform:1 compiled:1. sha3........ platform:0 compiled:0. neon........ platform:1 compiled:1. cuda........ platform:0 compiled:1. cuda ecc.... platform:0 enabled:0.
Platform is what the processor or GPU supports, compiled is what the build includes. A feature with platform 1 and compiled 0 is available but unused, and is enabled by building with its option. CUDA ECC reports whether the GPU has error correcting memory enabled, which is required for strict equivalence of GPU and CPU signature verification. It is enabled by the GPU owner.
| Use | Secret | Operation | Constant time | Faster alternative avoided |
|---|---|---|---|---|
| BIP-324 | ephemeral secp256k1 key | key generation | yes, blinded, full table reads, masked additions | unblinded multiply, direct table lookups |
| ECDH | yes, blinded, fixed exponent inversion | variable time multiply and inversion | ||
| HKDF-SHA-256, FSChaCha20-Poly1305 | yes, by construction | |||
| Silent payment scanning | client scan key | scan key multiply, CPU | yes, constant time in the key | variable time windowed multiply |
| scan key multiply, GPU | no, variable time (omit CUDA to opt out) |
| Use | Secret | Operation | Constant time | Faster alternative avoided |
|---|---|---|---|---|
| ZeroMQ CurveZMQ | Curve25519 keys | X25519 | yes, conditional swap ladder, fixed exponent inversion | variable time inversion |
| XSalsa20-Poly1305 | yes, by construction | |||
| TLS record layer | session keys | AES-GCM, hardware | yes | |
| AES-GCM, no AES instructions | yes, bitsliced AES and portable GHASH | table lookups | ||
| ChaCha20-Poly1305 | yes, by construction | |||
| TLS key exchange | ephemeral private key | X25519 | yes, conditional swap ladder, fixed exponent inversion | variable time inversion |
| ECDHE P-256, P-384 | yes, full table reads | variable time windowed multiply | ||
| TLS key schedule | shared and traffic secrets | HKDF with HMAC-SHA-256/384 | yes, by construction | |
| TLS server signature | certificate private key | ECDSA P-256, P-384, RFC 6979 nonce | yes, full table reads | variable time windowed multiply |
| HTTP basic auth | configured password | SHA-256 of the header, digest comparison | no, early exit reveals only the hash |
GPU silent payment scanning is left variable time, as it is a server scenario in which the scan key is already disclosed to the server. Authentication tag and TLS Finished comparisons are constant time. Operations on public values, including block and transaction signature verification, TLS client certificate verification, and ElligatorSwift decoding, use the faster variable time paths.
Copyright © 2011-2026 libbitcoin developers