Mensaje de error
Malformed base64 encoding
También se muestra como
- error code: -3 error message: Malformed base64 encoding
`bitcoin-cli` muestra «error code: -3» y «error message:» antes del texto. Una cadena base64 bien formada que no es una firma válida devuelve `false` en lugar de un error.
Bitcoin Core RPC — verifymessage with a signature that is not base64
Qué significa
`verifymessage` espera la firma compacta de 65 bytes codificada en base64 estándar (88 caracteres, que suelen empezar por `H`, `I`, `G` o `J`). La cadena que le pasas no es base64 válido, así que Core ni siquiera intenta recuperar una clave y devuelve el error RPC -3. Puede que la firma sea correcta, pero está en la codificación de texto equivocada.
Por qué ocurre
Hexadecimal en lugar de base64
frecuenteLas aplicaciones y los SDK de billeteras de hardware suelen devolver las firmas en hexadecimal (130 caracteres). Core las rechaza.
Dañada en una URL o un formulario
ocasional`+` convertido en espacio por la decodificación del formulario, `%2B`/`%3D` que siguen codificados, o base64url (`-`, `_`) generado por una biblioteca web.
Una firma de Ethereum
ocasionalUna firma `0x…` de `personal_sign` usa un esquema distinto (prefijo EIP-191, otra convención para v) y no está en base64.
Cómo solucionarlo
- 1.
Convertir las firmas hexadecimales a base64
Decodifica el hexadecimal a 65 bytes y codifícalos en base64 estándar sin saltos de línea.
bash sig_b64=$(printf '%s' "$SIG_HEX" | xxd -r -p | base64 -w0) # 65 bytes -> 88 base64 characters bitcoin-cli verifymessage "$ADDRESS" "$sig_b64" "$MESSAGE" - 2.
Deshacer la codificación URL y base64url
Primero deshaz la codificación porcentual y después convierte base64url a base64 estándar con relleno.
python import base64, urllib.parse sig = urllib.parse.unquote(sig_from_query) # undo %2B / %2F / %3D sig = base64.b64encode(base64.urlsafe_b64decode(sig + "=" * (-len(sig) % 4))).decode() # base64url -> base64