无需登录 数据私有 本地保存

比特币地址校验器 - 格式与校验和

17
0
0
0

比特币地址校验器

验证比特币地址的格式与校验和,支持 P2PKH、P2SH、Bech32 及 Taproot 地址类型。

P2PKH P2SH Bech32 P2WPKH Taproot 无效示例

支持的地址类型
P2PKH 传统地址

1 开头

Base58Check 编码

版本前缀:0x00

P2SH 脚本哈希

3 开头

Base58Check 编码

版本前缀:0x05

Bech32 原生隔离见证

bc1q 开头

Bech32 编码,见证版本 0

20 或 32 字节见证程序

Bech32m Taproot

bc1p 开头

Bech32m 编码,见证版本 1

32 字节见证程序(Schnorr)

常见问题与知识点

比特币地址中的校验和(Checksum)是一种错误检测机制。它通过哈希运算生成一串固定长度的验证码,附加在地址数据末尾。当你输入地址时,钱包或工具会重新计算校验和并与地址中的校验和对比——如果不匹配,说明地址在传输或输入过程中出现了错误(如字符抄写错误、遗漏等)。这有效防止了资金发送到无效地址。

Base58Check 使用双重 SHA256 哈希的前 4 字节作为校验和;Bech32/Bech32m 则使用 BCH(Bose-Chaudhuri-Hocquenghem)纠错码生成 6 字符校验和,具有更强的错误检测和定位能力。

目前主流的比特币地址类型有四种:
  • P2PKH(传统地址):以 1 开头,如 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa,使用 Base58Check 编码,版本字节 0x00
  • P2SH(脚本哈希地址):以 3 开头,如 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy,版本字节 0x05,常用于多签和嵌套隔离见证。
  • Bech32(原生隔离见证):以 bc1q 开头,使用 Bech32 编码,见证版本为 0,交易手续费更低。
  • Bech32m(Taproot):以 bc1p 开头,使用 Bech32m 编码,见证版本为 1,支持 Schnorr 签名和更复杂的脚本。

Base58Check 是比特币早期采用的地址编码方案,结合了 Base58 编码和校验和验证:
  1. 取版本前缀(1 字节)+ 有效载荷(如 RIPEMD-160 哈希,20 字节),组成 21 字节数据。
  2. 对 21 字节进行双重 SHA256 哈希,取前 4 字节作为校验和。
  3. 将 21 字节数据 + 4 字节校验和(共 25 字节)使用 Base58 编码为字符串。

Base58 字符集去掉了容易混淆的字符(0OIl),使地址在视觉上更清晰、不易抄错。解码时只需逆操作并验证校验和即可。

Bech32(BIP173)和 Bech32m(BIP350)使用相同的编码结构和字符集,但校验常量不同
  • Bech32:校验常量 = 1,用于见证版本 0(SegWit v0,地址以 bc1q 开头)。
  • Bech32m:校验常量 = 0x2bc830a3,用于见证版本 ≥ 1(Taproot 版本 1,地址以 bc1p 开头;以及未来更高版本)。

这个改动是因为 Bech32 在校验和最后一位为 q 时存在可延展性问题。Bech32m 修复了该问题,确保 Taproot 及未来地址的安全性。

判断比特币地址有效性需要检查以下几个方面:
  • 前缀识别:确认地址以 13bc1(主网)或 m/n2tb1(测试网)开头。
  • 字符集检查:Base58Check 地址只能包含 Base58 字符集;Bech32 地址只能包含 Bech32 字符集且不区分大小写。
  • 长度检查:P2PKH/P2SH 地址解码后应为 25 字节;Bech32 见证程序长度须符合规范(20 或 32 字节)。
  • 校验和验证:这是最关键的步骤——重新计算校验和并与地址中的校验和比对,确保数据完整性。

Taproot(BIP341)是比特币近年来最重要的升级之一,其地址以 bc1p 开头:
  • Schnorr 签名:比 ECDSA 更高效,支持签名聚合,减少多签交易的体积和费用。
  • 隐私增强:复杂脚本(如多签、时间锁)在链上看起来和普通支付一样,外部无法区分。
  • 更低手续费:见证数据更紧凑,交易成本更低。
  • MAST 支持:允许在无需披露未执行分支的情况下进行条件支付。

比特币地址有意避免使用 Base64,因为 Base64 包含容易混淆的字符(如 0OIl+/)。Base58 去除了这些字符,使地址更适合人工阅读和手动输入。Bech32 则进一步优化,使用仅包含小写字母和数字的 32 字符集,且具备BCH 纠错能力——能在一定程度上检测并定位输入错误,对用户体验更加友好。同时 Bech32 的 QR 码编码效率也比 Base58 更高。