作者:Kernel Ventures Jerry Luo
TL;DR
1.早期公链要求全网节点保持数据一致性,以确保安全与去中心化。然而,随着区块链生态的发展,存储压力不断增大,导致节点运营出现中心化的趋势。现阶段 Layer1 急需解决 TPS 增长带来的存储成本问题。
2.面对这一问题,开发者需要在兼顾安全性,存储成本,数据读取速度与 DA 层通用性的前提下,提出新的历史数据存储方案。
3.在解决这一问题的过程中,许多新技术与新思路涌现,包括 Sharding,DAS,Verkle Tree,DA 中间组件等。他们分别从减少数据冗余与提高数据校验效率等途径出发,尝试优化 DA 层的存储方案。
4.现阶段的 DA 方案从数据存储位置出发大体分为两类,分别是主链 DA 与第三方的 DA。主链 DA 分别从定期清理数据与对数据分片存储的角度出发,以减小节点存储压力。而第三方 DA 设计需求均旨在为存储服务,对于大量的数据有合理的解决方案。因而主要是在单链兼容性与多链兼容性之间进行 trade-off,提出了主链专用 DA,模块化 DA,存储公链 DA 三种解决方案。
5.支付型的公链对于历史数据安全有极高的要求,适合使用主链作为 DA 层。不过对于运行了很长时间而又有大量矿工在运行网络的公链,采取不涉及共识层又兼顾安全性的第三方 DA 会更加合适。而综合性的公链更适合使用数据容量更大,成本更低又兼顾安全性的主链专用 DA 存储。但是考虑到跨链的需求,模块化 DA 也是不错的选项。
6.总体上来说,区块链正在朝减少数据冗余以及多链分工的方向发展。
1. 背景
区块链作为分布式账本,需要在所有节点上都对历史数据作一份存储,以确保数据存储的安全与足够去中心化。由于每一次状态变动的正确性都与上一个状态(交易来源)有关,为了确保交易的正确性,一条区块链原则上应当存储从第一笔交易产生到当下交易的所有历史记录。以以太坊为例,即便按照平均每个区块 20 kb 的大小估计,当前以太坊区块的总大小也已达到 370 GB,而一个全节点除了区块本身,还要对状态和交易收据记录。算上这部分,单个节点存储总量已超过 1 TB,这使得节点的运营向少数人集中。
以太坊最新区块高度,图片来源:Etherscan
2. DA 性能指标
2.1 安全性
区块链相对于数据库或者链表存储结构而言,其不可篡改性来自于可以通过历史数据对新产生的数据进行校验,因而确保其历史数据的安全性是 DA 层存储中首先要考虑的问题。对于区块链系统数据安全性的评判,我们往往从数据的冗余数量和数据可用性的校验方式进行分析
冗余数量:对于区块链系统中数据的冗余,其主要可以起到以下作用:首先,如果网络中冗余数量越多,当验证者需要查看某个历史区块中的账户状态以对当下某笔交易进行验证的时候,其可以得到最多的样本进行参考,从中选取被大多数节点记载的数据。而在传统的数据库中,由于只在某个节点以键值对的形式存储数据,要更改历史数据只用在单一节点进行,攻击成本极低,理论上说,冗余数量越多,数据的可信程度越高。同时,存储的节点越多,数据相应越不容易丢失。这点也可以对比存储 Web2 游戏的中心化服务器,一旦后台服务器全部关闭,就会出现彻底闭服的情况。但是这个数量也并非越多越好,因为每一份冗余都会带来额外的存储空间,过多数据冗余会给系统带来过大的存储压力,好的 DA 层应该选择一种合适的冗余方式在安全性和存储效率中取得平衡。
数据可用性校验:冗余数量保证了网络中对于数据足够多的记录,但是要使用的数据还要对其准确性和完整性进行校验。现阶段的区块链中常用校验方式是密码学的承诺算法,既保留一个很小的密码学承诺供全网记录,这个承诺由交易数据混合得到的。而要检验某条历史数据的真实性时需要通过该数据还原密码学承诺,检验这个还原得到这个密码学承诺是否和全网的记录一致,如果一致则验证通过。常用的密码学校验算法有 Merkle Root 和 Verkle Root。高安全性的数据可用性验证算法只需要很少的校验数据,可以快速的对历史数据进行校验。
2.2 存储成本
在确保了基础安全性的前提下,DA 层下个需要实现的核心目标便是降本增效。首先是降低存储成本,在不考虑硬件性能差异的情况下,也就是降低存储单位大小数据造成的内存占用。现阶段区块链中降低存储成本的方式主要是采取分片技术以及使用奖励式存储以确保数据被有效存储基础上降低数据备份数量。但是从以上改进方式不难看出,存储成本与数据的安全性存在博弈关系,降低存储的占用也往往意味着安全性的下降。因而一个优秀的 DA 层需要实现存储成本与数据安全性之间的平衡。此外,如果 DA 层如果是一条单独的公链的话,还需要通过尽量减少数据交换所经历的中间过程以减少成本,在每一次中转过程都需要留下索引数据以供后续查询时的调用,因而越长的调用过程就会留有越多的索引数据而增加存储成本。最后,数据的存储成本直接和数据的持久性直接挂钩。一般情况下,数据的存储成本越高,公链越难以对数据持久化存储。
2.3 数据读取速度
实现了降本,下一步便是增效,也就是当需要使用数据时将其迅速从 DA 层中调用出来的能力。这个过程涉及两个步骤,首先是搜寻存储数据的节点,这个过程主要是对于未实现全网数据一致性的公链而言的,如果公链实现了全网节点的数据同步,便可以忽略这一过程的时间消耗。其次,现阶段主流的区块链系统,包括 Bitcoin,Ethereum,Filecoin 中,节点存储方式为 Leveldb 数据库。在 Leveldb 中,数据以三种方式存储。首先是即时写入的数据会存储在 Memtable 类型文件中,当 Memtable 存储满了后则会将文件类型从 Memtable 改为 Immutable Memtable。这两种类型的文件均存储在内存中,但是 Immutable Memtable 文件无法再做更改,只能从中读取数据。IPFS 网络中使用的热存储就是将数据存储在了这个部分,当要调用时就可以快速从内存读取,但是一个普通节点的移动内存往往都是 GB 级别,很容易就会写慢,并且当节点出现宕机等异常情况后,内存中的数据便会永久丢失。如果希望数据持久存储,则需要以 SST 文件的形式存储到固态硬盘(SSD),但读取数据时需要先将数据读到内存,因而大大降低数据索引速度。最后,对于采取了分片存储的系统,其数据还原时需要向多个节点发送数据请求并进行还原,这个过程也会降低数据的读取速度。
Leveldb 数据存储方式,图片来源:Leveldb-handbook
2.4 DA 层通用性
随着 DeFi 的发展,以及 CEX 的种种问题,用户对于去中心化资产跨链交易的要求也不断增长。而无论是采取哈希锁定,公证人还是中继链的跨链机制,都避免不了对两条链上历史数据的同时确定。这个问题的关键在于两条链上数据的分离,不同的去中心化系统中无法实现直接沟通。因而现阶段通过改变 DA 层存储方式提出了一种解决方案,既将多条公链的历史数据存储在同一条可信的公链上,验证的时候只需要在这条公链上调用数据即可。这需要 DA 层能够与不同类型的公链建立安全的通信方式,也就是 DA 层具有较好的通用性。
3. DA 相关技术探索
3.1 Sharding
Sharding 后的数据存储方式,图片来源:Kernel Ventures
3.2 DAS(Data Availability Sampling)
DAS 技术是基于 Sharding 在存储方式上的进一步优化。在 Sharding 过程中,由于节点简单的随机存储,可能会出现某个 Block 丢失的情况。其次,对于分片后的数据,还原过程中如何确认数据的真实性与完整性也非常重要。在 DAS 中,通过 Eraser code 与 KZG 多项式承诺对这两个问题进行了解决。
Eraser code:考虑以太坊庞大的验证节点数量,某个 Block 没有被任何节点存储的概率几乎为 0,但是理论上来说仍然存在这种极端情况发生的可能。为了减轻这一可能造成的存储缺失的威胁,此方案下往往不直接将原始数据切分为 Block 进行存储,而是先将原始数据映射到一个 n 阶多项式的系数上,然后在多项式上取 2n 个点,并让节点从中随机选择一个进行存储。对于这个 n 阶多项式,只需要 n+1 个点便可以进行还原,因而只需要有一半的 Block 有被节点选中,我们便可以实现对原始数据的还原。通过 Eraser code,提高了数据存储的安全程度与网络对于数据的恢复能力。
KZG 多项式承诺:在数据存储中非常重要的一环便是对于数据真实性的检验。在没有采用 Eraser code 的网络中,校验环节可以采用多样的方法,但是如果引入了上文的 Eraser code 以提高数据安全性,那么比较合适的方法是使用 KZG 多项式承诺。KZG 多项式承诺可以直接以多项式的形式对单个 Block 内容校验,从而省去将多项式还原为二进制数据的过程,验证的形式总体与 Merkle Tree 类似,但是不需要具体的 Path 节点数据,只需要 KZG Root 与 Block 数据便可对其真伪进行验证。
3.3 DA 层数据校验方式
数据校验既确保从节点中调用的数据未被篡改且具有没有出现丢失。为了尽可能减少校验过程中所需要的数据量以及计算成本,DA 层现阶段采用树结构做为主流的校验方式。最简单的形式便是使用 Merkle Tree 进行校验,使用完全二叉树的形式记录,只需要保留一个 Merkle Root 以及节点路径上另一侧子树的哈希值便可以进行校验,校验的时间复杂度为 O(logN) 级别(如果 logN 不加底数默认为 log2(N))。虽然已经极大简化了校验过程,但是验证过程的数据量总体还是随着数据的增加而增长。为了解决增加的验证量问题,现阶段提出了另一种验证方式,Verkle Tree。Verkle Tree 中每个节点除了存储 value 还会附带一个 Vector Commitment ,通过原始节点的值和这个承诺性证明就可以快速对数据真实性进行验证,而不需要调用其他姐妹节点的值,这使得每次验证的计算次数只和 Verkle Tree 的深度有关,是一个固定的常数,从而大大加速了验证速度。但是 Vector Commitment 的计算需要同一层所有姐妹节点的参与,这大大增大了写入数据与更改数据的成本。但是对于历史数据这类做永久性存储而不能篡改的数据,只有读而没有写的需求,Verkle Tree 就显得极为合适了。此外 Merkle Tree 与 Verkle Tree 本身还有 K-ary 形式下的变体,其具体实现机制相似,只是改变了每个节点下子树的数量,其具体性能的对比可以见下表。
数据校验方式时间性能对比,图片来源:Verkle Trees
3.4 通用 DA 中间件
区块链生态的不断扩大,随之带来公链数量的不断增加。由于各条公链在各自领域的优势与不可替代性,短时间内 Layer1 公链几无可能走向统一。但是随着 DeFi 的发展,以及 CEX 的种种问题,用户对于去中心化跨链交易资产的要求也不断增长。因此,可以消除跨链数据交互中的安全问题的 DA 层多链数据存储得到了越来越多的关注。但是要接受来自不同公链的历史数据,需要 DA 层提供数据流标准化存储与验证的去中心化协议,比如基于 Arweave 的存储中间件 kvye ,采取主动从链上抓取数据的方式,可以将所有链上的数据以标准的形式存储至 Arweave,以最小化数据传输过程的差异性。相对来说,专门为某条公链提供 DA 层数据存储的 Layer2 通过内部共享节点的方式进行数据交互,虽然降低了交互的成本并提高了安全性,但是具有比较大的局限性,仅能向特定公链提供服务。
4. DA 层存储方案
4.1 主链 DA
4.1.1 类 DankSharding
这类存储方案暂时还没有确定的名称,而其中最突出的代表就是以太坊上的 DankSharding,因而本文中使用类 DankSharding 代称这一类方案。这类方案主要使用了上述的两种 DA 存储技术,Sharding 和 DAS。首先通过 Sharding 将数据分成合适的份数,然后再让每个节点以 DAS 的形式抽取一个数据 Block 进行存储。对于全网节点足够多的情况,我们可以取一个较大的分片数 N,这样每个节点的存储压力只有原来的 1/N,从而实现整体存储空间的 N 倍扩容。同时为了保证防止某个 Block 没有被任一区块存储的极端情况,DankSharding 对数据使用 Eraser Code 进行了编码,只需要一半的数据就可以进行完整还原。最后是对数据的检验过程,使用了 Verkle 树的结构与多项式承诺,实现了快速的校验。
4.1.2 短期存储
对于主链的 DA,一种最为简单的数据处理方式就是对历史数据进行短期存储。本质上来说,区块链所起的是一个公示账本的作用,在全网共同见证的前提下实现对账本内容的更改,而并没有永久化存储的需求。以 Solana 为例,虽然其历史数据被同步到了 Arweave 上,但是主网节点只保留了近两日的交易数据。基于账户记录的公链上,每一时刻的历史数据保留了区块链上账户最终的状态,便足以为下一时刻的更改提供验证依据。而对于这个时间段之前数据有特殊需求的项目方,可以自己在其他去中心化公链上或者交由可信第三方进行存储。也就是说对于数据有额外需求的人,需要对历史数据存储进行付费。
4.2 第三方 DA
4.2.1 主链专用 DA:EthStorage
主链专用DA:DA 层最重要的就是数据传输的安全性,这一点上安全性最高的便是主链的 DA。但是主链存储受到存储空间的限制以及资源的竞争,因而当网络数据量增长较快时,如果要实现对数据的长期存储,第三方 DA 会是一个更好的选择。第三方 DA 如果与主网有更高的兼容性,可以实现节点的共用,数据交互过程中也会具有更高的安全性。因而在考虑安全性的前提下,主链专用 DA 会存在巨大优势。以以太坊为例,主链专用 DA 的一个基本要求是可以与 EVM 兼容,保证和以太坊数据与合约间的互操作性,代表性的项目有 Topia,EthStorage 等。其中 EthStorage 是兼容性方面目前开发最完善的,因为除了 EVM 层面的兼容,其还专门设置了相关接口与 Remix,Hardhat 等以太坊开发工具对接,实现以太坊开发工具层面的兼容。
EthStorage:EthStorage 是一条独立于以太坊的公链,但其上运行的节点是以太坊节点的超群,也就是运行 EthStorage 的节点也可以同时运行以太坊,通过以太坊上的操作码便可以直接对 EthStorage 进行操作。EthStorage 的存储模式中,仅在以太坊主网保留少量元数据以供索引,本质上是为以太坊创建了一个去中心化的数据库。现阶段的解决方案中,EthStorage 通过在以太坊主网上部署了一份 EthStorage Contract 实现了以太坊主网与 EthStorage 的交互。如果以太坊要存入数据,则需要调用合约中的 put() 函数,输入参数是两个字节变量 key, data,其中 data 表示要存入的数据,而 key 则是其在以太坊网络中的标识,可以将其看成类似于IPFS中 CID 的存在。在(key,data)数据对成功存储到 EthStorage 网络后,EthStorage 会生成一个 kvldx 返回给以太坊主网,并于以太坊上的 key 对应,这个值对应了数据在 EthStorage 上的存储地址,这样原来可能需要存储大量数据的问题现在就变为了存储一个单一的 (key,kvldx)对,从而大大降低了以太坊主网的存储成本。如果需要对之前存储的数据进行调用,则需要使用 EthStorage 中的 get() 函数,并输入 key 参数,通过以太坊存储的 kvldx 便可在 EthStorage 上对数据进行一个快速查找。
EthStorage 合约,图片来源:Kernel Ventures
在节点具体存储数据的方式上,EthStorage 借鉴了 Arweave 的模式。首先是对于来自 ETH 的大量 (k,v)对进行了分片,每个 Sharding 包含固定数量个(k,v)数据对,其中每个(k,v)对的具体大小也存在一个限制,通过这种方式保证后续对于矿工存储奖励过程中的工作量大小的公平性。对于奖励的发放,需要先对节点是否存储数据进行验证。这个过程中,EthStorage 会把一个 Sharding(TB 级别大小)分成非常多的 chunk,并在以太坊主网保留一个 Merkle root 以做验证。接着需要矿工首先提供一个 nonce 来与 EthStorage 上前一个区块的哈希通过随机算法生成出几个 chunk 的地址,矿工需要提供这几个 chunk 的数据以证明其确实存储了整个 Sharding。但这个 nonce 不能随意选取,否则节点会选取出合适的 nonce 只对应其存储的 chunk 从而通过验证,所以这个 nonce 必须使得其所生成的 chunk 经过混合与哈希后可以使难度值满足网络要求,并且只有第一个提交 nonce 和随机访问证明的节点才可以获取奖励。
4.2.2 模块化 DA:Celestia
区块链模块:现阶段 Layer1 公链所需执行的事务主要分为以下四个部分:(1)设计网络底层逻辑,按照某种方式选取验证节点,写入区块并为网络维护者分配奖励;(2)打包处理交易并发布相关事务;(3)对将要上链的交易进行验证并确定最终状态;(4)对于区块链上的历史数据进行存储与维护。根据所完成功能的不同,我们可以将区块链分别划分为四个模块,即共识层、执行层、结算层、数据可用性层(DA 层)。
模块化区块链设计:很长一段时间,这四个模块都被整合到了一条公链上,这样的区块链称为单体区块链。这种形式更加稳定并便于维护,但也给单条公链带来了巨大的压力。实际运行过程中,这四个模块之间互相约束并竞争公链有限的计算与存储资源。例如,要提高处理层的处理速度,相应就会给数据可用性层带来更大的存储压力;要保证执行层的安全性就需要更复杂的验证机制但拖慢交易处理的速度。因此,公链的开发往往面临着这四个模块间的权衡。为了突破这一公链性能提升的瓶颈,开发者提出了模块化区块链的方案。模块化区块链的核心思想是将上述的四个模块中的一个或几个剥离出来,交给一条单独的公链实现。这样在该条公链上就可以仅专注于交易速度或者存储能力的提升,突破之前由于短板效应对于区块链整体性能造成的限制。
模块化 DA:将 DA 层从区块链业务中剥离出来单独交由一条公链复杂的方法被认为是面对 Layer1 日益增长历史数据的一种可行解决方案。现阶段这方面的探索仍处于早期阶段,目前最具代表性的项目是 Celestia。在存储的具体方式上,Celestia 借鉴了 Danksharding 的存储方法,也是将数据分成多个 Block,由各个节点抽取一部分进行存储并同时使用 KZG 多项式承诺对数据完整性进行验证。同时,Celestia 使用了先进的二维 RS 纠删码,通过 kk 矩阵的形式改写原始数据,最终只需要 25% 的部分便可以对原始数据实现恢复。然而,数据分片存储本质上只是将全网节点的存储压力在总数据量上乘以了一个系数,节点的存储压力与数据量仍然是保持线性增长。随着 Layer1 对于交易速度的不断改进,节点的存储压力某天仍可能达到一个无法接受的临界。为了解决这一问题,Celestia 中引入了 IPLD 组件进行处理。对于 kk 矩阵中的数据,并不直接存储在 Celestia 上,而是存储在 LL-IPFS 网络中,仅在节点中保留该数据在 IPFS 上的 CID 码。当用户请求某份历史数据时,节点会向 IPLD 组件发送对应 CID,通过该 CID 在 IPFS 上对原始数据进行调用。如果在 IPFS 上存在数据,则会经由 IPLD 组件和节点返回回来;如果不存在,则无法返回数据。
Celestia 数据读取方式,图片来源:Celestia Core
Celestia:以 Celestia 为例,我们可以窥见模块化区块链在解决以太坊存储问题中的落地应用。Rollup 节点会将打包并验证好的交易数据发送给 Celestia 并在 Celestia 上对数据进行存储,这个过程中 Celestia 只管对数据进行存储,而不会有过多的感知,最后根据存储空间的大小 Rollup 节点会向 Celestia 支付相应 tia代币作为存储费用。在Celstia中的存储利用了类似于 EIP4844 中的 DAS 和纠删码,但是对 EIP4844 中的多项式纠删码进行了升级,使用了二维 RS 纠删码,将存储安全进行了再次升级,仅需 25% 的 fractures 便可以对整个交易数据进行还原。本质上只是一条存储成本低廉的 POS 公链,如果要实现用来解决以太坊的历史数据存储问题,还需要许多其他具体模块来与 Celestia 进行配合。比如 Rollup 方面,Celestia 官网上大力推荐的一种 Rollup 模式是 Sovereign Rollup。不同于 Layer2 上常见的 Rollup,仅仅对交易进行计算和验证,也就是完成执行层的操作。Sovereign Rollup 包含了整个执行和结算的过程,这最小化了 Celestia 上对交易的处理,在 Celestia 整体安全性弱于以太坊的情况下,这种措施可以最大提升整体交易过程的安全性。而在以太坊主网 Celestia 调用数据的安全性保障方面,当下最主流的方案是量子引力桥智能合约。对于 Celestia 上存储的数据,其会生成一个 Merkle Root(数据可用性证明) 并保持在以太坊主网的量子引力桥合约上,当以太坊每次调用 Celestia 上历史数据时,都会将其哈希结果与 Merkle Root 进行比较,如果符合才表示其确实是真实的历史数据。
4.2.3 存储公链 DA
在主链 DA 技术原理上,向存储公链借鉴了类似 Sharding 的许多技术。而在第三方 DA 中,有些更是直接借助存储公链完成了部分存储任务,比如 Celestia 中具体的交易数据就是放在了 LL-IPFS 网络上。第三方 DA 的方案中,除了搭建一条单独的公链解决 Layer1 的存储问题之外,一种更直接的方式是直接让存储公链和 Layer1 对接,存储 Layer1 上庞大的历史数据。对于高性能区块链来说,历史数据的体量更为庞大,在全速运行的情况下,高性能公链 Solana 的数据量大小接近 4 PG,完全超出了普通节点的存储范围。Solana 选择的解决方案是将历史数据存储在去中心化存储网络 Arweave 上,只在主网的节点上保留 2 日的数据用来验证。为了确保存储过程的安全性 Solana 与 Arweave 链自己专门设计了一个存储桥协议 Solar Bridge。Solana 节点验证后的数据会同步到 Arweave 上并返回相应 tag。只需要通过该 tag,Solana 节点便可以对 Solana 区块链任意时刻的历史数据进行查看。而在 Arweave 上,不需要全网节点保持数据一致性,并以此作为参与网络运行的门槛,而是采取了奖励存储的方式。首先 Arweave 并没有采用传统链结构构建区块,而更类似一种图的结构。在 Arweave 中,一个新的区块不仅会指向前一个区块,还会随机指向一个已生成的区块 Recall Block。Recall Block 的具体位置由其前一区块与其区块高度的哈希结果决定,在前一区块被挖出之前,Recall Block 的位置是未知的。但是在生成新区块的过程中,需要节点具有 Recall Block 的数据以使用 POW 机制计算规定难度的哈希,只有最先计算出符合难度哈希的矿工才可以获得奖励,鼓励了矿工存储尽可能多的历史数据。同时,存储某个历史区块的人越少,节点在生成符合难度 nonce 时会有更少的竞争对手,鼓励矿工存储网络中备份较少的区块。最后,为了保证节点在 Arweave 中对数据做永久性存储,其引入了 WildFire 的节点评分机制。节点间会倾向于与可以较快的提供更多历史数据的节点通信,而评分等级较低的节点往往无法第一时间获得最新的区块与交易数据从而无法在 POW 的竞争中占取先机。
Arweave 区块构建方式,图片来源:Arweave Yellow-Paper
5. 综合对比
接下来,我们将从 DA 性能指标的四个维度出发,分别对 5 种存储方案的优劣进行比较。
安全性:数据安全问题的最大的来源是数据传输过程中导致的遗失以及来自不诚信节点的恶意篡改,而跨链过程中由于两条公链的独立性与状态不共享,所以是数据传输安全的重灾区。此外,现阶段需要专门 DA 层的 Layer 1 往往有强大的共识群体,自身安全性会远高于普通存储公链。因而主链 DA 的方案具更高的安全性。而在确保了数据传输安全后,接下来就是要保证调用数据的安全。只考虑用来验证交易的短期历史数据的话,同一份数据在临时存储的网络中得到了全网共同的备份,而在类 DankSharding 的方案中数据平均的备份数量只有全网节点数的 1/N,更多的数据冗余可以使得数据更不容易丢失,同时也可以在验证时提供更多的参考样本。因而临时存储相对会有更高的数据安全性。而在第三方 DA 的方案中,主链专用 DA 由于和主链使用公共节点,跨链过程中数据可以通过这些中继节点直接传输,因而也会有比其他 DA 方案相对较高的安全性。
存储成本:对存储成本最大的影响因素是数据的冗余数量。在主链 DA 的短期存储方案中,使用全网节点数据同步的形式进行存储,任何一份新存储的数据需要在全网节点中得到备份,具有最高的存储成本。高昂的存储成本反过来也决定了,在高 TPS 的网络中,该方式只适合做临时存储。其次是 Sharding 的存储方式,包括了在主链的 Sharding 以及第三方 DA 中的 Sharding。由于主链往往有更多的节点,因而相应一个 Block 也会有更多的备份,所以主链 Sharding 方案会有更高的成本。而存储成本最低的则是采取奖励存储方式的存储公链 DA ,此方案下数据冗余的数量往往在一个固定的常数附近波动。同时存储公链 DA 中还引入了动态调节的机制,通过提高奖励吸引节点存储备份较少的数据以确保数据安全。
数据读取速度:数据的存储速度主要受到数据在存储空间中的存储位置、数据索引路径以及数据在节点中的分布的影响。其中,数据在节点的存储位置对速度的影响更大,因为将数据存储在内存或 SSD 中可能导致读取速度相差数十倍。存储公链 DA 多采取 SSD 存储,因为该链上的负载不仅包括 DA 层的数据,还包括用户上传的视频、图片等高内存占用的个人数据。如果网络不使用 SSD 作为存储空间,难以承载巨大的存储压力并满足长期存储的需求。其次,对于使用内存态存储数据的第三方 DA 和主链 DA,第三方 DA 首先需要在主链中搜索相应的索引数据,然后将该索引数据跨链传输到第三方 DA,并通过存储桥返回数据。相比之下,主链 DA 可以直接从节点查询数据,因此具有更快的数据检索速度。最后,在主链 DA 内部,采用 Sharding 方式需要从多个节点调用 Block,并对原始数据进行还原。因此相对于不分片存储的短期存储方式而言,速度会较慢。
DA 层通用性:主链 DA 通用性接近于零,因为不可能将存储空间不足的公链上的数据转移到另一条存储空间不足的公链上。在第三方 DA 中,方案的通用性与其与特定主链的兼容性是一对矛盾的指标。例如,对于专为某条主链设计的主链专用 DA 方案中,其在节点类型和网络共识层面进行了大量改进以适配该公链,因而在与其他公链通信时,这些改进会起到巨大的阻碍作用。而在第三方 DA 内部,与模块化 DA 相比, 存储公链 DA 在通用性方面表现更好。存储公链 DA 具有更庞大的开发者社区和更多的拓展设施,可以适应不同公链的情况。同时,存储公链 DA 对于数据的获取方式更多是通过抓包主动获取,而不是被动接收来自其他公链传输的信息。因此,它可以以自己的方式对数据进行编码,实现数据流的标准化存储,便于管理来自不同主链的数据信息,并提高存储效率。
存储方案性能比较,图片来源:Kernel Ventures
6. 总结
现阶段的区块链正在经历从 Crypto 向更具包容性的 Web3 转换的过程中,这个过程中带来的不仅是区块链上项目的丰富。为了在 Layer1 上容纳如此多项目的同时运行,同时保证 Gamefi 和 Socialfi 项目的体验,以以太坊为代表的 Layer1 采取了 Rollup 和 Blobs 等方式来提高 TPS。而新生区块链中,高性能区块链的数量也是不断增长。但是更高的 TPS 不仅意味着更高的性能,也意味着网络中更大的存储压力。对于海量的历史数据,现阶段提出了主链和基于第三方的多种 DA 方式,以适应链上存储压力的增长。改进方式各有利弊,在不同情境下有不同适用性。
以支付为主的区块链对于历史数据的安全性有着极高的要求,而不追求特别高的 TPS。如果这类公链还处于筹备阶段,可以采取类 DankSharding 的存储方式,在保证安全性的同时也可以实现存储容量的巨大提升。但如果是比特币这种已经成型并有大量节点的公链,在共识层贸然进行改进存在巨大风险,因而可以采取链外存储中安全性较高的主链专用 DA 来兼顾安全性与存储问题。但值得注意的是,区块链的功能并不是一成不变而是不断变化的。比如早期的以太坊的功能主要也局限于支付以及使用智能合约对资产和交易进行简单的自动化处理,但是随着区块链版图的不断拓展,以太坊上逐渐加入了各种 Socialfi 与 Defi 项目,使以太坊向着更加综合性的方向发展。而最近伴随着比特币上铭文生态的爆发,比特币网络的交易手续费自 8 月以来激增了近 20 倍,背后反映的是现阶段比特币网络的交易速度无法满足交易需求,交易者只能拉高手续费使交易尽快得到处理。现在,比特币社区需要做出一个 trade-off,是接受高昂的手续费以及缓慢的交易速度,还是降低网络安全性以提高交易速度但违背支付系统的初衷。如果比特币社区选择了后者,那么面对增长的数据压力,相应的存储方案也需要做出调整。
比特币主网交易费用波动,图片来源:OKLINK
而对于综合功能的公链,其对 TPS 有着更高的追求,历史数据的增长更加巨大,采取类 DankSharding 的方案长期来看难以适应 TPS 的快速增长。因此,较为合适的方式是将数据迁移到第三方 DA 进行存储。其中,主链专用 DA 具有最高的兼容性,如果只考虑单条公链的存储问题,可能更具优势。但是在 Layer1 公链百花齐放的今天,跨链资产转移与数据交互也成为区块链社区的普遍追求。如果考虑到整个区块链生态的长期发展,将不同公链的历史数据存储在同一条公链上可以消除许多数据交换与验证过程中的安全问题,因此,模块化 DA 和存储公链 DA 的方式可能是一个更好的选择。在通用性接近的前提下,模块化 DA 专注于提供区块链 DA 层的服务,引入了更精细化的索引数据管理历史数据,可以对不同公链数据进行一个合理归类,与存储公链相比具有更多优势。然而,上述方案并未考虑在已有公链上进行共识层调整的成本,这个过程具有极高的风险性,一旦出现问题可能会导致系统性的漏洞,使得公链失去社区共识。因此,如果是区块链扩容过程中的过渡方案,最简单的主链临时存储可能更合适。最后,以上讨论都基于实际运行过程中的性能出发,但如果某条公链的目标是发展自身生态,吸引更多项目方和参与者,也有可能会倾向于受到自身基金会扶持和资助的项目。比如在同等甚至总体性能略低于存储公链存储方案的情况下,以太坊社区也会倾向于 EthStorage 这类以太坊基金会支持的 Layer2 项目,以持续发展以太坊生态。
总而言之,当今区块链的功能越来越复杂,也带来了更大的存储空间需求。在 Layer1 验证节点足够多的情况下,历史数据并不需要全网所有节点共同备份,只需要备份数量达到某个数值后便可保证相对的安全性。与此同时,公链的分工也变得越来越细致,Layer1 负责共识和执行,Rollup 负责计算和验证,再使用单独的一条区块链进行数据存储。每个部分都可以专注于某一功能,不受其他部分性能的限制。然而,具体存储多少数量或让多少比例的节点存储历史数据才能实现安全性与效率的平衡,以及如何保证不同区块链之间的安全互操作,这是需要区块链开发者进行思考和不断完善的问题。对于投资者而言,可以关注以太坊上的主链专用 DA 项目,因为现阶段以太坊已有足够多的支持者,不需要再借助其他社区扩大自己的影响力。更多的需要是完善与发展自己的社区,吸引更多项目落地以太坊生态。但是对处于追赶者地位的公链,比如 Solana,Aptos 来说,单链本身没有那么完善的生态,因而可能更倾向于联合其他社区的力量,搭建一个庞大的跨链生态以扩大影响力。因而对于新兴的 Layer1 ,通用的第三方 DA 值得更多的关注。