39ce3ad260
Three bytecode-level optimizations to the Schnorr verify path: 1. Replace `by lazy` delegates with direct field init for tag hash prefixes (CHALLENGE_PREFIX, AUX_PREFIX, NONCE_PREFIX). Eliminates Lazy.getValue() interface dispatch + checkcast on every call. 2. Use explicit copyInto parameters everywhere, eliminating the copyInto$default bridge method (bitmask + 3 branches + arraylength per call). 4 calls per verify × 3 using defaults = 12 extra branches removed from the hot path. 3. Extract shared verify computation into verifySchnorrCore(), called by both verifySchnorr() and verifySchnorrFast(). Previously, two ~400-bytecode near-identical methods competed for JIT optimization. Now one hot method gets compiled, and both public methods are thin wrappers (34 and 130 bytecodes). JVM benchmark before: verifySchnorrFast was 5% SLOWER than verifySchnorr (60,930 vs 57,876 ns) due to JIT warmup ordering bias. JVM benchmark after: verifySchnorrFast is 11% faster (50,345 vs 56,143 ns), matching the expected ~14% savings from skipping the field inversion. https://claude.ai/code/session_015CtM5k88rF7WFgX8o2AGNR