干货 | 为以太坊引入 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 承诺可以有很好的属性: 验证承诺的过程是:(由区块生成者)提供底层多项式在任意点r上的值y=f(r),以及除法多项式q(x)=(f(x)-y)/(x-r)在[s]点的值(即q([s])),并用配对方程来对比之前所提供的承诺f[s]。这就叫开启在 r 点的承诺,而q([s])就是证据。容易看出,q(s)就是p(s)-r除以s-r,恰好就是我们用配对方程来检查的东西,即检查(f([s])-[y]) * [1]'= q([s]) * [s-r]'(译者注:此处疑为f(s)-r,但原文就是p(s)-r)。在非交互且确定性的版本中,Fiat Shamir Heuristic提供了一种办法来获得相对随机的点 r:因为随机性只跟我们尝试证明的输入有关,即,只要已经有了承诺c=f([s]),r 就可以用哈希所有输入(r=Hash(C,..))来获得,而承诺的提出者要负责提供开启点和证据。使用预先计算好的拉格朗日多项式,f([s])和q([s])都可以在求值形式下直接计算。要计算 r 处的开启值,就需要把 f(x) 转为f(x)=a0+ a1*x^1....的系数形式(也即抽取出a0、a1、…)。可以通过反向快速傅立叶变换来实现,复杂度为O(d log d),但甚至这里也有一种可用的替代算法,在O(d)的复杂度内完成计算,而无需使用反向快速傅立叶变换。你可以使用单个开启点和证据来证明 f(x) 的多个值,也就是多个索引值对应的数值,index1=>value1、index2=>value2…(用于计算证据的)除法多项式 q(x) 现在变成了 f(x) 除以零多项式z(x) =(x-w^index1)*(x-w^index2)...(x-w^indexk)的商余数为r(x)(r(x)是一个最大阶数为 k 的多项式,由index1=>value1,index2=>value2…indexk=valuek插值而成)检查( f([s])-r([s]) )* [1] ' = q([s]) * z([s]')在 PoS 链的共同起步设置中,共享的数据块会被表示为低阶的多项式(并为了纠删码而使用同样的拟合多项式扩展为两倍大),KZG 承诺可以用来检查任意随机分块并验证和确保数据可得性,而无需获得兄弟数据点。这就开启了随机取样的可能性。 现在,对于一个最大可能包含2^28个账户键的状态,你需要至少2^28阶的多项式来构建扁平的承诺(flat commitment)(实际上的账户键总空间会大得多得多)。在更新和插入的时候,会有一些不便利。对任一账户的任意更改,都会触发承诺(以及更麻烦的,见证数据/证据)的重新计算。 更新 KZG10 承诺对任一索引值 => 数值点的任何更改,比如更改了indexk,都需要使用相应的拉格朗日多项式来更新承诺。复杂度约为每次更新O(1)。但是,因为 f(x) 本身也改变了,所以所有的见证q_i([s]),也即所有对第 i 个键值对的见证,也需要更新。总复杂度约为O(N)如果我们没有维护预先计算好的q_i([s])见证,任何一条见证数据都要从头开始计算,都需要O(N)一种复杂度为sqrt(N)的更新 KZG10 承诺的构造 因此,为了实现理想承诺方案的第四点,我们需要一个特殊的构造:Verkle trie。 Verkle 树 因此,我们需要把扁平的结构换成叫做Verkle 树的结构,跟默克尔树一样是树结构。 即,像默克尔树一样,构建出一棵承诺树,这样我们就可以保证阶数d比较小(但也需要高达约 256 或者 1024)。每个父节点都编码对其子节点的承诺,子节点就是一个映射,其索引值都存在其父节点内实际上,父节点的承诺编码了哈希后的子节点,因为承诺的输入是标准化的、32 字节的值(见上文的 注3.0)。叶子节点编码了对其所存储的数据的 32 字节哈希值的承诺;或者直接跳转到数据,假如其 32 字节的数据的用法与下一章提到的状态树提议用法一样的话。要提供对一个分支的证据(类似于默克尔分支证据)时,一个多值证明的承诺D、E可以围绕使用 fiat shamir heruristic 产生一个相对随机的点 t 来生成。 复杂度这里是一份对Verkle 多值证明的分析更新/插入 叶子节点index=>value需要更新log_d(N)个承诺 ~log_d(N)为生成证据,证明者需要计算f_i(X)/(X-z_i)在[s]处的值,用于生成D,复杂度总计O(d log_d N),但可以在 更新/插入 时调整以节约预计算,复杂度会变成O d log_d(N)计算m个 ~O( log_d(N) )个f_i(t)来计算h(t),总计为O (d log_d N)计算π,ρ,需要对m~ log_d N个指数多项式的和做除法。需要约O(d log_d N)来获得分子的求值形式,以计算除法证明的规模(包括用于计算E的分支承诺)加上验证的复杂度 ~O( log_d(N) ) Verkle 树构建 代码默克尔化 代码会自动成为 verkle 树的一部分(作为统一的状态树的一部分)一个区块的 header 和 code 都作为一个树高为 2 的承诺树的一部分单个分块最多有 4 条见证数据,分别收取WITNESS_CHUNK_COST,访问账户需要收取一次WITNESS_BRANCH_COST 数据采样和 PoS 协议中的分片 注 3:此时的分片不是链,任何隐含的顺序都要由 L2 协议来解释。 KZG 承诺也可以用来构建数据有效性和可得性方案,客户端无需访问分片提议者发布的完整数据就可以校验其可得性。 分片数据块(不带纠删码)是16384个样本(每个 32 字节),约为 512 kb;还有数据头,主要由这些样本相应的最大 16384 阶的多项式承诺组成但多项式求值形式D却有2^16384的规模,即,1,w^1,…w^,…w^32767,而 W 是 32768 的单元根(不是 16384 的)我们可以为数据(f(w^i)=sample-ifori<16384)拟合出最大 16384 阶的多项式,并扩展到 32768 作为纠删码样本,即计算f(w^16384)…f(w^32767)对每个点的值的证明也同时计算并与样本一起发布32768 个样本中获得任意 16384 个都可以完全恢复出 f(x) 以及原始的样本,即f(1),f(w^1),f(w^2)…f(w^16383)这纠删编码的 32768 个样本分为 2048 个分块,每个分块包含 16 个样本,即 512 字节的数据;由分片提议者水平地发布,即将第 i 个分块以及相应地证据发给第 i 个垂直子网络,外加全局公开完整数据的承诺在被指定的 (shard, slot),每个验证者都在k~20个垂直子网中下载和检查这些分块,并使用对应数据块的承诺来验证它们,以建立数据可得性保证 我们需要为每个 (shard, slot) 安排足够多的验证者,使得总体上一般(乃至更多的数据)都被获取了;另外,还要满足一些统计学上的要求,每个 (shard, slot) 约 128 个委员,需要有至少 70 个(也即 2/3 )委员的见证,使得该分片数据块能成功打包到信标链上,至少需要约 262144 个验证者(32 个 slot,乘以 ** 个分片,再乘上至少 128 个委员) 基准测试 插入/更新 的基准测试 证明生成验证的基准测试 原文链接: https://hackmd.io/yqfI6OPlRZizv9yPaD-8IQ 作者:g11tech 翻译:阿剑—- 编译者/作者:EthFans 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
干货 | 为以太坊引入 KZG 承诺:工程师视角(下)
2021-06-19 EthFans 来源:区块链网络
LOADING...
相关阅读:
- 币圈、链圈、矿圈为何盯着fillecoin?分布式存储Ipfs到底是什么?2021-06-19
- 2021世界区块链大会·杭州6大核心议题首度揭晓2021-06-19
- 第952篇:又到周末2021-06-19
- NFT市场滑坡,NFT发展的白与黑2021-06-18
- 快讯|OpenSea使用IPFS、Filecoin存储NFT2021-06-18