2021-06-19 19:54 | 出处: EthFans
(续前)什么是 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)。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) 的复杂度内完成计算,而无需使用反向快速傅立叶变换。index1=>value1、index2=>value2 …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]‘)2^28 个账户键的状态,你需要至少 2^28 阶的多项式来构建 扁平的 承诺(flat commitment)(实际上的账户键总空间会大得多得多)。在更新和插入的时候,会有一些不便利。对任一账户的任意更改,都会触发承诺(以及更麻烦的,见证数据/证据)的重新计算。索引值 => 数值 点的任何更改,比如更改了 indexk,都需要使用相应的拉格朗日多项式来更新承诺。复杂度约为每次更新 O(1)。q_i([s]) ,也即所有对第 i 个键值对的见证,也需要更新。总复杂度约为 O(N)q_i([s]) 见证,任何一条见证数据都要从头开始计算,都需要 O(N)sqrt(N) 的更新 KZG10 承诺的构造2^28 约等于 16^7 约等于 2.5 亿 个键值对。如果我们只使用扁平的承诺(那么我们需要的阶数就至少是 2^28)。虽然我们的证据永远是 48 个字节的椭圆曲线元素,但任意的插入或更新,都需要 O(N) 次操作来更新所有预先计算好的见证数据(也就是所有点的 q_i(s) ,因为 f(x) 本身已经改变了);甚至于,如果没有预先计算好的见证数据,则每条见证数据都需要花 O(N) 来重新计算。d 比较小(但也需要高达约 256 或者 1024)。D、E 可以围绕使用 fiat shamir heruristic 产生一个相对随机的点 t 来生成。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) )storageKey,本质上就是元组 (address,sub_key,leaf_key) 的一种表示65536*32 字节的分块表示为单个的字数,所以主树上可能有许多子树来存储一个账户(address, sub_key, leaf_key) 的事件WITNESS_CHUNK_COSTaddress,sub_key 组合都收取额外的 WITNESS_BRANCH_COSTWITNESS_CHUNK_COST,访问账户需要收取一次 WITNESS_BRANCH_COST16384 个样本(每个 32 字节),约为 512 kb;还有数据头,主要由这些样本相应的最大 16384 阶的多项式承诺组成D 却有 2^16384 的规模,即,1,w^1,…w^,… w^32767,而 W 是 32768 的单元根(不是 16384 的)f(w^i)=sample-i for i<16384)拟合出最大 16384 阶的多项式,并扩展到 32768 作为纠删码样本,即计算 f(w^16384) … f(w^32767)f(1),f(w^1),f(w^2)… f(w^16383)k~20 个垂直子网中下载和检查这些分块,并使用对应数据块的承诺来验证它们,以建立数据可得性保证原文链接:
https://hackmd.io/yqfI6OPlRZizv9yPaD-8IQ
作者: g11tech