区块链地址简介
在去中心化金融和分布式账本的世界中,“地址”是用于接收资金的公共标识符。虽然我们经常将它们视为长串的字母数字字符,但这些字符串是精心设计的编码方案的结果,旨在提高人类可读性、错误检测和空间效率。
了解这些编码方案(如 Base58、Bech32 和 EIP-55)对于开发人员、安全研究人员和资深用户至关重要。本指南深入探讨了定义区块链地址如何构造和验证的技术标准。
1. Base58 和 Base58Check:比特币的遗产
比特币的原始地址格式(以 1 或 3 开头的传统地址)使用 Base58 编码。
为什么选择 Base58?
标准的 Base64 编码包含容易被人类混淆的字符,例如 0(数字零)和 O(大写字母 O),或 I(大写字母 I)和 l(小写字母 L)。Base58 由中本聪专门设计,旨在消除这些歧义字符。
Base58 字母表:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Base58Check:添加错误检测
为了防止用户意外地将资金发送到输入错误的地址,比特币使用 Base58Check。这在编码之前向有效载荷添加了 4 字节的校验和。
Base58Check 过程:
- 版本字节:添加前缀以指示地址类型(例如,P2PKH 为
0x00,P2SH 为0x05)。 - 有效载荷:公钥的实际哈希值 (RIPEMD-160)。
- 校验和计算:计算
SHA256(SHA256(版本 + 有效载荷))。结果的前 4 个字节就是校验和。 - 连接:
版本 + 有效载荷 + 校验和。 - Base58 编码:将整个连接的字节数组转换为 Base58 字符串。
如果更改了一个字符,校验和验证将失败,从而保护用户免受输入错误的影响。
2. Bech32 和 Bech32m:SegWit 及以后
随着比特币随着 SegWit(隔离见证)的发展,需要一种新的地址格式。Bech32(在 BIP 173 中定义)成为了原生 SegWit 地址的标准(以 bc1q 开头)。
Bech32 的优势
- 不区分大小写:Bech32 字符串全为小写(尽管也可以是大写,但禁止混用)。这使得它们更容易输入和朗读。
- 二维码效率:因为只使用小写字母和数字,Bech32 在二维码中效率更高。
- 更好的错误检测:Bech32 使用 BCH 码,可以检测多达 4 个错误,并有可能纠正它们。
- 没有 Base58 歧义:它使用的字符集排除了容易混淆的字符。
Bech32 字母表:
qpzry9x8gf2tvdw0s3jn54khce6mua7l(注意排除了 1, b, i, o)。
Bech32m:修复“1”字符问题
2021 年,引入了 Bech32m (BIP 350) 以修复原始 Bech32 在与 Taproot(v1 见证程序)及更高版本一起使用时的一个次要漏洞。Bech32m 现在是 Taproot 地址 的标准(以 bc1p 开头)。
3. 以太坊地址格式和 EIP-55 校验和
与比特币不同,以太坊地址直接源自公钥 Keccak-256 哈希值的最后 20 个字节。它们通常表示为以 0x 开头的十六进制字符串。
缺乏内置校验和
最初,以太坊地址没有内置校验和。如果您在标准 0x 地址中输入错了一个字符,资金将直接发送到无效或无法到达的目的地。
EIP-55:混用大小写校验和
为了在不改变地址长度的情况下解决这个问题,Vitalik Buterin 提出了 EIP-55。它使用大写字母来编码校验和。
EIP-55 算法:
- 将地址转换为小写(不包括
0x)。 - 计算小写地址字符串的 Keccak-256 哈希值。
- 对于地址中的每个字符 $i$:
- 如果哈希值的第 $i$ 个半字节 $\ge 8$,则将地址的第 $i$ 个字符大写。
- 否则,保持小写。
示例:
- 标准:
0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed - EIP-55:
0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed
一个比特币地址验证器或以太坊地址验证器必须实现这些特定的算法,以确保交易目的地的完整性。
4. 总结表:地址编码对比
| 功能 | Base58Check | Bech32 / Bech32m | EIP-55 (以太坊) |
|---|---|---|---|
| 区块链 | 比特币 (传统) | 比特币 (SegWit/Taproot) | 以太坊 |
| 前缀 | 1 或 3 |
bc1q 或 bc1p |
0x |
| 字符集 | 58 个字符 (字母数字) | 32 个字符 (小写 + 数字) | 16 个字符 (十六进制) |
| 校验和类型 | 双 SHA-256 (4 字节) | BCH 码 | Keccak-256 (混用大小写) |
| 区分大小写 | 是 | 否 (不区分大小写) | 可选 (推荐) |
FAQ:常见区块链编码问题
问:为什么有些比特币地址以 1 开头,而另一些以 3 开头?
答: 以 1 开头的地址是 P2PKH (Pay-to-Public-Key-Hash) 地址。以 3 开头的地址是 P2SH (Pay-to-Script-Hash) 地址,通常用于多重签名或嵌套 SegWit。
问:我可以将 BTC 发送到以太坊地址吗?
答: 不可以。 编码方案和底层加密曲线可能会重叠,但网络协议完全不同。将资产发送到另一条链上的地址通常会导致永久损失。
问:什么是“靓号地址” (Vanity Address)?
答: 靓号地址 是包含特定单词或模式(例如以 1Love... 开头)的区块链地址。这些地址是通过对数百万个密钥对进行暴力破解直到找到匹配的公共哈希而生成的。
问:如何修复“无效地址”错误?
答: 此错误通常表示 校验和验证 失败。仔细检查是否有拼写错误,确保没有混淆 0 和 O,并确认您发送到了正确的网络(例如,不要将 SegWit BTC 发送到仅支持传统地址的钱包)。
结论
区块链地址编码不仅仅是一串字符;它是一个重要的安全层。无论是 Base58Check 的抗误用性、Bech32 的高效性,还是 EIP-55 巧妙的混用大小写校验和,这些标准都确保了数十亿美元的资金可以满怀信心地在全球范围内流动。作为开发人员或用户,精通这些格式是理解去中心化网络技术架构的第一步。