本文介绍了使用多项式插值的纠删码原理,通过Alice向Bob发送消息的例子,展示了如何将消息编码成多项式,并通过发送多项式上的多个点,使得Bob在收到部分点后仍能恢复原始消息。文章还提到了纠删码在QR码、CD以及以太坊beacon链blob数据可用性抽样(DAS)中的实际应用,虽然纠删码增加了数据量,但提高了数据传输的可靠性。
*当 Chuck Norris 使用纠删码时,他不仅仅是保护数据冗余;他创建了一个坚不可摧的冗余堡垒,即使丢失一个字节都感觉像是在向他道歉。*
:::info 定义
纠删码是一种前向纠错 (FEC) 码,它假设存在比特 擦除(而不是比特 错误),它将 `k` 个符号的消息转换为具有 `n` 个符号的更长消息(码字),以便可以从 `n` 个符号的子集中恢复原始消息。 :::
我们现在将看到一个使用多项式的纠删码的例子。
:::warning 警告
本节缺少许多数学形式,并隐藏了许多关于实际实现的细节(例如,实际上我们将在有限域上的多项式上进行运算,而本节在实数上的多项式上进行运算)。
但是,本节让读者掌握使用多项式插值的纠删码的思想。 :::
Alice 有以下 4 字节的消息 `0x160C0B0D`,她想将其传输给 Bob。为此,她使用了一个不可靠的网络(互联网),该网络具有糟糕的、非常容易丢失连接的连接。
Alice 将把消息编码为 6 字节的编码消息,如果 Bob 仅收到编码的 6 字节消息的 任何 75%,他将能够重建初始的 4 字节消息。
任何 这个词在这里非常重要。如果 Bob 收到以下消息,则他必须能够重建初始数据,例如:
:::info 注意
在本节中,我们将使用 3/4 (75%) 的码率,这意味着初始消息大小将增加 50%。 因此,只需要编码消息的 3/4 (75%) 即可重建初始消息。 :::
让我们将 Alice 的 4 字节消息分成 4 个字节:`[0x16, 0x0C, 0x0B, 0x0D]`。 每个字节将代表一个多项式约束。 我们有 4 个约束。
让我们定义一个多项式 `P`,它具有以下约束:
`x` 的计算值为整数 (0, 1, 2, 3)。 `P(x)` 的计算值是 Alice 想要编码的消息的字节。
使用拉格朗日多项式插值,Alice 找到唯一的次数最多为 `4-1 = 3` 的多项式,该多项式符合这 4 个约束。 她得到:
$$ P(x) =-x^3 + \frac{15}{2}x^2 - \frac{33}{2}x + 22 $$
Alice 添加了 2 个扩展点。 她选择 2 个对应于 `x=3` 和 `x=4` 的点。
在这些点处计算 `P` 得到:
Alice 将不会向 Bob 发送 `0x160C0B0D`,而是:
由于 Alice 和 Bob 之间的连接容易丢失,因此 Bob 仅收到 6 个元组中的 4 个:
从收到的字节中,Bob 推断出:
Bob 知道原始消息是 `[P(0), P(1), P(2), P(3)]`。 但是,`P(1)` 和 `P(3)` 丢失了。
Bob 知道这 4 个点属于次数最多为 `3` 的唯一多项式,因此他可以使用拉格朗日插值法重建该多项式(就像 Alice 之前所做的那样,但是使用与 4 字节初始消息相对应的 `4` 个点)。
Bob 最终得到这个多项式(这与 Alice 之前计算的完全相同):
$$ P(x) =-x^3 + \frac{15}{2}x^2 - \frac{33}{2}x + 22 $$
Bob 现在在 `x=1` 和 `x=3` 处计算 `P`。 他发现:
Bob 现在能够重建前 4 个元组: `[(0x00, 0x16), (0x01, 0x0C), (0x02, 0x0B), (0x03, 0x0D)]` 和初始消息:`0x160C0B0D`。
:::info 注意
如果 Bob 收到的点少于 4 个,那么他将无法重建相应的次数最多为 `3` 的唯一多项式。
实际上,他将能够重建无穷多个次数最多为 `3` 的多项式,包括原始多项式。
但是,他不会确切地知道哪个是好的多项式。 :::
:::info 注意
使用这种纠删码技术的优势可能乍看并不明显:
纠删码会消耗更多数据。
但是,这里的重要一点是:
此二维码嵌入了 offchainlabs.com 链接。
如果我们损坏此二维码的某些部分,仍然可以检索嵌入在其中的(纠删码)信息。
一张划痕损坏的光盘(在一定程度上...)可能仍然可读,因为存储在其中的数据经过了纠删码。
这个精确的案例将被详细研究。
- 原文链接: hackmd.io/uImjdfxFT2-xA7...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!