9个不稳定版本 (3个破坏性版本)
0.4.4 | 2023年7月25日 |
---|---|
0.4.3 | 2023年7月25日 |
0.3.2 | 2023年6月1日 |
0.3.1 | 2023年4月8日 |
0.1.0 | 2023年1月22日 |
#352 in 编码
每月下载量 598
用于 19 个crate(直接使用9个)
43KB
669 行
百毒58:易于检查的标识符Base58编码
TL;DR
百毒58是一个配备可选校验和(易于查看和验证)的Base58编码,并包含关于值的可读信息。
概述
今天存在许多二进制到文本编码格式,这些格式是为不同的特定情况设计的。为什么还需要另一个呢?因为我们有对编码短长度唯一标识符的需求——如文件或数据结构哈希、加密公钥、数字身份和证书等。
Baid58
是一个基于Base58编码(“baid”是“base”和“identity”的组合)的唯一标识符表示格式。它设计符合以下标准
- 尽可能短;
- 但仍然可以单次点击复制;
- 与URL配合良好;
- 可能用作文件或目录名;
- 当需要时,可以配备易于视觉验证的校验和信息;
- 包含简单的可读前缀,解释值的含义;
- 依赖于现有的广泛使用的二进制到文本编码。
我们选择了Base58,因为它是最简洁且广泛使用的编码,可以单次点击复制。我们设计了一种方式,可以通过它填充前缀和后缀信息来表示可读标识符(HRI)和校验和,根据用例的不同而采用不同的表示方式,例如
- 文件名:
tommy-fuel-pagoda-7EnUZgFtu28sWqqH3womkTopXCkgAGsCLvLnYvNcPLRt.stl
- 单次点击地址:
stlTommyFuelPagoda07EnUZgFtu28sWqqH3womkTopXCkgAGsCLvLnYvNcPLRt
- 视觉清晰的地址:
stl_tommy_fuel_pagoda_7EnUZgFtu28sWqqH3womkTopXCkgAGsCLvLnYvNcPLRt
- URI或URL的一部分:
stl:7EnUZgFtu28sWqqH3womkTopXCkgAGsCLvLnYvNcPLRt#tommy_fuel_pagoda
如您所见,一个 Baid58
编码的值由以下组件组成
- 使用Base58编码的实际 值(使用比特币风格的Base58编码);
- 可选的 可读标识符(HRI),它可以是主要值的前缀或后缀;
- 可选校验和助记符,表示使用HRI作为哈希键创建的值的BLAKE3哈希的32位最低有效位。助记符使用tothink.com词典创建,由三个易于区分的单词组成。
为什么不...
为什么不使用Base64
因为它包含不能用于URL、文件名中的字符,编码后的字符串不能总是单次选中。
为什么不使用Base58
Base58实际上是在Base58的基础上增加了可选校验和(易于查看和验证)以及关于值的可读信息。
为什么不使用Bech32
Bech32字符串通常太长,而实际上没有真正的优势。
- 据说它们不包含易混淆的字符——但使用校验和并在视觉上以及通过计算机检查时,这并不是问题...
- bech32的“校验和”在视觉上不可区分,大多数人甚至不知道它在哪里。结果是,可以构造一个字符串,即使它有一个正确且不同的校验和,在视觉上仍然相似——人类和计算机都会错过攻击。
- bech32填充了ECC,但如果字符串被破坏,我们可能根本不应该使用它(而不是尝试自动纠正错误)。并且我们可以看到当助记符校验和不匹配时破坏的值;
- 据说Bech32可以产生更短的二维码,但这不是真的:例如,Base58编码的160位比特币P2SH二维码和Bech32编码的160位P2WPK地址的大小完全相同——如果用户没有忘记将地址值转换为大写的话——或者如果未转换为大写,Bech32二维码更大!
因此,我们得到了更长的字符串来读取,非标准的奇怪编码,虚假的安全感——而且没有任何优于Base58的优势,Base58只需要有效的、清晰区分的校验和以及值类型信息——这正是Base58所做到的。
为什么不使用Multiformats
Multiformats由Protocol Labs提供,是一种以一致的方式表示不同的二进制到文本编码和值的方法。然而,有一些原因说明为什么我们不使用它们来满足我们的需求
- 它们不提供任何校验和信息;
- 它们不提供任何可读信息;
- 它们引入了对多种编码的支持,而我们只需要一个符合我们标准的单一编码;
- 它们没有被广泛采用;
- 它们使用非固定长度的整数编码,这从确定性计算和严格类型(Base58在其中使用)的角度来看是不良实践。
使用crate
HRI部分和助记符校验和都可以省略——在这种情况下,我们只有未经修改的Base58
字符串。或者,它们可以使用以下方式使用此crate的丰富功能来格式化,使用rust显示格式化语言
HRI,校验和和分块
人类可读标识符和校验符的存在由精度标志和对齐标志控制。所有选项都可以与下一节中的助记符标志组合;如果存在特定的助记符标志,则不提供校验和。
标志 | HRI | 校验和 | 助记符 | 分隔符 | 示例 |
---|---|---|---|---|---|
无 | 不存在 | 不存在 | 由其他标志定义 | 不适用 | |
.0 |
后缀 | 不存在 | 由其他标志定义 | . |
ID.hri |
.1 |
不存在 | 添加 | 不存在 | 不适用 | ID校验和 |
.2 |
不存在 | 添加 | 不存在 | 不适用 | 分块(ID ) |
.3 |
不存在 | 添加 | 不存在 | 不适用 | 分块(ID校验和 ) |
. N |
保留 | ||||
A< |
前缀 | 不存在 | 由其他标志定义 | A |
hri AID |
A^ |
前缀 | 添加* | 由其他标志定义 | A |
hri AIDchecksum |
A> |
后缀 | 添加* | 由其他标志定义 | A |
IDchecksum Ahri |
* 如果没有提供助记符标志,则添加
校验和的助记符表示
助记符的存在和位置由替代和符号标志定义
标志 | HRI | 校验和 | 助记符 | 分隔符 | 示例 |
---|---|---|---|---|---|
无 | - | 由HRI标志定义 | 不存在 | 不适用 | |
# |
- | - | 后缀(带括号) | # |
ID#单独-lemur-愿望 |
0 |
- | - | 前缀(大写) | 0 |
SoloLemurWishes0ID |
- |
- | - | 前缀(带短横线) | - |
solo-lemur-wishes-ID |
+ |
- | - | 前缀(带下划线) | _ |
solo_lemur_wishes_ID |
如果给出宽度,则用于在值和HRI之间放置多个填充字符。
上述示例格式字符串
- 文件名:
{:-.1}
->tommy-fuel-pagoda-7EnUZgFtu28sWqqH3womkTopXCkgAGsCLvLnYvNcPLRt.stl
- 单击地址:
{:<0}
->stlTommyFuelPagoda07EnUZgFtu28sWqqH3womkTopXCkgAGsCLvLnYvNcPLRt
- 视觉清晰的地址:
{:_<+}
->stl_tommy_fuel_pagoda_7EnUZgFtu28sWqqH3womkTopXCkgAGsCLvLnYvNcPLRt
- URI或URL的一部分:
{::^#}
->stl:7EnUZgFtu28sWqqH3womkTopXCkgAGsCLvLnYvNcPLRt#tommy_fuel_pagoda
- 使用嵌入到ID中的校验和:
{::^}
->stl:2dzcCoX9c65gi1GoJ1LFzb5FcQ9pAc8o3Pj8TpcH2mkAdMLCpP
依赖项
~2MB
~50K SLoC