ec087304ad
Two optimizations for verifySchnorr: 1. Jacobian x-coordinate check before toAffine: Instead of converting to affine first (1 inversion = ~270 field ops), check X == r·Z² in Jacobian coordinates (1 sqr + 1 mul = 2 ops). Invalid signatures (x mismatch) are rejected immediately without paying the inversion cost. Valid signatures still need inversion for the y-parity check. For Nostr, ~all sigs are valid so this mainly helps adversarial/spam rejection. 2. Inline wNAF zero-checks in mulDoubleG inner loop: ~70% of wNAF digits are zero. Previously, each still called addWnafMixedPP (function call overhead: null checks, frame setup). Now the zero-check is inlined before the call, avoiding ~364 function calls per verify. On ART (5-8ns per call), this saves ~2-3μs. On HotSpot, the JIT already optimized this — no change. https://claude.ai/code/session_01EMY5RnXb9rnsyU2KbXrSaY