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