Base58Check 编码解码

追加 4 字节双重 SHA-256 校验和并编码为 Base58,或者解码 Base58Check 字符串、校验其校验和,并查看版本字节和有效载荷。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 选择“编码”生成 Base58Check 字符串,或选择“解码”校验字符串并还原字节。
  2. 编码时把输入切换为“十六进制”,先输入版本字节,再输入有效载荷,例如 00 加上 20 字节的 HASH160。
  3. 保持 Base58Check 选项开启。编码时会自动追加校验和,解码时会自动校验。
  4. 解码时粘贴字符串并把输出设为“十六进制”,得到的是去掉校验和后的版本字节和有效载荷。

Base58Check 的工作原理

  1. 先写一个表示数据类型的版本字节,后面接有效载荷,例如 20 字节的公钥哈希。
  2. 对这些字节做一次 SHA-256,再对结果做一次 SHA-256,取前 4 个字节作为校验和。
  3. 把校验和追加到末尾,然后整体用 Base58 编码。每个前导 0x00 字节都会变成 1。

本工具只对你输入的字节计算校验和,不会自动添加版本字节,所以请把版本字节放在输入的开头。解码时,工具会对除最后 4 个字节以外的部分重新计算校验和:一致则返回版本字节和有效载荷,不一致则提示校验和错误。随机输错一个字符而恰好通过校验的概率大约只有四十亿分之一。

常见版本字节

版本字节数据编码结果开头
0x00比特币 P2PKH 地址(20 字节 HASH160)1
0x05比特币 P2SH 地址(20 字节脚本哈希)3
0x6F比特币测试网 P2PKH 地址m 或 n
0x80WIF 私钥(32 字节,压缩公钥对应的私钥再加 0x01)5,压缩格式为 K 或 L

以 bc1 开头的 SegWit 和 Taproot 地址使用 Bech32 编码,而不是 Base58Check,无法在这里解码。XRP Ledger 地址使用相同的校验方式,但字母表不同,请在“字母表”选项中选择 Ripple。

示例:从 HASH160 到地址

与比特币创世区块相关的那个知名地址,由版本字节 00 和一个 20 字节的 HASH160 组成。以十六进制输入并开启 Base58Check,就能得到这个熟悉的地址:

输入(十六进制)  00 62e907b15cbf27d5425399ebf6f0fb50ebb88f18
输出              1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

在代码中,Python 的 base58 包提供 b58encode_check() 和 b58decode_check(),npm 包 bs58check 提供 encode() 和 decode()。

编码规格

字母表1-9 A-Z a-z,去掉 0 O I l
输出体积约 137%,另加 4 字节校验和
填充无
标准Bitcoin Base58Check
区分大小写是

编码示例

输入 (UTF-8)输出
Hello, World!gTazoqFvnegwaKM8v1B33sR
Base64.is6XgW4KVJr8DBmZEAeJ
你好DrMzxHL43oWHbW

常见问题

为什么解码时提示校验和错误?
可能是输错了字符、选错了字母表,或者该字符串只是不带校验和的普通 Base58。Solana 地址、IPFS CID 等普通 Base58 字符串请在 Base58 页面解码。
工具会自动添加版本字节吗?
不会。校验和是对你输入的字节计算的,因此版本字节必须包含在输入中。把输入切换为“十六进制”,先输入版本字节,例如比特币地址用 00。
可以解码 WIF 私钥吗?
可以。在“解码”中粘贴私钥并选择十六进制输出,会得到 80、32 字节私钥,压缩格式的私钥末尾还有一个 01。解码完全在浏览器本地进行,但处理真实私钥时仍需谨慎。
可以解码 bc1 开头的地址吗?

不可以。原生 SegWit 和 Taproot 地址使用 Bech32 或 Bech32m,这是另一种带独立校验和的编码。在比特币中,Base58Check 只用于以 1 或 3 开头的传统地址(测试网为 m、n 或 2)。