coincurve envuelve libsecp256k1 con CFFI y distribuye wheels precompilados, de modo que el código Python obtiene sin compilador la misma implementación de secp256k1 de tiempo constante que usa Bitcoin Core. La versión 21.0.0 publica wheels solo para CPython de 3.10 a 3.13; en Python 3.14, pip recurre a compilar desde el código fuente, lo que falla en imágenes slim sin herramientas de compilación de C: por eso la comprobación se ejecutó en Python 3.12.
Los valores predeterminados se adaptan a Bitcoin más que a Ethereum. sign() calcula el hash del mensaje con SHA-256, usa un nonce RFC 6979 (en la comprobación, la firma coincidió con la de un firmante de referencia independiente) y devuelve una firma DER con s ya en la mitad baja. Ethereum, Nostr y la mayoría de las billeteras calculan el hash con keccak-256 o firman un resumen de 32 bytes, así que pasa un hasher o hasher=None; si dejas el valor predeterminado, obtienes firmas de aspecto válido sobre el hash equivocado.
La verificación hereda el rigor de libsecp256k1. verify() devolvió False para la forma high-S reflejada de una firma válida: una firma de OpenSSL, Java o un KMS en la nube falla aproximadamente la mitad de las veces salvo que s se normalice antes. Una entrada que no es DER lanza ValueError: The DER-encoded signature could not be parsed. en lugar de devolver False; las firmas en bruto de 64 bytes necesitan verify() sobre su codificación DER, y el conversor DER ⇄ en bruto muestra ambas formas.
Más allá del ECDSA básico, sign_recoverable() devuelve la forma r ‖ s ‖ ID de recuperación de 65 bytes y PublicKey.from_signature_and_message() recupera la clave, que es como se derivan las direcciones de Ethereum a partir de las firmas; sign_schnorr() produce firmas BIP-340 para Taproot y Nostr. Las claves públicas son puntos SEC1, comprimidos por defecto; las claves privadas son escalares en bruto de 32 bytes, y to_pem()/to_der() escriben PKCS#8.
El ejemplo muestra ambos modos: el SHA-256 predeterminado y un resumen keccak firmado de forma recuperable, como espera Ethereum. Comprueba los resultados con el verificador de mensajes de Bitcoin o con el verificador de firmas de Ethereum.