Mensagem de erro
eth_keys.exceptions.BadSignature: Invalid signature
Também aparece como
- BadSignature: Invalid signature
web3.py / eth-account / eth-keys (Python) — BadSignature from public-key recovery
O que significa
A assinatura tem o comprimento certo, mas os valores dela não descrevem nenhuma assinatura secp256k1 válida, então nenhuma chave pública pode ser recuperada: r ou s é zero ou não é menor que a ordem da curva, ou r não é a coordenada x de um ponto da curva. Isso é diferente de uma assinatura feita com a chave errada — essa recupera um endereço diferente sem nenhuma exceção. BadSignature significa que os bytes nem chegam a ser uma assinatura.
Por que acontece
Um valor zerado ou padrão
comumFixtures de teste preenchidas com zeros, o valor padrão de uma coluna do banco de dados ou uma assinatura vazia completada até 65 bytes por um cliente.
Bytes corrompidos
ocasionalAssinaturas danificadas por uma conversão de ida e volta entre codificações (hex ↔ base64, string ↔ bytes) podem continuar com 65 bytes, mas já não representam um ponto da curva.
Uma assinatura de outro esquema
ocasionalUma assinatura P-256 (WebAuthn/chave de acesso) ou Ed25519 que por acaso tem 64 bytes, completada com um byte v. Não é uma assinatura Ethereum.
Como corrigir
- 1.
Tratar como assinatura rejeitada
Capture BadSignature junto com os erros de comprimento e de valor e rejeite a requisição; não tente de novo com outros 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