当前位置:主页 > 列表页 > 正文

干货 | 为以太坊引入 KZG 承诺:工程师视角(下)

2021-06-19 19:54 | 出处: EthFans

干货 | 为以太坊引入 KZG 承诺:工程师视角(上)

(续前)什么是 KZG10 承诺?


注 3.6:如果启动设置所计算的 [s],[s^2][s^d] 只计算到了指数 d,这一组值是不能用来生成任何阶数大于 d 的多项式的承诺的。反之亦然。


因为在安全的曲线上,没有办法用两个点相乘来得出第三个点,所以 [s^(d+k)] 是一个(永远!)无法求出的值,因此可以说,任意的承诺 c(f) 都只能表示一个阶数小于等于 d 的多项式。


注 3.7:使用 KZG10 承诺的证据基本上就是在证明 f(x) - 某些余数 的结果可以按特定的办法来分解,但这就要有一种办法可以 相乘 这些因数,并与原始的承诺相比较 C(f)=f([s])


为此,我们需要 “配对方程”,就是一种能把曲线上的两个点相乘并与另一个曲线点比较的乘法,因为我们无法直接让这两个曲线点直接相乘来得到合成的曲线点。


注 3.8:上述两个属性,可以进一步用来证明某个承诺 c(f) 所代表的多项式 f(x) 的阶数 k 小于 d。


综上,KZG10 承诺可以有很好的属性:


在 PoS 链的共同起步设置中,共享的数据块会被表示为低阶的多项式(并为了 纠删码 而使用同样的 拟合 多项式扩展为两倍大),KZG 承诺可以用来检查任意 随机 分块并验证和确保 数据可得性,而无需获得 兄弟数据点。这就开启了随机取样的可能性

现在,对于一个最大可能包含 2^28 个账户键的状态,你需要至少 2^28 阶的多项式来构建 扁平的 承诺(flat commitment)(实际上的账户键总空间会大得多得多)。在更新和插入的时候,会有一些不便利。对任一账户的任意更改,都会触发承诺(以及更麻烦的,见证数据/证据)的重新计算。

更新 KZG10 承诺

因此,为了实现理想承诺方案的第四点,我们需要一个特殊的构造:Verkle trie。


Verkle 树


需要表示的以太坊的状态大约有 2^28 约等于 16^7 约等于 2.5 亿 个键值对。如果我们只使用扁平的承诺(那么我们需要的阶数就至少是 2^28)。虽然我们的证据永远是 48 个字节的椭圆曲线元素,但任意的插入或更新,都需要 O(N) 次操作来更新所有预先计算好的见证数据(也就是所有点的 q_i(s) ,因为 f(x) 本身已经改变了);甚至于,如果没有预先计算好的见证数据,则每条见证数据都需要花 O(N) 来重新计算。

因此,我们需要把扁平的结构换成叫做 Verkle 树 的结构,跟默克尔树一样是树结构


即,像默克尔树一样,构建出一棵承诺树,这样我们就可以保证阶数 d 比较小(但也需要高达约 256 或者 1024)。

复杂度
这里是一份对 Verkle 多值证明的分析


Verkle 树构建


被提议的 ETH 状态 Verkle 树
单一的树结构,存储账户的 header代码分块,还有 存储项分块,节点的承诺为阶数 d=256 的多项式

代码默克尔化

代码会自动成为 verkle 树的一部分(作为统一的状态树的一部分)


数据采样和 PoS 协议中的分片


ETH PoS 的目标之一是能够提交约 1.5MB/s 的数据量(把这个吞吐量理解为状态变更的吞吐量,因而是 L2 rollup 可以利用的交易吞吐量,最终是 L1 EVM 的吞吐量)。要实现这一点,许多并行的区块提议要能发出并在给定的 12 秒内验证;也就是要存在多条分片(约 **),每个分片在每个 slot 都要发布自己的数据块。若有大于 2/3 的投票支持,信标链区块将包含分片数据块,分叉选择规则也将根据信标链区块内所有数据块及其祖先的数据可得性确定它是否能成为主链区块。

注 3:此时的分片不是链,任何隐含的顺序都要由 L2 协议来解释。

KZG 承诺也可以用来构建数据有效性和可得性方案,客户端无需访问分片提议者发布的完整数据就可以校验其可得性。



基准测试


如我们在 POC verkle go 代码库中看到的,以状态树的规模构建完一次 verkle 之后,插入和更新都非常快:



插入/更新 的基准测试


证明生成验证的基准测试



原文链接:

https://hackmd.io/yqfI6OPlRZizv9yPaD-8IQ

作者: g11tech

翻译: 阿剑
作者郑重申明:截至发文时,作者与文中提及项目存在利益关系,特此告知。利益关系包括但不限于下述情况:本人为项目团队成员、本人是项目团队成员的直系亲属或配偶、参与投资该项目、持有该项目发行的股份或通证、参与做空或做多该项目、收取回报进行有偿撰文等。
相关文章