Mensaje de error
eth_keys.exceptions.BadSignature: Invalid signature
También se muestra como
- BadSignature: Invalid signature
web3.py / eth-account / eth-keys (Python) — BadSignature from public-key recovery
Qué significa
La firma tiene la longitud correcta, pero sus valores no describen ninguna firma secp256k1 válida, así que no se puede recuperar ninguna clave pública: r o s es cero o no es menor que el orden de la curva, o r no es la coordenada x de un punto de la curva. Es distinto de una firma hecha con otra clave: esa firma recupera una dirección diferente sin lanzar ninguna excepción. BadSignature significa que los bytes ni siquiera son una firma.
Por qué ocurre
Un valor relleno de ceros o por defecto
frecuenteDatos de prueba (fixtures) rellenos de ceros, el valor por defecto de una columna de la base de datos o una firma vacía que un cliente rellenó hasta 65 bytes.
Bytes dañados
ocasionalLas firmas dañadas por una conversión de codificación de ida y vuelta (hex ↔ base64, cadena ↔ bytes) pueden seguir midiendo 65 bytes, pero ya no representan un punto de la curva.
Una firma de otro esquema
ocasionalUna firma P-256 (WebAuthn/llave de acceso) o Ed25519 que casualmente mide 64 bytes, completada con un byte v. No es una firma de Ethereum.
Cómo solucionarlo
- 1.
Tratarla como una firma rechazada
Captura BadSignature junto con los errores de longitud y de valor, y rechaza la solicitud; no vuelvas a intentarlo con otros valores de v.
python from eth_keys.exceptions import BadSignature from eth_utils.exceptions import ValidationError def recover_or_none(message, signature) -> str | None: try: return Account.recover_message(message, signature=signature) except (BadSignature, ValidationError, ValueError): return None # reject the request: the signature is malformed