Сообщение об ошибке
eth_keys.exceptions.BadSignature: Invalid signature
Также выводится как
- BadSignature: Invalid signature
web3.py / eth-account / eth-keys (Python) — BadSignature from public-key recovery
Что это означает
Длина подписи правильная, но её значения не описывают ни одну корректную подпись secp256k1, поэтому восстановить открытый ключ нельзя: r или s равно нулю или не меньше порядка группы, либо r не совпадает с координатой x ни одной точки кривой. Это не то же самое, что подпись другим ключом: по такой подписи без всякого исключения восстанавливается другой адрес. BadSignature означает, что эти байты вообще не подпись.
Почему это происходит
Значение из нулей или значение по умолчанию
частоТестовые данные, заполненные нулями, значение столбца базы данных по умолчанию или пустая подпись, которую клиент дополнил до 65 байт.
Повреждённые байты
иногдаПодписи, повреждённые при преобразовании кодировки туда и обратно (hex ↔ base64, строка ↔ байты), могут по-прежнему иметь длину 65 байт, но уже не задают точку кривой.
Подпись другой схемы
иногдаПодпись P-256 (WebAuthn/ключ доступа) или Ed25519, которая по совпадению имеет длину 64 байта и дополнена байтом v. Это не подпись Ethereum.
Как исправить
- 1.
Считайте такую подпись отклонённой
Перехватывайте BadSignature вместе с ошибками длины и значений и отклоняйте запрос; не пытайтесь повторить с другими значениями 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