- Replace 68 "[here]" links with descriptive text (MD059) - Fix table separator spacing in 6 project files (MD060) - Add trailing newlines to 2 files (MD047) - Disable MD060 rule for .claude/ internal files - Update markdownlint config with MD060: false All project files now pass markdownlint --config .github/.markdownlint.yaml 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4.4 KiB
Motivation
Demonstrate that
FastAggregateVerify is the most
expensive call in ethereum beacon light client, though in #13031
Parity team has wrapped some low level host functions for bls-12381 but adding a high level host function specific
for it is super helpful.
Benchmark
We add several benchmarks the benchmarking module as following to demonstrate bls_fast_aggregate_verify is the main bottleneck. Test data the test data file is real from goerli network which contains 512 public keys from sync committee.
sync_committee_period_update
Base line benchmark for extrinsic sync_committee_period_update
bls_fast_aggregate_verify
Subfunction of extrinsic sync_committee_period_update which does what
FastAggregateVerify requires.
bls_aggregate_pubkey
Subfunction of bls_fast_aggregate_verify which decompress and instantiate G1 pubkeys only.
bls_verify_message
Subfunction of bls_fast_aggregate_verify which verify the prepared signature only.
Result
hardware spec
Run benchmark in a EC2 instance
cargo run --release --bin pezkuwi-teyrchain --features runtime-benchmarks -- benchmark machine --base-path /mnt/scratch/benchmark
+----------+----------------+-------------+-------------+-------------------+
| Category | Function | Score | Minimum | Result |
+===========================================================================+
| CPU | BLAKE2-256 | 1.08 GiBs | 1.00 GiBs | ✅ Pass (107.5 %) |
|----------+----------------+-------------+-------------+-------------------|
| CPU | SR25519-Verify | 568.87 KiBs | 666.00 KiBs | ❌ Fail ( 85.4 %) |
|----------+----------------+-------------+-------------+-------------------|
| Memory | Copy | 13.67 GiBs | 14.32 GiBs | ✅ Pass ( 95.4 %) |
|----------+----------------+-------------+-------------+-------------------|
| Disk | Seq Write | 334.35 MiBs | 450.00 MiBs | ❌ Fail ( 74.3 %) |
|----------+----------------+-------------+-------------+-------------------|
| Disk | Rnd Write | 143.59 MiBs | 200.00 MiBs | ❌ Fail ( 71.8 %) |
+----------+----------------+-------------+-------------+-------------------+
benchmark
cargo run --release --bin pezkuwi-teyrchain \
--features runtime-benchmarks \
-- \
benchmark pezpallet \
--base-path /mnt/scratch/benchmark \
--chain=bridge-hub-pezkuwichain-dev \
--pezpallet=snowbridge_pezpallet_ethereum_client \
--extrinsic="*" \
--execution=wasm --wasm-execution=compiled \
--steps 50 --repeat 20 \
--output ./teyrchains/runtimes/bridge-hubs/bridge-hub-pezkuwichain/src/weights/snowbridge_pezpallet_ethereum_client.rs
Weights
| extrinsic | minimum execution time benchmarked(us) |
|---|---|
| sync_committee_period_update | 123_126 |
| bls_fast_aggregate_verify | 121_083 |
| bls_aggregate_pubkey | 90_306 |
| bls_verify_message | 28_000 |
-
bls_fast_aggregate_verify consumes 98% execution time of sync_committee_period_update
-
bls_aggregate_pubkey consumes 75% execution time of bls_fast_aggregate_verify
-
bls_verify_message consumes 23% execution time of bls_fast_aggregate_verify
Conclusion
A high level host function specific for bls_fast_aggregate_verify is super helpful.