|
| 1 | +Base58 是一种用于将大数字转换为可读的文本格式的编码方案,广泛用于比特币以及其他多种加密货币的地址。与常见的 Base64 编码类似,Base58 是一种二进制到文本的编码,设计它的主要目的是为了减少混淆并增加地址的可读性。 |
| 2 | + |
| 3 | +### 特点 |
| 4 | +Base58 编码具有几个显著的特点,使其适合用于加密货币地址: |
| 5 | + |
| 6 | +1. **去除视觉上易混淆的字符**:Base58编码不使用数字"0",大写字母"O",大写字母"I",和小写字母"l",因为这些字符在视觉上容易与其他字符混淆。 |
| 7 | +2. **无标点符号**:Base58不包含标点符号,这减少了在抄写或读取地址时出错的可能性。 |
| 8 | +3. **编码效率**:Base58 编码是紧凑的,它使得编码的数据相对较短,便于分享和书写。 |
| 9 | +4. **大小写敏感**:Base58是大小写敏感的,增加了编码的字符集,从而提高了每个字符的信息容量。 |
| 10 | + |
| 11 | +### Base58 字符集 |
| 12 | +Base58使用以下58个字符作为其字母表: |
| 13 | +``` |
| 14 | +123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz |
| 15 | +``` |
| 16 | +注意这里没有0, O, I, l,这是为了避免在读写时的混淆。 |
| 17 | + |
| 18 | +### 应用 |
| 19 | +在比特币和许多其他加密货币中,Base58编码主要用于生成人类可读的公钥哈希(即比特币地址)和私钥的可导入格式。这样的格式不仅容易被人识别和处理,也方便在不同的应用和服务之间进行交易和管理。 |
| 20 | + |
| 21 | +### 技术实现 |
| 22 | +Base58 编码涉及将大整数转换为一种基于58的数制系统。编码过程通常包括以下步骤: |
| 23 | +1. 将初始数据(例如,比特币地址的哈希值)转换为一个大整数。 |
| 24 | +2. 将这个大整数重复除以58,同时记录每次除法的余数。 |
| 25 | +3. 将余数用对应的Base58字符表示,直到整数部分为0。 |
| 26 | +4. 将结果的字符反转,因为在计算过程中,第一个余数实际上对应最后一个Base58字符。 |
| 27 | + |
| 28 | +### 示例 |
| 29 | + |
| 30 | +##### 编码 |
| 31 | +```js |
| 32 | +base10 = 123456789 |
| 33 | + |
| 34 | +123456789 % 58 = 19 <- remainder |
| 35 | + 2128565 % 58 = 23 <- remainder |
| 36 | + 36699 % 58 = 43 <- remainder |
| 37 | + 632 % 58 = 52 <- remainder |
| 38 | + 10 % 58 = 10 <- remainder |
| 39 | + |
| 40 | +base58 = [10][52][43][23][19] |
| 41 | +base58 = BukQL |
| 42 | +``` |
| 43 | + |
| 44 | +#### 解码 |
| 45 | +```js |
| 46 | +base58 = BukQL |
| 47 | + |
| 48 | +L = 19 * 58^0 = 19 |
| 49 | +Q = 23 * 58^1 = 1334 |
| 50 | +k = 43 * 58^2 = 144652 |
| 51 | +u = 52 * 58^3 = 10145824 |
| 52 | +B = 10 * 58^4 = 113164960 |
| 53 | + |
| 54 | +base10 = 19 + 1334 + 144652 + 10145824 + 113164960 |
| 55 | +base10 = 123456789 |
| 56 | +``` |
| 57 | + |
| 58 | +### BTC中的应用 |
| 59 | +Base58 最初仅用于对BTC地址进行编码,在后来引入 WIF 私钥和扩展密钥时也使用Base58编码。 |
| 60 | + |
| 61 | +#### 前缀 |
| 62 | +在比特币中,在转换为 base58 之前,会向数据添加不同的前缀以影响结果的前导字符,这个前导字符有助于我们识别每个 base58 字符串代表什么。 |
| 63 | + |
| 64 | +| Hex Prefix | Base58首字符 | 类型 | 示例 | |
| 65 | +|------------|--------------|------------------|-----------------------------------------------------------| |
| 66 | +| 00 | 1 | 地址 (P2PKH) | 1mGqBH... | |
| 67 | +| 05 | 3 | 地址 (P2SH) | 3JiUY4... | |
| 68 | +| 80 | K, L, 或 5 | WIF私钥 | Lu38mr... | |
| 69 | +| 0488ADE4 | xprv | 扩展私钥 | xprv9t... | |
| 70 | +| 0488B21E | xpub | 扩展公钥 | xpub67... | |
| 71 | + |
| 72 | +#### base58 check |
| 73 | + |
| 74 | +Base58Check 编码是将某些数据编码为 base58 之前向某些数据添加校验和的缩写。 |
| 75 | + |
| 76 | +在BTC的base58编码时 |
| 77 | +1. 首先会对原始数据增加对应的prefix |
| 78 | +2. 对上述结果执行两次SHA-256,取前四个字节做checkSum |
| 79 | +3. 连接1和2的结果进行base58编码 |
0 commit comments