VERIFY_MLDSA44
Frost post-quantum Signature verification
Verify an ML-DSA-44 (FIPS 204) post-quantum signature.
| Address | 0x0000000000000000000000000000000000000015 |
|---|---|
| Name | VERIFY_MLDSA44 |
| Minimum gas | 10,500 |
| Input | 3764 bytes (exact) |
| Output | 32 bytes, always |
| Available since | Osaka (Frost) |
Input
msg32 B
signature2420 B
publicKey1312 B
| Offset | Length | Field | Description |
|---|---|---|---|
| 0 | 32 | msg | The message. For a frame transaction this is the 32-byte sig-hash. |
| 32 | 2420 | signature | Standard FIPS 204 ML-DSA-44 signature encoding. |
| 2452 | 1312 | publicKey | Standard FIPS 204 ML-DSA-44 public key encoding. |
Output
A 32-byte word: 1 if the signature is valid, 0 otherwise.
Gas
10,500 (flat, regardless of input)
Priced at ecrecover throughput parity on validator-class hardware, the same method as 0x14. Measured 116.3 µs per verify, giving parity at 10.4k, rounded up to 10,500 for margin. CONSENSUS-CRITICAL: changing this price requires a fresh chain.
Failure behaviour
- Returns the 32-byte zero word — never empty data, and never an error — on an invalid signature, a non-canonical public key, or any input length other than the exact expected size.
- Input is not right-padded.
- Gas is charged in full on every call.
Notes
- ML-DSA-44 is the cheaper parameter set: smaller keys and signatures, and about 35% less gas than ML-DSA-65.
- Apple CryptoKit does not support ML-DSA-44. If you need Secure Enclave custody, use ML-DSA-65 at
0x14. - Same empty-context pure ML-DSA semantics as
0x14, and the same assurance stack.
Calling it
Precompiles have no ABI and no function selector: the input is raw bytes at the exact offsets above. Call with staticcall.
// VERIFY_MLDSA44 at 0x15(bool ok, bytes memory out) = address(0x15).staticcall(input);require(ok, "VERIFY_MLDSA44 reverted");