Los servicios Go que manejan firmas de Ethereum suelen importar github.com/ethereum/go-ethereum/crypto y accounts. Con cgo habilitado, el paquete usa la copia de libsecp256k1 integrada en go-ethereum; con CGO_ENABLED=0 recurre a la implementación de decred escrita en Go puro. La comprobación ejecutó ambas compilaciones y todos los datos resultaron idénticos.
crypto.Sign(hash, key) recibe exactamente 32 bytes (si no, falla con hash is required to be exactly 32 bytes) y no calcula ningún hash ni añade ningún prefijo. Un mensaje de inicio de sesión debe pasar antes por accounts.TextHash, que añade el prefijo EIP-191 y calcula el hash con keccak-256; la comprobación lo contrastó con una implementación independiente de keccak. Si en su lugar firmas el keccak del mensaje sin más, obtienes una firma que nunca coincidirá con la de ethers, viem o las billeteras.
La firma ocupa 65 bytes, con el ID de recuperación como v = 0 o 1, mientras que las billeteras, ethers, viem y web3.py ponen ahí 27 o 28. crypto.Ecrecover rechazó v = 27/28 con invalid signature recovery id, así que resta 27 al recibir la firma y súmalo al enviarla, como hace el ejemplo. Los nonces siguen el RFC 6979 —la firma coincidió con una implementación de referencia independiente— y s siempre es bajo (low-S).
Las dos vías de verificación discrepan sobre high-S. crypto.VerifySignature, que recibe 64 bytes sin v, rechazó la firma reflejada (r, n − s), pero crypto.Ecrecover y crypto.SigToPub recuperaron de ella la clave pública correcta, igual que el contrato precompilado ecrecover de la EVM. Por eso, los contratos y servicios que recuperan direcciones deben rechazar high-S por su cuenta si tratan una firma como identificador único.
Las claves públicas se intercambian como puntos SEC1, ya sean puntos sin comprimir de 65 bytes o puntos comprimidos de 33 bytes, y las claves privadas, como escalares de 32 bytes. Para ver qué convención sigue una firma, pégala en el verificador de firmas de Ethereum; los nonces repetidos entre transacciones de una misma dirección aparecen en el comprobador de reutilización de nonces en Ethereum.