购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.5
base58check编码

为了用更少的符号紧凑地表示长数字,许多计算机系统使用基数大于10的混合字母数字表示法。例如,传统的十进制系统使用10个数字,即0到9,而十六进制系统使用16个符号,它额外增加6个符号,从字母A到F。以十六进制格式表示的数字比等效的十进制表示法表示的数字短。更加紧凑的是,base64表示法使用26个小写字母、26个大写字母、10个数字和2个字符(如+和/),可通过电子邮件等基于文本的媒介传输二进制数据。

base58编码与base64编码类似,同样使用大小写字母和数字,但是省略了一些在某些字体显示时极易混淆或看起来相同的字符。具体来说,base58就是没有数字0、大写字母O、小写字母l、大写字母I,以及符号+和/的base64编码。或者更简单地说,它是一组不包含刚提到的四个字符(0、O、l、I)的大小写字母和数字集合。示例4-2展示了完整的base58字母表。

示例4-2:比特币的base58字母表

为了增强对拼写或转录错误的额外安全性,base58check包含一个base58字母编码的校验和。这个校验和是附加在被编码数据末尾的四个字节。校验和来自编码数据的哈希值,因此可用于检测转录和输入错误。数据输入到base58check,解码程序将计算数据的校验和并将其与数据中包含的校验和进行比较。如果两者不匹配,则会出现错误,base58check编码的数据无效。这可以防止钱包软件接收输入错误的比特币地址作为有效目的地,这将导致资金损失。

要将数据(一个大数字)转换成base58check格式,我们首先要给这些数据添加一个前缀字节,称为“版本字节”。版本字节用于轻松识别被编码的数据类型。例如,前缀为零(十六进制中的0x00)表示这个数据应该作为传统P2PKH输出脚本中的承诺(哈希)。常见的版本前缀列表请见表4-1。

表4-1:base58check版本前缀与编码结果示例

接下来,我们计算“双重SHA”校验和,即对前一结果(前缀与数据拼接而成)应用两次SHA256哈希算法:

从得到的32字节哈希值(哈希的哈希)中,我们只取前四个字节。这四个字节作为错误检测码,或称校验和。然后将校验和附加在末尾。

结果由三部分组成:一个前缀、数据以及校验和。这个结果采用前文描述的base58字母表进行编码。图4-6演示了base58check编码过程。

图4-6:base58check编码——一种面向比特币数据的、base58版本化的,并附带校验和的无歧义编码格式

在比特币系统中,除了公钥承诺外的其他数据,也采用base58check编码以使数据紧凑、易读、易于检测错误。用base58check编码中的版本前缀很容易区分创建的格式,以base58check编码的数据在开头包含一些以base58编码的特定字符。这些字符便于人们识别编码数据的类型以及使用方法。例如,以1开头的base58check编码的是比特币地址,以5开头的base58check编码的是私钥钱包导入格式(Wallet Import Format,WIF),这就非常容易区分。表4-1显示了一些版本前缀和相应的base58编码结果示例。

结合公钥、基于哈希的承诺和base58check编码,图4-7展示了公钥转换为比特币地址的过程。

图4-7:公钥转化为比特币地址的过程 deODoWEtTeP1EySmEgAIr5K6QLaRK7P2lHQwWzxvXFaJDVO7JVrIxOWiwabjOlV+

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开