的承诺作为输入,而非所有交易。 (2)PI电路:解压缩公共输入 正如我们前面提到的,证明的语句只包括对已执行交易的承诺。这意味着链上验证者合约不必处理较大的公共输入多项式,从而有效地压缩公共输入。然而,证明者必须在电路中打开这个承诺,也就是说,它必须知道批处理的实际交易内容。在Scroll zkEVM上,PI电路是打开此承诺并为zkEVM的其余部分解压缩公共输入的子电路。 对交易包的承诺提供给PI电路作为公共输入,证明者必须提供原始交易批数据作为见证(witness)。PI电路的约束(constraints)检查所提供的见证确实与公共输入中的承诺相对应。跳过此一致性检查会让恶意证明者提交一批交易但却执行另一批交易,从而使rollup链的完整状态彻底无法恢复。 5、扩展以太坊作为数据可用性层的可用性 到目前为止,我们讨论了数据可用性的重要性以及今天如何将以太坊用作数据可用性层。现在让我们戴上协议设计师的帽子,快速了解一下提高以太坊作为数据可用性层性能的不同想法。 降低calldata gas成本:这是一个非常直观的想法,可以自动增强以太坊发布更多数据的能力,以实现数据可用性。事实上,在过去的EIP-2028中就已经这样做了。然而,这种方法有其局限性。Calldata的gas成本更低意味着更大的区块,也就意味着区块传播会有更大延迟。将区块传播延迟拉大会破坏L1的共识机制。 通过对区块中的calldata设置总上限来降低calldata gas成本:EIP4488提出的正是这一建议。虽然这听起来像是一笔不错的买卖,但以太坊核心开发人员认为这个提议太过复杂,实施起来风险太大,所以最终该提议还是被抛弃了。值得注意的是,这个EIP还有一个兄弟提案EIP4444。EIP4444的目标是减少节点操作员的数据存储需求,并建议执行客户端在一年后删减历史区块数据。EIP4444旨在通过减轻EIP4488引入的额外存储负载来完成EIP4488。 数据不可用性证明:假设我们有一种方法可以在网络中分配验证较大区块的任务,这样每个人都只需要下载和验证各区块的一小部分就可以了。如果一个节点试图下载较大区块的一部分却无法访问该区块怎么办?他们能进行数据不可用性证明并罚没区块生产者吗?很遗憾,答案是否定的。不发布数据并不是唯一可归因的错误。在此引用Al-Bassam等人的话: 在任何方案中,如果节点有能力对某些不可用的数据“发出警报”,如果发布者随后发布了剩余的数据,那么所有届时没有注意到该特定数据的节点都无法确定究竟是发布者恶意扣留数据还是渔夫(fisherman)恶意发出假警报。 数据可用性抽样:虽然我们不能证明数据的不可用性,但每个节点都可以验证数据的可用性。其中的主要挑战是设计一个高效和精准的测试,这意味着需要相对较少的样本并提供高水平的置信度。一种想法是用擦除码对数据进行编码。擦除码是这样一种方案:它以一种保持原始数据可恢复的方式向原始数据添加冗余,即使编码数据的恒定部分被擦除。擦除码有许多结构,Reed-Solomon(里德所罗门码)是最流行的。假设我们用Reed-Solomon编码区块数据,那么如果超过一个常数因子(例如3/4)的编码数据是可用的,那么整个原始数据就是可恢复的。我们用α表示可恢复性比率。现在各节点必须决定比率为α编码数据是否确实可用。为此,每个节点可以随机采样编码数据的m个位置,并尝试一并获取。如果这些部分中只有一个不可用,那么节点将认为整个数据不可用。在可用数据少于α的情况下,每个节点将以至少1-αm的概率检测到不可用性,随着m的增加,这个概率很快将接近1。请注意,与区块大小相比,m是一个相对较小的数字(从技术上讲,它是一个常数,不必随着区块大小而增长)。为了更清楚地说明问题,让我们考虑一个具体案例,其中我们设置可恢复性比率α=3/4,样本数量m=100,网络中有N=106个节点。现在让我们关注一个区块不可恢复的情况,这意味着可用的编码数据少于α。在这种情况下,一个简单的并集界限(union-bound)意味着网络中每个节点检测到不可用性的概率大于1−N×αm≈0.9999996。虽然这个想法很好,但实现起来却很复杂,而且还涉及到相当多的其他组件。如果不搞清楚,会隐藏大量细节。例如,我们必须确保编码的数据是有效的Reed-Solomon码字,有一种确保这一点的方法是使用多项式承诺方案,如KZG承诺。此外,底层的去中心化p2p网络必须足够可靠才能支持数据传播和采样,关于这样的p2p网络的设计是一个活跃的研究领域。这是即将到来的数据分片解决方案Danksharding的支柱,将在EIP4844之后实施,并进一步扩展以太坊作为数据可用性层的性能。 6、Proto-Danksharing:携带blob的数据 可以将EIP4844看做是EIP4444和EIP4488的巧妙组合。它还部署了具有数据可用性采样建议的原始Danksharding所需的许多组件;因此,它在更易实现的同时,还为未来铺平了道路。 EIP引入了一种新的交易类型——携带blob的交易(blob-carrying transaction)。每个携带blob的交易都“携带”一系列blob。Blob是格式为BLS12-381标量字段中的212=4096个元素的数据包,大约为125千字节。使用这种特定格式的原因是为了简化对blob内容的KZG承诺的创建。 与calldata不同,blob内容在执行环境中不可用。实际上,携带blob的交易只携带对blob的承诺,并且只有这些承诺在执行环境中可用。实际数据由共识客户端共享、获取和验证。 这些blob只存储很短的时间,4096个epoch,也就是18天多一点。在此期间,共识节点应将这些数据提供给网络内的对等节点。在此之后,共识客户端可以删减旧的blob。这种删减机制旨在减轻存储blob的负担。请记住,数据可用性并不是指永久的数据存储;18天足够长了,所有感兴趣的人都有机会在此期间获取数据。 携带blob的交易看起来像带有两个额外字段(max_fee_per_blob_gas和blob_versioned_hashes)的常规EIP1559交易。我们将在下文解释这两个新字段的功能。 (1)Blob收费市场 Blob的收费市场与常规的收费市场是分开的,这意味着在EIP4844之后,我们将看到一个常规的(执行)gas价格和一个blob gas价格。一个类似EIP1559的机制用于blob gas价格,目标为3 blobs,每个区块最多允许6 blobs。字段max_fee_per_blob_gas表示用户愿意支付的blob gas价格;它必须大于或等于当前的blob gas价格才有效。 选择这种设计有一个很好的含义是,L2的数据可用性成本不受L1交易需求激增的影响。此外,这种二维收费市场设计是朝着采用多维EIP 1559提高收费市场效率的更雄心勃勃的愿景迈出的一步。 (2)Blob容量 各区块的blob目标容量并不很高,只有380 KB,在所有rollups情况下约为100 TPS。使用当前的参数存储blob数据为节点操作员引入了近50GB的额外存储需求。对于一个常规节点来说,50GB没什么好担心的,那么为什么不在每个区块中包含更多的blob呢?原因是每个共识节点仍然需要下载并验证所有blob。事实上,在包含EIP4844之后,共识客户端将不会认为一个区块是有效的,直到该区块的所有blob都被下载并验证。我们仍然没有很好的数据可用性抽样机制。因此,必须仔细限制blob带来的额外负载,以避免因将区块传播延迟拉长而破坏共识机制的风险(注:基本上,共识客户端的证明期限为4秒,所以各区块必须在4秒前很好地传播)。这就是为什么blob的目标设定相对较低的原因。 (3)KZG承诺和版本化哈希值 对各blob的承诺采用的是版本化哈希值的格式。它是一个32字节的值,其中第一个字节是版本,当前设置为0x01,然后是blob的KZG承诺的SHA256哈希值的最后31个字节,即version_byte + SHA256(KZG(blob))[1:]。其基本原理是保留在不破坏格式的情况下将承诺方案从KZG更改为其他功能的可能性,以防KZG承诺被认为不像期望的那样安全,例如,当量子计算机变得实用之后。 字段blob_versioned_hashes表示对交易中包含的blob的承诺列表。请注意,携带blob的交易可以携带多个blob。 (4)点评估预编译(Point Evaluation Precompile) EIP4844引入了一个新的预编译,旨在允许用户打开对blob的承诺,并有效地从智能合约中访问blob数据。这在验证涉及blob数据的optimistic证明或简洁证明时非常方便。 point_evaluation_precompile ( versioned_hash, kzg_commitment, proof, z, y) 接收一个版本化的哈希值、对blob的KZG承诺,以及一个打开针对z点和y值证明的KZG作为输入。它验证kzg_commitment是否与提供的versioned_hash相对应,并且验证打开的证明是否有效。 这个预编译通过简洁的有效性证明很好地满足了rollup的需求。EVM中不需要完全打开对blob的承诺,只需检查作为见证的电路中提供的数据是否与blob一致即可。稍后会详细介绍。 7、EIP4844后Scroll协议的数据可用性 (1)Commit 在EIP4844之后,rollup提交交易将是一个携带blob的交易tx。该rollup交易包将被编码写入blob。这样,rollup合约就不再需要计算对交易批数据的承诺;我们只是将txt.blob_versioned_hashes复制到存储中,以便在finalization(最终确定)阶段使用。 (2)PI电路中的blob一致性验证 前面我们讨论了PI电路的功能是验证所提供的交易包是否确实与commit阶段提供的交易包的承诺相对应。当我们将交易包置入blob中时,我们仍然需要这样做,但是完成的方式略有不同。 (3)非原生字段的挑战 以太坊只有一个对配对友好的椭圆曲线BN254的预编译。我们的zkEVM使用该曲线进行算术运算,这意味着我们在曲线BN254的标量场上定义了电路的值和约束。然而,EIP4844使用另一个曲线BLS12-381进行KZG承诺。这让事情变得有点复杂。 这样的选择可能是出于安全性和效率的考量。共识客户端已经使用BL12-381曲线进行证明,因此它已经被所有客户团队实施和审计过了。此外,BN254只提供100 bits的安全性,而BLS12-381提供大约120 bits的安全性。 如果这两条曲线是相同的,我们可以在zkEVM电路中添加一个advice column(列),专门用于存储填充了0的blob数据。KZG对所有电路列的承诺是最终snark证明的一部分(注意:为了简单起见,假设我们没有进行任何批处理聚合),我们可以将对blob列的KZG承诺与从携带blob的交易中获得的版本化哈希值进行比较。 遗憾的是,情况并非如此,我们不能直接用blob版本的哈希值交叉验证对advice列的承诺。幸运的是,还有另一种可行方法。设p(X)为BLS12-381标量场上blob的拉格朗日多项式(Lagrange polynomial)。我们可以在合约中和在电路中在一个随机点z上对这个多项式求值,并查验这些求值是否相等。然后著名的Schwartz-Zippel引理表明,如果等式在高概率下成立,那么两个多项式是相同的。这里具有挑战性的部分是在电路中评估p(X),因为这个评估必须在BLS12-381上完成,而非BN254。非原生字段操作被认为相对昂贵。使用重心公式(barycentric formula),我们可以通过2×4096非原生乘法和除法来实现。对证明者施加的额外成本相对较小。 (4)概念证明 我们已经部署了一个用于电路内blob一致性检查的PoC。电路将对交易包batch_commit的承诺、挑战点z和估值y作为公共输入。证明者必须提供blob作为证人。我们应用Fiat-Shamir来获取匿名随机挑战点z,因此电路强制执行z = hash(batch_commit+blob)。并且,电路约束p(z)=y,其中p(X)为blob的拉格朗日插值多项式。 这个小工具使用28,083,027个advice单元格和3,393,116个查找advice单元格。在M1 MacBook Pro(10个CPU内核,16GB RAM)上,生成证明平均需要138.97秒。 8、结论 数据可用性是区块链可扩展性难题的一个重要部分。EIP4844是朝着提高以太坊作为数据可用性层的效用迈出的一大步。然而,以其目前的参数设置,还无法提供足够大的容量来满足所有rollup的需求。希望Danksharding凭借其出色的数据可用性抽样能够显著改善这种情况。在此之前,rollup需要依赖于calldata和blob存储,或者接收额外的安全假设并采用以太坊以外的数据可用性层。 来源:金色财经lg...