如何编码和解码 Base58Check
编码:
- 把 hex 粘贴到 输入 · Hex 中:先是版本字节,然后是载荷。空格、冒号和
0x前缀都可以接受。 - 在 输出 · Base58Check 中查看结果。工具会计算校验和,并在编码前把它追加到末尾。
- 对于比特币及大多数分叉币,字母表 保持 Bitcoin 即可。
解码时,在方向切换中点击 Base58Check → Hex,然后粘贴地址或密钥。解码器会转换它、重新计算校验和,只有 4 个校验和字节全部匹配时才返回载荷(仍以版本字节开头)。哪怕输错一个字符,也会提示“校验和不匹配:字符串输错了或已损坏。”
Base58Check 在 Base58 基础上增加了什么
普通的 Base58 没有任何错误检测:输错一个字符会得到另一个同样有效的字符串。Base58Check 通过两项补充解决了这个问题:
version (1 byte) | payload | first 4 bytes of SHA-256(SHA-256(version | payload))
然后对整体做 Base58 编码,所以前导零字节会变成 1。版本字节决定网络和数据类型,而且由于它位于数字的最前面,它也决定了结果的第一个字符。
版本字节与前缀
同一个 20 字节哈希 62e907b15cbf27d5425399ebf6f0fb50ebb88f18 搭配不同的版本字节:
| 版本 | 含义 | 首字符 | 结果 |
|---|---|---|---|
00 | 比特币 P2PKH 地址 | 1 | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa |
05 | 比特币 P2SH 地址 | 3 | 3Ai1JZ8pdJb2ksieUV8FsxSNVJCpoPi8W6 |
6f | 测试网 P2PKH 地址 | m 或 n | mpXwg4jMtRhuSpVq4xS3HFHmCmWp9NyGKt |
c4 | 测试网 P2SH 地址 | 2 | 2N2GDNJ4rEm6NxfMC9ck8VuRdheQzXWaNZv |
第一行是接收比特币创世区块奖励的地址。其他几行只是为了演示版本字节:把公钥哈希套上 P2SH 版本字节并不能得到可用的 P2SH 地址,因为 P2SH 哈希的是脚本。
WIF 私钥
钱包导入格式(WIF)是版本字节为 80、载荷为 32 字节私钥的 Base58Check。末尾多一个 01 字节,表示该密钥的公钥以压缩形式使用。以比特币 wiki 上广为人知的示例密钥为例:
| Hex 输入 | Base58Check |
|---|---|
80 + 0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D | 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ |
同上 + 01 | KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617 |
未压缩的 WIF 密钥以 5 开头,压缩的以 K 或 L 开头。这个示例密钥是公开的,绝不要用它存放真实资金。
在 Python 中使用 Base58Check
校验和只需调用两次标准库中的 SHA-256。配合一个小型 Base58 编码器:
import hashlib
ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
def b58encode(data: bytes) -> str:
n = int.from_bytes(data, "big")
out = ""
while n:
n, r = divmod(n, 58)
out = ALPHABET[r] + out
zeros = len(data) - len(data.lstrip(b"\0"))
return "1" * zeros + out
def b58check(payload: bytes) -> str:
checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
return b58encode(payload + checksum)
b58check(bytes.fromhex("0062e907b15cbf27d5425399ebf6f0fb50ebb88f18"))
# '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'
要在代码中验证一个字符串,先用 Base58 解码,拆出最后 4 个字节,再与其余部分的双重哈希比较。更多 Python 字节处理见 Python 页面。
常见问题
- 校验和不匹配。字符串有输入错误、被截断了,或者是不带校验和的普通 Base58(Solana 地址和 IPFS 哈希都是普通 Base58,请用 Base58 解码器处理它们)。
- “太短,无法包含 4 字节校验和”。解码后的值不足 4 个字节,所以不可能是 Base58Check。
- 意外字符
"0"、"O"、"I"或"l"。它们不在 Base58 字母表中;请检查抄写是否有误。 - 编码后首字符不对。检查版本字节。没有版本字节时,20 字节的哈希通常会编码成不以
1开头的字符串。
常见问题
Base58Check 的校验和是怎么计算的?
对载荷(包括版本字节)做 SHA-256,再对结果做一次 SHA-256,取前 4 个字节。这 4 个字节在 Base58 编码之前追加到载荷后面。
校验和有效,是否意味着可以放心向这个地址转账?
它只说明字符串没有输错:随机的输入错误能通过校验的概率约为 43 亿分之一。它无法说明这个地址由谁控制,也无法说明它是否属于你以为的那个网络。
Base58Check 能解码 bc1 地址吗?
不能。以 bc1 开头的地址是 Bech32 或 Bech32m(SegWit 和 Taproot),使用不同的字母表和不同的校验和。
可以在这里粘贴真实的私钥吗?
转换在你的浏览器中运行,页面也会阻止除 Cloudflare 的浏览量统计以外的所有网络请求,但 WIF 密钥掌控着资金。对于任何有价值的东西,请使用测试密钥,或者在离线电脑上操作。