Bitcoin Core RPCWeb3 钱包与签名
错误信息
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` 期望的是用标准 base64 编码的 65 字节紧凑签名(88 个字符,通常以 `H`、`I`、`G` 或 `J` 开头)。你传入的字符串不是合法的 base64,因此 Core 根本没有尝试恢复密钥,直接返回了 RPC 错误 -3。签名本身可能没错——只是文本编码不对。
原因
用了十六进制而不是 base64
常见应用程序和硬件钱包 SDK 经常以十六进制(130 个字符)返回签名。Core 会拒绝这种签名。
在 URL 或表单中被损坏
偶见表单解码把 `+` 变成了空格,`%2B`/`%3D` 没有被还原,或者 Web 库生成的是 base64url(`-`、`_`)。
以太坊签名
偶见`personal_sign` 生成的 `0x…` 签名属于另一种方案(EIP-191 前缀、不同的 v 值约定),也不是 base64。
修复方法
- 1.
将十六进制签名转换为 base64
把十六进制解码为 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 编码
先解码百分号编码,再把 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