本文探讨了区块链中数据可用性的问题,以及如何通过链下存储(如IPFS和Pinata)和数据可用性层(如Celestia)来解决。Celestia 采用数据可用性抽样(DAS)技术,使用户能够在不下载完整块的情况下验证区块链数据,从而降低了验证成本并提高了去中心化程度。文章还提到了以太坊在数据可用性方面的进展,例如Proto-danksharding和PeerDAS。
这是关于区块链的一系列文章的一部分。如果你是第一次看到这篇文章,我强烈建议从本系列的开头开始阅读。
上次我们见面时,我们简要地浏览了 ZK 技术在区块链中的应用。如果你还记得,ZK 进入区块链有两个主要原因:快速验证和小体积证明。
快速验证很容易理解。验证者的作用是——你猜对了——验证区块!因此,他们完成验证的速度越快,对整个协议就越有利。
至少理论上是这样——正如我们在之前的文章中看到的,这有一些局限性!
但为什么小体积证明如此重要?嗯,我们基本上应该担心两件事。正如我们很快会发现的,这些问题将把我们直接带入今天讨论的核心:数据可用性。
所以,让我们从讨论这个问题开始今天的讨论。
咖啡准备好了吗?我们开始吧!
让我们来谈谈 ZK Rollup 一会儿。
正如我们已经知道的,ZK Rollup 将其状态转换的证明发布到它们各自的 Layer 1。当然,这样做是为了避免发布它们的完整交易历史。但为什么这很重要?
任何发布在 Layer 1 区块链上的内容都需要由验证者检查。为此,信息必须四处传播,以便每个验证者都拥有检查和验证所需的所有信息。
因此,第一个问题以高效通信的形式出现:验证者之间需要共享的信息越多,整体共识速度就越慢。
对于验证者需要检查的任何类型的信息来说,都是如此。由于信息包含在区块中,我们需要注意一个平衡:
我们在区块中塞入多少信息,以及网络会变得多慢
在设计区块链时,这是我们需要担心的关键要素之一。为了解决这个问题,区块链通常会对区块大小设置限制,以保持区块时间的一致性。
如果故事到此结束就好了。但不幸的是,这又产生了一个问题:稀缺性。
如何忘记新冠疫情期间的那些日子……
随着区块链上的流量越来越大,它需要验证的交易也会越来越多。但是由于区块的空间有限,一次只能处理这么多交易。
那么,谁的交易会被包含进去?谁必须等待?
嗯……我们让它自行调节怎么样?当需求量很大时,我们让交易更加昂贵,这样就不是每个人都愿意支付,从而减少了需要处理的交易量。
看到发生了什么吗?我们只是给区块空间贴上了价格标签,并将其价格暴露在供需的拉锯战中。我们创造了一种稀缺资源。
换句话说,将数据发布到区块链不是免费的,因为这些环境中的空间(更准确地说,是持久性内存)是稀缺的,因为它需要是稀缺的,这样网络才不会比糟糕的一天里的树懒还慢。
综合起来,这些因素是我们关心证明大小的原因:为了支付更少的网络费用。
这是数据可用性的根本问题,这个问题的核心源于验证者之间高效通信的需求。
现在,鉴于这些限制,我们能做些什么呢?
根据我们愿意深入到什么程度,有几种不同的方法是可能的。让我们从简单的开始。
让我们先解决房间里的大象:
我们需要把所有东西都放在区块链上吗?
想象一下,你想将一个 JSON 文件附加到某个交易,其中可能包含一些重要的元数据。我们知道从存储的角度来看,这是不理想的:我们想要存储的数据越多,交易成本就会越高。
但是为什么要将该 JSON 文件放在区块链上呢?通常的答案是透明性:我们希望每个人都能访问这些信息,以便于审计。
这完全没问题——但实际上,我们不需要将所有信息都存储在链上,才能使其可审计和透明。我们所需要的只是使用区块链来验证存储在其他地方的某些声称的信息是否正确。
值得庆幸的是,我们可以借助简单的密码学技术来做到这一点。
哈希在这方面非常有用。由于它们的属性,文档的哈希既可以作为几乎唯一的标识符,又可以作为原始文档未被更改的可靠证明。
有了哈希,拆分问题就变得非常容易:只需将文档存储在其他地方,计算其哈希,并将该哈希发布到区块链即可。
很简单,对吧?但是,这里有一个巨大的问题:如果原始数据丢失了怎么办?
哈希函数在设计上是不可逆的,这意味着我们不应该能够从哈希中恢复原始数据。因此,如果数据真的丢失了,那么就无法找回它——而且我们会被一些永久存储在区块链上的毫无意义的哈希所困扰。
是的……不理想。
由于哈希不会消失,我们可以改进存储原始信息的方式。而且,如果我们依靠去中心化来使区块链持久和不可变……为什么不尝试对链下存储做类似的事情呢?
这正是最流行的链下存储系统之一背后的想法:星际文件系统,或简称 IPFS。
IPFS 也是一个由节点组成的分布式网络,其唯一的工作是存储数据。内容本身是内容寻址的,内容的 哈希 兼作其标识符。这确保你检索到的任何数据,无论你从哪里获取它,都没有被篡改过。
你可以想象,设计这样一个系统也伴随着它自身的一系列细微差别。你是对的。
首先,让我们试着设想一下数据实际上会被存储在哪里。每个节点都会保留每个存储项目的完整副本吗?这似乎没有必要——我们可以分摊负载,让每个节点存储一部分文件。只要一个节点拥有你的文件,网络就能够恢复它。
在分布式存储系统的术语中,存储文件的单个节点被称为pin这个文件。只要至少有一个节点 pin 你的文件,一切都会很好——但如果没有发生这种情况,那么信息仍然会丢失。
所以,如果我说这句话,你可能会有点恐慌,特别是如果你一直在使用 IPFS 进行永久存储:IPFS 不保证文件 pinning。
啊啊啊啊啊啊啊
是的,你刚刚读到的。IPFS 更适合于使数据临时可用。
但不要惊慌!
Pinata 本质上是 打了鸡血的 IPFS。
我喜欢这个标志。
它的目标很简单:确保文件在 IPFS 中保持可用。它们提供 pinning 即服务,简而言之,这意味着只要你向它们付费,它们就会确保你的文件始终在 IPFS 上被 pin。实际上,我们可以将 Pinata 视为一组 保证 我们的文件将被永久 pin 的 IPFS 节点——或者至少,只要我们付费。
这听起来不错……但有一个陷阱。你能猜到是什么吗?
站直了,士兵
通过使用 Pinata,你正在将 中心化依赖性 重新引入你的系统。因此,如果 Pinata 出现故障,或者只是决定停止 pin 你的文件,你就会回到原点。此外,你还要信任它们实际上会遵守它们的承诺——如果它们认为你的内容违反了它们的服务条款,没有什么能阻止它们取消 pin 你的文件。
哦,顺便说一句,在我忘记之前:还有 Arweave,它采用了一种不同的永久存储方法 。 Arweave 没有像 Pinata 那样要求持续付款,而是使用一次性预付款模式,用户只需支付一次费用即可永久存储数据。
我不想一直往这篇文章里塞东西,所以这只是你需要自己检查的另一件事!
你知道的,经典的权衡。对于许多应用来说,这是完全可以接受的。但其他应用可能需要更强的保证。
这就把我们带到了探索的下一个层次。
公平地说,到目前为止我们所看到的解决方案对于许多用例来说已经足够了——但我们不能忽视它们涉及某种妥协这一事实。
但我们正在考虑区块链本身之外的解决方案。虽然我们知道这样做的原因,但不可否认的是,区块链更适合解决我们在这些其他链下系统中遇到的这些问题——与 IPFS 相比,区块链是持久的,与 Pinata 相比,它们也是抗审查的和去中心化的。
如果我们能够两全其美呢?我们是否可以拥有一个专为数据可用性而设计而不是通用计算的区块链网络?
答案是 肯定的。这正是 数据可用性层 试图解决的问题。
Celestia 是一个将数据可用性置于其设计中心的区块链的例子。
正如我们之前提到的,大多数区块链都是以这种一站式解决方案的思维方式构建的——但 专业化 具有价值。
为了说明这一点,我们已经看到了从区块链中剥离智能合约功能的案例:Polkadot。其理念是,通过专注于或专门从事某件事,我们可以尝试做得比同时尝试所有事情更好!
Celestia 并非旨在成为通用区块链。它的构思是为了很好地做一件事:使数据可用。这样,其他区块链就可以在这种原生数据可用性的基础上构建,同时弄清楚如何在它们那边处理逻辑。
从技术角度来看,Celestia 特别吸引人的地方在于,它们为许多区块链难以处理的问题提供了一个很好的解决方案。
每当验证者检查一个区块时,很明显他们需要访问其全部内容。我们不想留下任何机会:一切都需要经过彻底审查。因此,他们需要下载整个区块。
但是这里有一个问题:读取区块链的每个人都需要所有这些信息吗?我们是否关心区块的所有内容,或者我们主要关心结果状态?
想想看:大多数用户并不真正关心区块中的大多数交易。并且随着区块变得越来越大,对于这些用户来说,验证链(即验证每个区块)变得不切实际。
当然,他们可以这样做,但他们消耗带宽、内存和资源,而实际上并不需要验证所有内容。
如果只是确保经过验证的区块存在,并且在你真正需要时,它们的信息可用且可访问,那不是更好吗?
Celestia 使用所谓的 数据可用性采样(或简称 DAS)来解决这个问题。
基本上,他们提出的建议是以这样一种方式编码区块,即个人用户可以简单地下载区块信息的一小部分,并保证如果查询,其余信息将在那里。
并且通过足够的块,你可以恢复完整的区块。
为此,他们选择了一种称为 2D Reed-Solomon 编码 的技术。
这是我们已经在 密码学 101 系列中探索过的一种方法的修改,因此你可以阅读该系列以供参考!为了获得完整的兔子洞体验,这里是 实际论文。
为了让你对它的工作原理有一个大致的了解,Celestia 获取区块中的所有交易数据,并将其排列成一个正方形矩阵——假设它的大小为 k × k。然后,它们应用编码技术(Reed-Solomon)将其扩展为 2k × 2k 矩阵,从而在水平和垂直方向上添加冗余。
然后,它们做了一些非常聪明的事情:不是为区块的交易计算单个 Merkle 根,而是为这个 2k × 2k 矩阵的每一行和每一列计算一个 Merkle 根。并使用它创建一个组合所有这些单个根的主 Merkle 根。
你问为什么?好吧,假设你想在不查询完整区块的情况下,验证一些区块的数据是否可用。你可以随机选择这个扩展矩阵中的位置(例如 (15, 7) 和 (33, 21))。你请求这些编码块,并同时请求这些位置的有效 Merkle 证明。
当然,你会收到你选择的每个点的行和列的证明,然后是完整扩展区块的证明。
由于在不知道原始数据的情况下构建任何这些证明都极其困难,因此我们可以非常高概率地说,这些数据的创建者知道并提供了这些数据。
只需采样几个点!
很难想出一个好的类比,但这有点像要求某人证明他们完成了一个 1000 × 1000 片的拼图游戏,而无需向你展示整个拼图游戏。
你随机要求看一些特定的碎片——也许是应该位于 (200, 350) 位置的碎片,以及另一个位于 (750, 125) 位置的碎片。如果他们可以向你展示这些确切的碎片,并以某种方式证明它们与周围的碎片完美契合,那么你可以确信他们实际上拥有完整的拼图游戏。
最后,我们将研究实际存在于 Celestia 区块中的内容。
正如我们所知,这里的目标不是执行智能合约逻辑。这意味着交易没有描述复杂的状态转换函数。
但是……我们存储什么呢?或者换句话说,Celestia 中的交易是什么样的?
好吧,我们正在讨论一个数据可用性层。因此,我们想在区块中提供的是数据。由消耗应用程序提交的任意数据块,称为 blobs。
例如,当 rollup 想要使用 Celestia 时,它会将其交易数据打包到这些 blob 中,并使用 PayForBlobs 交易 提交它们。Blobs 还被组织成 命名空间,在其中它们获得一个标识符,以便不同的 rollup 可以找到自己的数据,而忽略其他所有内容。
总而言之,一个 Celestia 区块 将包含:
请注意,将所有内容联系在一起的 Merkle 证明不是区块的一部分,而是按需生成的。
现在是提醒我们最初是如何到达 Celestia 的好时机。
所有这些技术复杂性服务于一个简单但强大的目的:使任何人都可以在不花费大量金钱购买昂贵硬件或消耗大量带宽的情况下验证区块链数据。
花点时间想想这意味着什么。回想一下,传统上,如果你想真正验证区块链上发生的事情(而不仅仅是信任其他人),你需要运行一个完整节点。这意味着:
数据可用性采样使拥有智能手机的用户可以随机采样一些数据,并获得与运行完整节点的人几乎相同的安全保证。
因此,任何人都可以运行这些所谓的 轻节点 或 客户端,并积极参与验证过程!
真正的突破是将区块链验证从一种昂贵的特权转变为任何人都可以访问的东西。重要的是:
能够负担得起验证的人越多,系统就越去中心化和值得信赖。
有趣的是,Celestia 并不是唯一这样做的区块链:正如我们在之前的文章中已经提到的,Polkadot(和 JAM)以自己的方式并出于自己的目的处理 DA。以太坊也不久前也加入了blob(Proto-danksharding),标志着他们迈向Danksharding的路线图的开始,在最近发布的PeerDAS中,它已经看到了重大升级。
区块链最初并非被认为是分布式数据库的神童。当然,它很好地解决了诸如不变性、抗审查和自动执行之类的问题,但是大规模分布式数据存储根本不在计划之中。
从表面上看,这可能不如其他区块链应用程序那样令人兴奋,但这是其设计中的核心挑战之一。每个区块链架构最终都会遇到同样的问题:我们如何在不使系统无法使用的情况下处理更多数据?
至关重要的是,并非每条数据都需要相同的处理方式。我们可能可以接受将东西存储在链下,但是当需要更强的保证时,基于区块链的原生解决方案可能是最好的。
如果说这篇文章有什么意义的话,那就是为了展示区块链设计中需要解决的挑战的范围和多样性。多年来,许多障碍和障碍都已被克服,但新的障碍和障碍也随之出现。
但是,这似乎只会进一步推动社区发展,社区不断提出巧妙的想法和新的范例。
这真是一个了不起的领域。我真的很喜欢它!
到目前为止,我们已经在本系列中介绍了很多内容。我希望可以稍微激发你的好奇心,以便你可以继续自己学习有关这些奇妙技术的知识。
为了结束这一切,我想回到在当今区块链领域中一直处于中心地位的东西:以太坊。
我们将在终点线见面!
- 原文链接: medium.com/@francomangon...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!