-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Description
Background
Currently, the BN128Addition, BN128Multiplication, and BN128Pairing precompiled contracts suffer from performance bottlenecks, leading to transaction timeouts and limiting the application of zero-knowledge proofs on the TRON network, as shown in #4311 and #5492.
The zkBob team has proposed two optimization approaches:
-
The first one, described in #5507, wraps the arkworks cryptographic library via JNI. It offers significantly higher performance, achieving a 3x to 30x speedup for BN128 precompiled contracts.
-
The second one, described in #5611, uses Montgomery optimizations. This results in a 17% performance degradation for
BN128Addition, but offers around 30% improvement forBN128MultiplicationandBN128Pairing.
To optimize BN128 precompiled contract performance, Besu supports two implementations:
-
A pure Java implementation;
-
A gnark-crypto wrapper using JNA.
We conducted a comprehensive benchmark of these implementations:
Test results on macOS (2.6 GHz 6-Core Intel Core i7, 16GB RAM), in microseconds (μs):
| BN128Addition | BN128Multiplication | BN128Pairing (2 pairs) | |
|---|---|---|---|
| java-tron | 32.718 | 2584.739 | 62751.503 |
| arkworks | 12.971 | 97.659 | 1792.001 |
| Montgomery | 41.512 | 1731.617 | 41900.001 |
| besu-java | 6.5 | 14163.3 | 1295543.0 |
| besu-gnark | 4.1 | 55.5 | 654.2 |
On Ubuntu 22.04.5 LTS, AMD x86_64, 16 cores, 32GB RAM, the benchmark results (μs):
| BN128Addition | BN128Multiplication | BN128Pairing (2 pairs) | |
|---|---|---|---|
| java-tron | 23.654 | 1896.336 | 46889.459 |
| arkworks | 5.154 | 83.243 | 1646.457 |
| Montgomery | 29.903 | 1543.336 | 35772.447 |
| besu-java | 2.5 | 10413.6 | 796687.1 |
| besu-gnark | 2.4 | 53.5 | 655.9 |
Taking the Ubuntu results as an example, we can see that integrating arkworks significantly improves the performance of BN128 precompiled contracts on java-tron:
-
BN128Addition: ~2.5× speedup -
BN128Multiplication: ~26× speedup -
BN128Pairing: ~35× speedup
Moreover, java-tron’s performance is far behind the besu-gnark implementation:
-
BN128Addition: ~10× slower -
BN128Multiplication: ~35× slower -
BN128Pairing: ~71× slower
Taking this Groth16 contract example, which involves 6 BN128Addition, 5 BN128Multiplication, and 4 BN128Pairing operations:
-
java-tronexecution time:6×23.654+5×1896.336+2×46889.459≈103402.44 μs
-
arkworksexecution time:6×5.154+5×83.243+2×1646.457≈3740.05 μs( 27.6×faster)
-
besu-gnarkexecution time:6×2.4+5×53.5+2×655.9≈1593.70 μs( 65×faster)
In addition to BN128 precompiled contracts, Besu has also optimized EcRecover and Secp256k1 signature verification. The besu-java implementation uses the BouncyCastle library, while besu-native wraps bitcoin-core/secp256k1 via JNA. We benchmarked and compared their performance as well:
Test results on macOS (2.6 GHz 6-Core Intel Core i7, 16GB RAM), in μs:
| EcRecover | Secp256k1 | ModExp | |
|---|---|---|---|
| java-tron | 1956.975 | 1218.343 | 58.418 |
| besu-java | 959.4 | 891.7 | 21.222 |
| besu-native | 50.6 | 45.3 | 34.585 |
Test results on Ubuntu 22.04.5 LTS, AMD x86_64, 16 cores, 32GB RAM:
| EcRecover | Secp256k1 | ModExp | |
|---|---|---|---|
| java-tron | 916.184 | 875.647 | 20.168 |
| besu-java | 679.2 | 670.2 | 16.428 |
| besu-native | 50.4 | 47.3 | 34.165 |
From the Ubuntu benchmark results, we can see that besu-native achieves ~18× speedup over java-tron in both EcRecover and Secp256k1 signature verification. For ModExp, the performance difference is smaller, possibly due to limited test coverage.
From the above benchmarks, it is clear that optimizing the performance of the BN128 precompiled contracts and other cryptographic algorithms is necessary. The besu-native implementation serves as a strong reference, as it also includes optimized support for Blake2bf and BLS12-381, which can help improve the scalability of the TRON network.
Rationale
Why should this feature exist?
- Optimize the performance of
BN128precompiled contracts to avoid transaction timeouts and promote ZK-based applications on the TRON network; - Accelerate
EcRecoverandSecp256k1signature verification to improve TRON’s scalability; - Optimize additional cryptographic primitives such as
ModExp,Blake2bf, andBLS12-381.
What are the use-cases?
- ZK application developers;
- Reducing signature verification time for all TRON transactions;
Specification
- Replace the current java-tron
BN128precompiled contract implementation with the optimized version; - Replace the current java-tron implementation of
EcRecoverandSecp256k1with optimized versions; - Apply similar performance improvements to other cryptographic primitives.
Test Specification
- Benchmark execution speed of the optimized
BN128precompiled contract and compare it to the current implementation; - Benchmark
EcRecoverandSecp256k1verification performance before and after optimization; - Measure execution time of ZK-related transactions before and after optimization;
- Measure execution time of regular transactions before and after optimization;
Scope Of Impact
BN128andEcRecoverprecompiled contracts;- Reduced transaction processing time by accelerating signature verification;
- Potential gas cost adjustments for affected precompiled contracts;
- Performance improvements must preserve consensus correctness to avoid network forks, requiring proposal-level changes;
- As signature verification is a major performance bottleneck in block production, improvements should be evaluated in the context of block time scheduling.
Implementation
Do you have ideas regarding the implementation of this feature?
Currently, the optimization of BN128 precompiled contracts mainly considers two implementations: arkworks and besu-gnark. The arkworks-based version has already been developed by the zkBob team (see #5507), but recent benchmarks show that besu-gnark performs slightly better. Since besu-native relies on JDK 21, we also need to evaluate how to maintain compatibility with JDK 8.
A thorough discussion is still required to evaluate the advantages and potential risks of each solution before choosing the final optimization path. For EcRecover and Secp256k1, it should also be discussed within the community whether to adopt the optimization strategy used in besu-native.
Are you willing to implement this feature?
Y
Metadata
Metadata
Assignees
Labels
Type
Projects
Status