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 编码

Download history 1538/week @ 2024-04-14 1525/week @ 2024-04-21 267/week @ 2024-04-28 390/week @ 2024-05-05 137/week @ 2024-05-12 229/week @ 2024-05-19 128/week @ 2024-05-26 150/week @ 2024-06-02 73/week @ 2024-06-09 159/week @ 2024-06-16 79/week @ 2024-06-23 139/week @ 2024-06-30 49/week @ 2024-07-07 140/week @ 2024-07-14 196/week @ 2024-07-21 188/week @ 2024-07-28

每月下载量 598
用于 19 个crate(直接使用9个)

Apache-2.0

43KB
669

百毒58:易于检查的标识符Base58编码

Build Tests Lints codecov

crates.io Docs Apache-2 licensed

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 hriAID
A^ 前缀 添加* 由其他标志定义 A hriAIDchecksum
A> 后缀 添加* 由其他标志定义 A IDchecksumAhri

* 如果没有提供助记符标志,则添加

校验和的助记符表示

助记符的存在和位置由替代和符号标志定义

标志 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