什么是 Bitcoin Cash 地址转换器?
Bitcoin Cash 地址转换器在同一个 BCH 账户的两种写法之间进行转换:一种是 CashAddr 规范定义的 CashAddr 形式 bitcoincash:q… / p…,另一种是从比特币继承而来的 Legacy Base58Check 形式 1… / 3…。两者包含的都是同一个公钥(P2PKH)或脚本(P2SH)的 160 位哈希,区别仅在于编码方式和校验和。
CashAddr 编码原理
- 版本字节。一个字节,高位存放类型(0 = P2PKH,1 = P2SH),低三位编码哈希长度(0 = 160 位,3 = 256 位)。
- 按 5 位重新分组。将版本字节与哈希拼接后重新切分为 5 位一组,并用零位补齐,与 bech32 的做法完全一致。
- 校验和。使用生成多项式常量 0x98f2bc8e61、0x79b76d99e2、0xf33e5fb3c4、0xae2eabe2a8 和 0x1e4f43e470,对展开后的前缀(每个字符的低 5 位,再加一个零)、载荷和八个零组计算 40 位 BCH 码,并把得到的八个校验和组追加到末尾。
- 字符表。每一组都用 32 个字符的字符集
qpzry9x8gf2tvdw0s3jn54khce6mua7l书写,因此字符串中绝不会出现 1、b、i 或 o。
示例
规范中的第一个测试向量是 1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu。Base58Check 解码得到版本 0x00(P2PKH)和 hash160 76a04053bda0a88bda5177b86a15c3b29f559873。在前面加上 CashAddr 版本字节 0x00,按 5 位重新分组并追加校验和,就得到 bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a。同一哈希的 P2SH 变体在 Legacy 形式下以 3 开头(3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC),在 CashAddr 下以 p 开头(bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq)。把其中任意一个粘贴到上方,即可实时查看转换结果。
格式速览
| 形式 | 示例 | 校验和 | 能否与 BTC 区分? |
|---|---|---|---|
| Legacy P2PKH | 1…,26–35 个字符 | 4 字节双重 SHA-256 | 否 |
| Legacy P2SH | 3…,34 个字符 | 4 字节双重 SHA-256 | 否 |
| CashAddr P2PKH | bitcoincash:q…,前缀后 42 个字符 | 40 位 polymod | 能 |
| CashAddr P2SH | bitcoincash:p…,42 个字符 | 40 位 polymod | 能 |
| CashAddr P2SH-32 | bitcoincash:p…,62 个字符 | 40 位 polymod | 能,无 Legacy 形式 |
| 测试网 | bchtest:q… 或 m… / n… / 2… | 相同 | 仅凭前缀 |
为什么 Legacy 警告很重要
交易所至今仍在为 BCH 充值显示 Legacy 地址,用户也仍会把比特币地址粘贴进 BCH 提币表单。由于字节完全相同,一笔发往比特币用户 1… 地址的 BCH 交易是有效的,并且会在 Bitcoin Cash 链上确认,而收款方的钱包根本不会去看那条链。币并没有被销毁,但只有持有该私钥的人才能用 BCH 钱包把它们转走,而大多数收款方根本不知道该怎么做。在发送前把每个地址都转换为 CashAddr 可以消除这种歧义:能接受 bitcoincash: 的钱包一定是 BCH 钱包。
典型用途
- 把老交易所提供的 Legacy 充值地址转换成现代钱包和收款二维码生成器所需的 CashAddr 形式。
- 检查一个不带前缀粘贴过来的
q…字符串属于主网还是bchtest。 - 提取 hash160 以构建或验证脚本,或比较同一地址的两种写法。
比特币本身请使用比特币地址验证器;通用 bech32 字符串请使用 bech32 编码 / 解码器。