lob的交易看起来像带有两个额外字段(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...