NethermindEth / NethermindEth/pluto
Improve BLS performance: cache parsed keys, add batch verification, add benchmarks
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 8
- Forks
- 5
- Avg merge
- 4d 16h
- Merged PRs (30d)
- 37
Description
Summary
All BLS operations take raw byte arrays (types.rs#L17-L21), so every call re-deserializes (verify does a G1 decompression per call) and re-runs subgroup checks — verify passes pk_validate = true and sig_groupcheck = true on every invocation. For a DV node the public shares are cluster-constant; nothing is memoized.
There is also no batch verification: blst's verify_multiple_aggregate_signatures is unused, and the hot paths verify one signature at a time — every incoming peer partial signature (parsigex → verify_eth2_signed_data → signing.rs#L148), a nested validators×partials loop in dkg/src/aggregate.rs#L146, and one builder registration per validator in cluster/src/lock.rs#L427.
Additionally, aggregate_public_keys hand-rolls point addition through unsafe FFI and skips per-key subgroup validation — blst's safe AggregatePublicKey::aggregate(..., validate) covers it. A second independent blst wrapper with safe constructors already exists in pluto-frost (crates/frost/src/curve.rs); the ad-hoc scalar helpers in blst_impl.rs duplicate it.
There are no benchmarks: the only criterion setup in the workspace is crates/k1util/benches, while Charon benchmarks its BLS backend (tbls_test.go BenchmarkHerumiImplementation).
Proposed change
- Introduce parsed key/signature types (wrapping
blsttypes) validated once at construction; keep raw bytes only at serialization boundaries. - Add a batch-verification entry point and use it on the partial-signature paths.
- Replace the unsafe aggregation with the blst safe API; consolidate scalar helpers with
pluto-frost's wrappers. - Hoist the O(n²)
scalar_from_u64recomputation out of the interpolation loops —evaluate_polynomialrebuilds the same scalar every iteration andcompute_lagrange_coefficientsreconstructs per-index scalars inside the inner loop; build them once per index. - Add criterion benches (sign/verify/aggregate/threshold_aggregate) using the k1util bench as a template, so wins are measurable.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with crates/crypto/src/blst_impl.rs and trace the verification paths through crates/eth2util/src/signing.rs, dkg/src/aggregate.rs, and cluster/src/lock.rs. Use crates/k1util/benches as the benchmark template and review crates/frost/src/curve.rs for existing wrappers. Done means the proposed caching, batch verification, safe aggregation, scalar-hoisting, and criterion benchmarks are implemented and measurable.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- cryptography, distributed-systems, performance
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100