区块链作为分布式账本,需要在所有节点上都对历史数据作一份存储,以确保数据存储的安全与足够去中心化。由于每一次状态变动的正确性都与上一个状态(交易来源)有关,为了确保交易的正确性,一条区块链原则上应当存储从第一笔交易产生到当下交易的所有历史记录。以以太坊为例,即便按照平均每个区块 20 kb 的大小估计,当前以太坊区块的总大小也已达到 370 GB,而一个全节点除了区块本身,还要对状态和交易收据记录。算上这部分,单个节点存储总量已超过 1 TB,这使得节点的运营向少数人集中。
以太坊最新区块高度,图片来源:Etherscan
区块链相对于数据库或者链表存储结构而言,其不可篡改性来自于可以通过历史数据对新产生的数据进行校验,因而确保其历史数据的安全性是 DA 层存储中首先要考虑的问题。对于区块链系统数据安全性的评判,我们往往从数据的冗余数量和数据可用性的校验方式进行分析
在确保了基础安全性的前提下,DA 层下个需要实现的核心目标便是降本增效。首先是降低存储成本,在不考虑硬件性能差异的情况下,也就是降低存储单位大小数据造成的内存占用。现阶段区块链中降低存储成本的方式主要是采取分片技术以及使用奖励式存储以确保数据被有效存储基础上降低数据备份数量。但是从以上改进方式不难看出,存储成本与数据的安全性存在博弈关系,降低存储的占用也往往意味着安全性的下降。因而一个优秀的 DA 层需要实现存储成本与数据安全性之间的平衡。此外,如果 DA 层如果是一条单独的公链的话,还需要通过尽量减少数据交换所经历的中间过程以减少成本,在每一次中转过程都需要留下索引数据以供后续查询时的调用,因而越长的调用过程就会留有越多的索引数据而增加存储成本。最后,数据的存储成本直接和数据的持久性直接挂钩。一般情况下,数据的存储成本越高,公链越难以对数据持久化存储。
实现了降本,下一步便是增效,也就是当需要使用数据时将其迅速从 DA 层中调用出来的能力。这个过程涉及两个步骤,首先是搜寻存储数据的节点,这个过程主要是对于未实现全网数据一致性的公链而言的,如果公链实现了全网节点的数据同步,便可以忽略这一过程的时间消耗。其次,现阶段主流的区块链系统,包括 Bitcoin,Ethereum,Filecoin 中,节点存储方式为 Leveldb 数据库。在 Leveldb 中,数据以三种方式存储。首先是即时写入的数据会存储在 Memtable 类型文件中,当 Memtable 存储满了后则会将文件类型从 Memtable 改为 Immutable Memtable。这两种类型的文件均存储在内存中,但是 Immutable Memtable 文件无法再做更改,只能从中读取数据。IPFS 网络中使用的热存储就是将数据存储在了这个部分,当要调用时就可以快速从内存读取,但是一个普通节点的移动内存往往都是 GB 级别,很容易就会写慢,并且当节点出现宕机等异常情况后,内存中的数据便会永久丢失。如果希望数据持久存储,则需要以 SST 文件的形式存储到固态硬盘(SSD),但读取数据时需要先将数据读到内存,因而大大降低数据索引速度。最后,对于采取了分片存储的系统,其数据还原时需要向多个节点发送数据请求并进行还原,这个过程也会降低数据的读取速度。
Leveldb 数据存储方式,图片来源:Leveldb-handbook
随着 DeFi 的发展,以及 CEX 的种种问题,用户对于去中心化资产跨链交易的要求也不断增长。而无论是采取哈希锁定,公证人还是中继链的跨链机制,都避免不了对两条链上历史数据的同时确定。这个问题的关键在于两条链上数据的分离,不同的去中心化系统中无法实现直接沟通。因而现阶段通过改变 DA 层存储方式提出了一种解决方案,既将多条公链的历史数据存储在同一条可信的公链上,验证的时候只需要在这条公链上调用数据即可。这需要 DA 层能够与不同类型的公链建立安全的通信方式,也就是 DA 层具有较好的通用性。
Sharding 后的数据存储方式,图片来源:Kernel Ventures
DAS 技术是基于 Sharding 在存储方式上的进一步优化。在 Sharding 过程中,由于节点简单的随机存储,可能会出现某个 Block 丢失的情况。其次,对于分片后的数据,还原过程中如何确认数据的真实性与完整性也非常重要。在 DAS 中,通过 Eraser code 与 KZG 多项式承诺对这两个问题进行了解决。
数据校验既确保从节点中调用的数据未被篡改且具有没有出现丢失。为了尽可能减少校验过程中所需要的数据量以及计算成本,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
区块链生态的不断扩大,随之带来公链数量的不断增加。由于各条公链在各自领域的优势与不可替代性,短时间内 Layer1 公链几无可能走向统一。但是随着 DeFi 的发展,以及 CEX 的种种问题,用户对于去中心化跨链交易资产的要求也不断增长。因此,可以消除跨链数据交互中的安全问题的 DA 层多链数据存储得到了越来越多的关注。但是要接受来自不同公链的历史数据,需要 DA 层提供数据流标准化存储与验证的去中心化协议,比如基于 Arweave 的存储中间件 kvye ,采取主动从链上抓取数据的方式,可以将所有链上的数据以标准的形式存储至 Arweave,以最小化数据传输过程的差异性。相对来说,专门为某条公链提供 DA 层数据存储的 Layer2 通过内部共享节点的方式进行数据交互,虽然降低了交互的成本并提高了安全性,但是具有比较大的局限性,仅能向特定公链提供服务。
这类存储方案暂时还没有确定的名称,而其中最突出的代表就是以太坊上的 DankSharding,因而本文中使用类 DankSharding 代称这一类方案。这类方案主要使用了上述的两种 DA 存储技术,Sharding 和 DAS。首先通过 Sharding 将数据分成合适的份数,然后再让每个节点以 DAS 的形式抽取一个数据 Block 进行存储。对于全网节点足够多的情况,我们可以取一个较大的分片数 N,这样每个节点的存储压力只有原来的 1/N,从而实现整体存储空间的 N 倍扩容。同时为了保证防止某个 Block 没有被任一区块存储的极端情况,DankSharding 对数据使用 Eraser Code 进行了编码,只需要一半的数据就可以进行完整还原。最后是对数据的检验过程,使用了 Verkle 树的结构与多项式承诺,实现了快速的校验。
对于主链的 DA,一种最为简单的数据处理方式就是对历史数据进行短期存储。本质上来说,区块链所起的是一个公示账本的作用,在全网共同见证的前提下实现对账本内容的更改,而并没有永久化存储的需求。以 Solana 为例,虽然其历史数据被同步到了 Arweave 上,但是主网节点只保留了近两日的交易数据。基于账户记录的公链上,每一时刻的历史数据保留了区块链上账户最终的状态,便足以为下一时刻的更改提供验证依据。而对于这个时间段之前数据有特殊需求的项目方,可以自己在其他去中心化公链上或者交由可信第三方进行存储。也就是说对于数据有额外需求的人,需要对历史数据存储进行付费。
EthStorage 合约,图片来源:Kernel Ventures
Celestia 数据读取方式,图片来源:Celestia Core
在主链 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
接下来,我们将从 DA 性能指标的四个维度出发,分别对 5 种存储方案的优劣进行比较。
存储方案性能比较,图片来源:Kernel Ventures
现阶段的区块链正在经历从 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 值得更多的关注。
Kernel Ventures是一个由研究和开发社区驱动的加密风险投资基金,拥有超过70个早期投资,专注于基础设施、中间件、dApps,尤其是ZK、Rollup、DEX、模块化区块链,以及将搭载未来数十亿加密用户的垂直领域,如账户抽象、数据可用性、可扩展性等。在过去的七年里,我们一直致力于支持世界各地的核心开发社区和大学区块链协会的发展。
区块链作为分布式账本,需要在所有节点上都对历史数据作一份存储,以确保数据存储的安全与足够去中心化。由于每一次状态变动的正确性都与上一个状态(交易来源)有关,为了确保交易的正确性,一条区块链原则上应当存储从第一笔交易产生到当下交易的所有历史记录。以以太坊为例,即便按照平均每个区块 20 kb 的大小估计,当前以太坊区块的总大小也已达到 370 GB,而一个全节点除了区块本身,还要对状态和交易收据记录。算上这部分,单个节点存储总量已超过 1 TB,这使得节点的运营向少数人集中。
以太坊最新区块高度,图片来源:Etherscan
区块链相对于数据库或者链表存储结构而言,其不可篡改性来自于可以通过历史数据对新产生的数据进行校验,因而确保其历史数据的安全性是 DA 层存储中首先要考虑的问题。对于区块链系统数据安全性的评判,我们往往从数据的冗余数量和数据可用性的校验方式进行分析
在确保了基础安全性的前提下,DA 层下个需要实现的核心目标便是降本增效。首先是降低存储成本,在不考虑硬件性能差异的情况下,也就是降低存储单位大小数据造成的内存占用。现阶段区块链中降低存储成本的方式主要是采取分片技术以及使用奖励式存储以确保数据被有效存储基础上降低数据备份数量。但是从以上改进方式不难看出,存储成本与数据的安全性存在博弈关系,降低存储的占用也往往意味着安全性的下降。因而一个优秀的 DA 层需要实现存储成本与数据安全性之间的平衡。此外,如果 DA 层如果是一条单独的公链的话,还需要通过尽量减少数据交换所经历的中间过程以减少成本,在每一次中转过程都需要留下索引数据以供后续查询时的调用,因而越长的调用过程就会留有越多的索引数据而增加存储成本。最后,数据的存储成本直接和数据的持久性直接挂钩。一般情况下,数据的存储成本越高,公链越难以对数据持久化存储。
实现了降本,下一步便是增效,也就是当需要使用数据时将其迅速从 DA 层中调用出来的能力。这个过程涉及两个步骤,首先是搜寻存储数据的节点,这个过程主要是对于未实现全网数据一致性的公链而言的,如果公链实现了全网节点的数据同步,便可以忽略这一过程的时间消耗。其次,现阶段主流的区块链系统,包括 Bitcoin,Ethereum,Filecoin 中,节点存储方式为 Leveldb 数据库。在 Leveldb 中,数据以三种方式存储。首先是即时写入的数据会存储在 Memtable 类型文件中,当 Memtable 存储满了后则会将文件类型从 Memtable 改为 Immutable Memtable。这两种类型的文件均存储在内存中,但是 Immutable Memtable 文件无法再做更改,只能从中读取数据。IPFS 网络中使用的热存储就是将数据存储在了这个部分,当要调用时就可以快速从内存读取,但是一个普通节点的移动内存往往都是 GB 级别,很容易就会写慢,并且当节点出现宕机等异常情况后,内存中的数据便会永久丢失。如果希望数据持久存储,则需要以 SST 文件的形式存储到固态硬盘(SSD),但读取数据时需要先将数据读到内存,因而大大降低数据索引速度。最后,对于采取了分片存储的系统,其数据还原时需要向多个节点发送数据请求并进行还原,这个过程也会降低数据的读取速度。
Leveldb 数据存储方式,图片来源:Leveldb-handbook
随着 DeFi 的发展,以及 CEX 的种种问题,用户对于去中心化资产跨链交易的要求也不断增长。而无论是采取哈希锁定,公证人还是中继链的跨链机制,都避免不了对两条链上历史数据的同时确定。这个问题的关键在于两条链上数据的分离,不同的去中心化系统中无法实现直接沟通。因而现阶段通过改变 DA 层存储方式提出了一种解决方案,既将多条公链的历史数据存储在同一条可信的公链上,验证的时候只需要在这条公链上调用数据即可。这需要 DA 层能够与不同类型的公链建立安全的通信方式,也就是 DA 层具有较好的通用性。
Sharding 后的数据存储方式,图片来源:Kernel Ventures
DAS 技术是基于 Sharding 在存储方式上的进一步优化。在 Sharding 过程中,由于节点简单的随机存储,可能会出现某个 Block 丢失的情况。其次,对于分片后的数据,还原过程中如何确认数据的真实性与完整性也非常重要。在 DAS 中,通过 Eraser code 与 KZG 多项式承诺对这两个问题进行了解决。
数据校验既确保从节点中调用的数据未被篡改且具有没有出现丢失。为了尽可能减少校验过程中所需要的数据量以及计算成本,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
区块链生态的不断扩大,随之带来公链数量的不断增加。由于各条公链在各自领域的优势与不可替代性,短时间内 Layer1 公链几无可能走向统一。但是随着 DeFi 的发展,以及 CEX 的种种问题,用户对于去中心化跨链交易资产的要求也不断增长。因此,可以消除跨链数据交互中的安全问题的 DA 层多链数据存储得到了越来越多的关注。但是要接受来自不同公链的历史数据,需要 DA 层提供数据流标准化存储与验证的去中心化协议,比如基于 Arweave 的存储中间件 kvye ,采取主动从链上抓取数据的方式,可以将所有链上的数据以标准的形式存储至 Arweave,以最小化数据传输过程的差异性。相对来说,专门为某条公链提供 DA 层数据存储的 Layer2 通过内部共享节点的方式进行数据交互,虽然降低了交互的成本并提高了安全性,但是具有比较大的局限性,仅能向特定公链提供服务。
这类存储方案暂时还没有确定的名称,而其中最突出的代表就是以太坊上的 DankSharding,因而本文中使用类 DankSharding 代称这一类方案。这类方案主要使用了上述的两种 DA 存储技术,Sharding 和 DAS。首先通过 Sharding 将数据分成合适的份数,然后再让每个节点以 DAS 的形式抽取一个数据 Block 进行存储。对于全网节点足够多的情况,我们可以取一个较大的分片数 N,这样每个节点的存储压力只有原来的 1/N,从而实现整体存储空间的 N 倍扩容。同时为了保证防止某个 Block 没有被任一区块存储的极端情况,DankSharding 对数据使用 Eraser Code 进行了编码,只需要一半的数据就可以进行完整还原。最后是对数据的检验过程,使用了 Verkle 树的结构与多项式承诺,实现了快速的校验。
对于主链的 DA,一种最为简单的数据处理方式就是对历史数据进行短期存储。本质上来说,区块链所起的是一个公示账本的作用,在全网共同见证的前提下实现对账本内容的更改,而并没有永久化存储的需求。以 Solana 为例,虽然其历史数据被同步到了 Arweave 上,但是主网节点只保留了近两日的交易数据。基于账户记录的公链上,每一时刻的历史数据保留了区块链上账户最终的状态,便足以为下一时刻的更改提供验证依据。而对于这个时间段之前数据有特殊需求的项目方,可以自己在其他去中心化公链上或者交由可信第三方进行存储。也就是说对于数据有额外需求的人,需要对历史数据存储进行付费。
EthStorage 合约,图片来源:Kernel Ventures
Celestia 数据读取方式,图片来源:Celestia Core
在主链 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
接下来,我们将从 DA 性能指标的四个维度出发,分别对 5 种存储方案的优劣进行比较。
存储方案性能比较,图片来源:Kernel Ventures
现阶段的区块链正在经历从 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 值得更多的关注。
Kernel Ventures是一个由研究和开发社区驱动的加密风险投资基金,拥有超过70个早期投资,专注于基础设施、中间件、dApps,尤其是ZK、Rollup、DEX、模块化区块链,以及将搭载未来数十亿加密用户的垂直领域,如账户抽象、数据可用性、可扩展性等。在过去的七年里,我们一直致力于支持世界各地的核心开发社区和大学区块链协会的发展。