Fehlermeldung
Malformed base64 encoding
Auch ausgegeben als
- error code: -3 error message: Malformed base64 encoding
`bitcoin-cli` gibt vor dem Text „error code: -3“ und „error message:“ aus. Ein wohlgeformter base64-String, der keine gültige Signatur ist, liefert statt eines Fehlers `false`.
Bitcoin Core RPC — verifymessage with a signature that is not base64
Was der Fehler bedeutet
`verifymessage` erwartet die 65-Byte-Kompaktsignatur in Standard-base64 kodiert (88 Zeichen, meist beginnend mit `H`, `I`, `G` oder `J`). Der übergebene String ist kein gültiges base64, deshalb hat Core gar nicht erst versucht, einen Schlüssel wiederherzustellen, und den RPC-Fehler -3 zurückgegeben. Die Signatur kann korrekt sein – sie liegt nur in der falschen Textkodierung vor.
Warum der Fehler auftritt
Hex statt base64
häufigAnwendungen und Hardware-Wallet-SDKs geben Signaturen oft als Hex zurück (130 Zeichen). Core lehnt sie ab.
In einer URL oder einem Formular beschädigt
gelegentlichEin `+`, das beim Dekodieren des Formulars zum Leerzeichen wurde, `%2B`/`%3D`, die kodiert geblieben sind, oder base64url (`-`, `_`), das eine Web-Bibliothek erzeugt hat.
Eine Ethereum-Signatur
gelegentlichEine mit `0x…` beginnende Signatur aus `personal_sign` folgt einem anderen Verfahren (EIP-191-Präfix, andere Konvention für v) und ist kein base64.
So behebst du den Fehler
- 1.
Hex-Signaturen in base64 umwandeln
Dekodiere den Hex-String zu 65 Byte und kodiere diese in Standard-base64 ohne Zeilenumbrüche.
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.
URL- und base64url-Kodierung rückgängig machen
Dekodiere zuerst die Prozentkodierung und wandle dann base64url in Standard-base64 mit Padding um.
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