本篇将会介绍如何使用Base58Check对比特币数据进行编码。
Base58和Base58Check的基本概念
Base58顾名思义,就是用58进制来表示一个数,可以较少的符号以紧凑的方式表示长数字,类似常见的16进制(用0-9,A-F来表示数字)。相比Base58,更常见的其实是Base64,使用26个小写字母,26个大写字母,10个数字和2个其他字符,例如“+”和“ /”,Base64最常用于向电子邮件添加二进制附件。 Base58是一种基于文本的二进制编码格式,开发用于比特币并用于许多其他加密货币。它在紧凑的表示形式,可读性以及错误检测和预防之间取得了平衡。 Base58是Base64的子集,也使用大写和小写字母和数字,但删除了一些可能会被误认的符号。具体来说,Base58是不带0(数字零),O(大写o),l(小写L),I(大写i)以及符号“+”和“ /”的Base64。
总结一下,Base58中,字符1-9代表值0-8,字母A-Z(除去I和O)代表值9-32,字母a-z(除去l)代表值33-57。
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
而Base58Check是指增加了错误检查码的Base64编码,具体来说,Base64Check在Base64编码末尾添加了四个字节的校验和。校验和来自编码数据的哈希值,可用于检测转录和键入错误。解码软件将数据的校验和与末尾的校验和比较,如果两者不匹配,那么Base58Check数据无效。这样可以防止钱包软件将输入错误的比特币地址作为有效目的地,导致资金损失。
计算Base58Check编码
要将数据(数字)转换为Base58Check格式,首先向数据添加一个称为“版本字节”的前缀prefix,该前缀可轻松识别编码的数据类型。例如,如果是比特币地址,前缀为零(十六进制为0x00),而在编码私钥时使用的前缀为128(十六进制为0x80)。接着做两次SHA256哈希,得到校验和checksum。
checksum = SHA256(SHA256(prefix + data)
生成的checksum为32字节,我们只取前四个字节,添加到数据后面,再用Base58对整个数据进行编码。
完整的示意图如下图所示:
最后,在编码后的数据前面加上前缀prefix2即可成为我们见到的比特币地址。
总的变换公式为
result = prefix2 + Base58Encode(prefix + data + First4Bytes(SHA256(SHA256(prefix + data)))
前缀prefix和prefix2根据编码的数据类型不同而变化,具体如下表:
Type | prefix (Version prefix) | prefix2 (Base58 result prefix) |
---|---|---|
Bitcoin Address | 0x00 | 1 |
Pay-to-Script-Hash Address | 0x05 | 3 |
Bitcoin Testnet Address | 0x6F | m or n |
Private Key WIF | 0x80 | 5, K, or L |
BIP-38 Encrypted Private Key | 0x0142 | 6P |
BIP-32 Extended Public Key | 0x0488B21E | xpub |