主页 > imtoken钱包下载安卓版 > 比特币中的 Base58 编码

比特币中的 Base58 编码

imtoken钱包下载安卓版 2023-09-03 05:07:38

Base58 和 base64 一样,是一种二进制到可视化字符串算法,主要用于转换大整数值。不同的是,转换后的字符串去掉了几个看起来模棱两可的字符,比如0(零)、O(大写字母O)、I(大写字母i)和l(小写字母L),以及几个影响double的字符- 单击选择,例如 /、+。生成的字符集正好是 58 个字符(包括 9 个数字、24 个大写字母和 25 个小写字母)。在不同的应用实现中,base58查询的最后一个字母可能不同,所以没有具体的标准。以下是几个应用程序中的字母表:

比特币地址:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

门罗地址

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

波纹地址

rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz

Flickr 的短网址

123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ

Base58编解码

Base58的输入是[0,256)的值流比特币编码什么样子,输出结果是[0,58)的值流。然后在字母表中查找每个值,从而产生一个可视字符串。转换过程实际上是将 256 基值转换为 58 基值。

base转换过程如下(下面的伪代码描述了256base转换为58base的过程,base58编码需要查找58base流得到对应的字符流):

# 将 input 256进制流转换为 output 58进制流
for carry in input:
for (outputPos, outputNum) in output.reverse():
carry += outputNum * 256
output[outputPos] = carry % 58
carry /= 58
# output 流处理完毕, carry依然有值, 则继续向 output 前部插入
while carry != 0 :
output.insertFront(carry%58)
carry /= 58

在实现中,开头的 0 需要特殊处理,因为 0 转换后仍然是 0,所以输入流开头的 0 可以直接填在结果前面。

逆转换过程(先将输入字符串转换为58位十六进制流,再将58位十六进制流转换为256位十六进制流。下面的伪代码描述了从58位到256位十六进制的转换过程):

同理,在实现中,开头的0需要特殊处理,因为0转换后还是0,所以输入流开头的0可以直接填在结果前面。

Base58Check

比特币之所以加入Base58算法的改进版,主要是为了解决Base58导出的字符串没有验证机制的问题。这样,在传播过程中,如果省略了几个字符,就不会被检测到。因此,使用了算法 Base58Check 的改进版本。

实现方式是:在编码前,在输入流的末尾加上输入内容的哈希值(4字节)。然后对输入流执行 Base58Encode。

解码时:先Base58Decode比特币编码什么样子,然后分成两部分(内容和校验值),判断对内容计算的校验值和校验值字段是否一致。

Go 的 base58 库:

比特币Base58相关源码地址: