Сообщение об ошибке
Malformed base64 encoding
Также выводится как
- error code: -3 error message: Malformed base64 encoding
`bitcoin-cli` выводит перед текстом «error code: -3» и «error message:». Корректная строка base64, которая не содержит действительной подписи, даёт `false`, а не ошибку.
Bitcoin Core RPC — verifymessage with a signature that is not base64
Что это означает
`verifymessage` ожидает компактную подпись длиной 65 байт в стандартном base64 (88 символов, обычно начинается с `H`, `I`, `G` или `J`). Переданная строка — некорректный base64, поэтому Core даже не пытался восстановить ключ и вернул ошибку RPC -3. Сама подпись может быть верной — она просто в неправильной текстовой кодировке.
Почему это происходит
Hex вместо base64
частоПриложения и SDK аппаратных кошельков часто возвращают подписи в hex (130 символов). Core их отклоняет.
Подпись повреждена в URL или форме
иногда`+` превратился в пробел при декодировании формы, `%2B`/`%3D` остались закодированными, или веб-библиотека выдала base64url (`-`, `_`).
Подпись Ethereum
иногдаПодпись `0x…` из `personal_sign` — это другая схема (префикс EIP-191, другое соглашение о значении v), и это не base64.
Как исправить
- 1.
Преобразуйте подписи из hex в base64
Декодируйте hex в 65 байт и закодируйте их в стандартный base64 без переносов строк.
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-кодирование и кодирование base64url
Сначала декодируйте процентное кодирование (percent-encoding), затем преобразуйте base64url в стандартный base64 с дополнением.
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