Mensagem de erro
Malformed base64 encoding
Também aparece como
- error code: -3 error message: Malformed base64 encoding
O `bitcoin-cli` imprime “error code: -3” e “error message:” antes do texto. Uma string base64 bem formada que não seja uma assinatura válida retorna `false` em vez de um erro.
Bitcoin Core RPC — verifymessage with a signature that is not base64
O que significa
O `verifymessage` espera a assinatura compacta de 65 bytes codificada em base64 padrão (88 caracteres, geralmente começando com `H`, `I`, `G` ou `J`). A string que você passou não é um base64 válido, então o Core nem tentou recuperar uma chave e retornou o erro RPC -3. A assinatura pode estar correta — ela só está na codificação de texto errada.
Por que acontece
Hexadecimal em vez de base64
comumAplicativos e SDKs de carteiras de hardware costumam retornar assinaturas em hexadecimal (130 caracteres). O Core as rejeita.
Corrompida em uma URL ou em um formulário
ocasional`+` virou espaço na decodificação do formulário, `%2B`/`%3D` ficaram codificados, ou uma biblioteca web gerou base64url (`-`, `_`).
Uma assinatura do Ethereum
ocasionalUma assinatura `0x…` gerada por `personal_sign` segue outro esquema (prefixo EIP-191, outra convenção para v) e não é base64.
Como corrigir
- 1.
Converter assinaturas hexadecimais para base64
Decodifique o hexadecimal em 65 bytes e codifique-os em base64 padrão, sem quebras de linha.
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.
Desfazer a codificação de URL e base64url
Primeiro desfaça a codificação percentual, depois converta base64url para base64 padrão com padding.
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