概述
无信任是公共区块链的一个主要前提(“不要信任,要验证”)。以太坊减少信任假设的方法之一是强制验证数据。区块生产者被要求发布每个区块的数据,参与以太坊共识的节点在本地存储和验证这些数据。
以太坊网络上的所有节点都会执行它们从对等节点收到的区块中的交易,以确保区块生产者提出的变化(也就是世界状态的变化)与节点独立计算的变化精确匹配。这就是节点验证新信息是否有效的方式,而不是必须相信区块生产者是诚实的。
数据可用性很重要,因为如果我们不能用现有的数据重现某些东西,从区块链的角度来看,它就不存在。区块数据的可访问性使验证节点能够以各自版本的以太坊世界状态以无信任的方式重放交易,并独立验证每个区块的正确性。
什么是数据可用性?
数据可用性是指区块提议者(proposer)发布了一个区块的所有交易数据,并且交易数据对其他网络参与者可用。以太坊交易在区块中得到处理,这些区块被又链在一起,形成 “区块链”。
每个区块有两个主要部分:
- 区块头(block header),包含关于区块的通用信息(元数据),如时间戳、区块散列、区块编号等。
- 区块主体(block body),包含了区块实际处理的交易。
当提出新的区块时,区块生产者必须发布整个区块,包括交易数据(包含在区块主体中)。然后,参与共识的节点可以下载该区块的数据,并重新执行交易以确认其有效性。如果没有节点验证交易,区块提议者可以在区块中插入恶意交易。
数据可用性问题
换个角度看数据可用性问题:“我们如何验证一个新产生的区块的数据是否可用?"。数据可用性是至关重要的,因为以太坊的安全性假设所有节点都能访问区块数据。
如果一个区块生产者在所有数据不可用的情况下提出一个区块,它可能会使区块链在包含无效交易的情况下达到到最终确定性。
在讨论扩容解决方案时,数据可用性问题也是相关的,比如说 rollup 。这些协议通过在 Ethereum Mainnet 之外执行交易来增加吞吐量。然而,为了集成以太坊的安全性,它们必须在 Mainnet 上发布交易数据,允许任何人验证在主链之外执行的计算的正确性。
数据可用性和轻型客户端
虽然数据可用性的经典概念是关于交易数据对验证节点的可见性,但较新的研究集中在验证轻客户端的数据可用性。对于轻型客户端,数据可用性问题关注不需要下载整个区块就可以验证一个区块的可用性。
轻客户端是一个以太坊节点,它只同步到最新的区块头,并从全节点(full nodes)请求其他信息。由于不下载区块,轻客户端不能验证交易或帮助保护以太坊。
一个相关的研究领域集中在使数据在无状态的以太坊中可被证明的机制。无状态客户端的概念是一个太坊提案,验证节点在校验区块之前不需要存储状态数据。
无状态预计将改善以太坊的安全性、可扩展性和长期可持续性。由于对验证节点的硬件要求较低,更多的验证者可以加入网络,并确保其免受恶意行为的影响。
数据可用性与数据可检索性
数据可用性与数据可检索性不同。数据可用性是指当一个区块被提议添加到链上时,节点下载其交易数据的能力。换句话说,数据可用性讨论主要发生在当一个区块还没有通过共识时。
数据可检索性是指节点从区块链上检索历史信息的能力。一个区块链的历史是由古老的区块和收据(receipt)组成的,这些区块和收据存储了关于过去事件的信息。虽然历史区块链数据对于归档(archiving)来说可能是必要的,但节点可以在没有它的情况下验证链和处理交易。
以太坊核心协议主要关注的是数据的可用性,而不是数据的可检索性。以太坊不会永远存储它所处理的每一笔交易的数据,因为这样做会增加全节点的存储需求,对以太坊的去中心化产生负面影响。
幸运的是,数据检索性是一个比数据可用性更容易解决的问题。检索历史区块链数据的能力只需要一个诚实的节点来存储它,它就可以被检索到。此外,一些实体,如区块链浏览器,有激励措施来存储档案数据,并根据要求向其他人提供。
为什么数据可用性很重要?
区块链安全
数据可用性对区块链安全至关重要,否则,“数据扣留攻击(data withholding attacks)”将变得很普遍。当一个区块生产者发布了一个区块,但没有分享用于建立区块的交易数据时,就会发生数据扣留攻击。
如果发生了数据扣留攻击,全节点无法验证对以太坊世界状态的更新是否正确。这让恶意的区块提议者有了颠覆协议规则的余地,在以太坊网络上推进无效的状态转换。
区块数据对全节点的可见性是至关重要的,因为其他网络参与者,如轻型客户,依靠全节点来验证网络的状态。与全节点不同,轻客户端只检查区块头,不下载区块体。因此,围绕数据可用性的规则确保全节点可以验证区块,防止链被破坏。
去中心化的可扩展性
以太坊的目标是在不牺牲去中心化和安全的情况下扩展计算。由于单体区块链架构的限制,数据可用性对于实现去中心化的可扩展性至关重要。
数据可用性和二层网络扩展
二层网络扩展解决方案,如 rollups,通过处理 Ethereum 主执行层以外的交易来扩展网络吞吐量和延迟。链下交易被压缩并分批发布在以太坊上–成千上万的交易可能发生在链下,但以太坊只需要处理与每个批次提交相关的那个链上交易。这减少了基础层(也就是 L1)的拥堵,降低了用户的费用,同时保证了交易速度。
然而,为了让以太坊保证 rollup 的安全性,它需要一个机制来验证链下交易的有效性。这就是数据可用性的问题所在。
Optimistic rollups 将压缩的交易数据作为 calldata 发布到以太坊。这允许任何人验证 rollup 的状态,也提供交易有效性的保证。如果一个交易是无效的,验证者可以使用交易数据来构建一个欺诈证明(fraud-proof)来挑战它。
Zero-knowledge(ZK) rollup 不需要发布交易数据,因为零知识有效性证明(zero-knowledge validity proofs)保证了状态转换的正确性。然而,如果不能访问 ZK-rollup 的状态数据,我们就不能保证其功能(或与之互动)。
例如,如果操作者隐瞒了关于 rollup 的细节,用户就不能知道他们的余额。另外,他们也不能使用新添加的区块中包含的信息进行状态更新。
区块链中数据可用性系统的类型
链上数据可用性
解决数据可用性的标准解决方案是强迫区块生产者在链上发布所有交易数据,并让验证节点下载这些数据。链上数据可用性是“单体区块链(monolithic blockchains)”的一个特点,它在单一层面上管理数据可用性、交易执行和共识。通过在整个网络中冗余地存储状态数据,以太坊协议确保节点能够获得重现交易、验证状态更新和标记无效状态转换所需的数据。
然而,链上数据的可用性成为可扩展性的瓶颈。单一的区块链往往处理速度缓慢,因为节点必须下载每个区块并重放相同的交易。它还需要全节点存储越来越多的状态,这是可能会影响去中心化。如果以太坊的状态数据量螺旋式上升,验证者必须投资于更大的机器,这将可能减少愿意运行验证节点的人数。
链下数据可用性
链下数据可用性系统将数据存储移出区块链:区块生产者不在链上发布交易数据,但提供加密承诺以证明数据的可用性。这是模块化区块链使用的方法,链上管理一些任务,如交易执行和共识,并将其他任务(如数据可用性)转移到另一层。
许多扩展解决方案将数据可用性与共识和执行分离,因为这被认为是在不增加节点要求的情况下扩展区块链的理想方式。例如,validiums 和 plasma 使用链下存储来减少链上发布的数据量。
虽然链下数据的可用性提高了效率,但它对去中心化、安全性和不可信任性有负面影响。例如,validiums 和 plasma 链的参与者必须相信区块生产者不会在提议的区块中包括无效的交易。区块生产者可以采取恶意行为(即推进无效的状态转换),并通过扣留状态数据削弱挑战恶意交易的尝试。
由于与链下存储有关的问题,一些扩展解决方案将交易数据存储在父区块链上,如以太坊。例如 Optimistic rollups 和 ZK-rollups 不存储交易数据,而使用以太坊主网作为数据可用性层。
对于数据可用性问题,有哪些解决方案?
如前所述,数据可用性问题涉及验证新提议区块的交易数据可用性的能力。有一些机制来保证数据的可用性。
数据可用性抽样(Data availability sampling)
数据可用性抽样是一种保证数据可用性的密码学机制。数据可用性抽样允许区块链节点验证提议区块的数据是否可用,而不必下载整个区块。
在 DAS 系统中,一个节点在多轮中对区块的小块、随机块进行采样,以验证数据可用性。随着许多节点同时对一个区块的不同部分进行采样,它的可用性以高统计确定性得到验证。
当应用于区块链时,如以太坊,数据可用性采样确保轻客户端也可以参与保证链的安全性和功能。轻客户端可以在没有昂贵硬件的情况下运行,使任何人都更容易在以太坊网络上进行验证。
数据可用性证明(Data availability proofs)
虽然数据可用性抽样给出了区块可用性的统计保证,但恶意节点仍然可以隐藏一些数据。DAS 技术只能证明大部分区块数据是可用的,而不是证明整个区块是可用的。而区块生产者即使隐藏了极少量的交易数据也会带来很多危害。
为了解决这个问题,我们将数据可用性采样与纠删码(erasure coding)结合起来,创建 “数据可用性证明”。纠删码允许我们通过增加冗余的部分(称为纠删码)来加倍数据集。如果原始数据丢失,纠删码可以用来重建原始数据。
当在区块链中实施时,纠删码提高了数据的可用性,因为一小部分数据就足以重建一个区块中的整个交易集。在这个系统中,一个恶意的区块生产者需要扣留超过 50%的区块来进行数据扣留攻击。以前,一个区块生产者只需要扣留 1%的区块数据就可以进行恶意行为。
包含纠删码的区块,轻客户端有统计学上的确定性,即整个区块数据被公布在网络上。这也意味着轻客户端不必依赖全节点来提醒他们一个区块的不可用性。
数据可用性委员会(Data availability committees)
纯粹的 validium 将交易数据存储在区块生产者的链下,使其在一定程度上集中化。这降低了去中心化和安全性,因为区块生产者可以发布无效的交易,并通过隐藏交易数据来掩盖 rollup 的真实状态。
一些 validium 试图解决这个问题,要求区块生产者将交易数据存储在组成数据可用性委员会(DAC)的受信任方。DAC 将链下数据的副本离线存储,但被要求在发生争议时提供这些数据。DAC 的成员还发布链上证明,以证明上述数据确实可用。
Proof-of-stake 数据可用性委员会(Proof-of-stake data availability committees)
虽然数据可用性委员会在有效期内比现状要好,但信任假设仍然存在。如果 DAC 与区块生产者勾结,扣留交易数据怎么办?DAC 的规模通常较小,增加了串通的风险和外部行为者损害该团体的可能性。
一些验证人用股权证明(PoS)验证人系统取代 DAC。在这里,任何人都可以成为验证者并在链下存储数据。然而,他们必须提供 “保证金”,并将其存入智能合约中。如果出现恶意行为,例如验证人隐瞒数据,保证金就会被削减。
产权证明数据可用性委员会比普通的 DAC 要安全得多。它们不仅是无权限和无信任的,而且还有精心设计的激励措施来鼓励诚实的行为。
以太坊和数据可用性的未来
虽然 rollup 可以通过链下计算来扩展吞吐量,但其能力受限于底层区块链的数据吞吐量。如果 rollups 要使用以太坊作为数据可用性层,它必须增加其数据存储和处理能力。
分片(Sharding)用于增加以太坊执行层的数据吞吐量。在分片中,网络被分割成选定数量的子链–每个子链都有一组专门的验证器。
验证者只需要为他们的分块运行全节点,并为其他分块运行轻客户端。分片增加了可用于 rollup 的数据空间,因为存储数据的工作被分割到不同的分片。
但是,数据分片引入了一个新的问题:“如果一个分片上的验证器成为恶意的,并开始处理无效的状态转换怎么办?"。这是有可能的,因为全节点不再像现在这样可以访问相同的交易数据。实施数据分片需要创建一个系统,让节点在不下载区块的情况下验证其他分片的数据可用性,否则分片的目的就无法实现了。
为了解决这个问题,以太坊较新的扩展提议,如 Danksharding,依靠数据可用性采样来验证网络是否已经看到了 blob 的全部内容。这个系统将单个节点从直接下载和验证的负担中解脱出来。
评论