Inner Product Argument
https://dankradfeist.de/ethereum/2021/11/18/inner-product-arguments-mandarin.html
https://dankradfeist.de/ethereum/2021/06/18/pcs-multiproofs.html
https://eprint.iacr.org/2017/1066.pdf
符号约定
定义在 上的椭圆曲线群 ,标量域为 ,从 中选取两组独立的点作为 base:
两个向量的内积定义为:
问题
对于某 , ,证明者 需要说服验证者 , 知道两个向量 和 ,使得:
一个直观的想法是, 直接发送 和 给 ,然后让 自行计算验证,但是这样通信量为 个 的元素。验证者的工作至少是 个 上的标量乘法。
通过 IPA,可以将通信量降低为 个 上的点。验证者的工作没有特别降低,仍然 个 上的标量乘法。
在 之后,新增另一个base,,然后问题转化为:
对于某 ,证明者 需要说服验证者 , 知道两个向量 和 ,使得:
协议描述
Commit
计算 并发送给
第一轮
假设 ,令 ,,其他同理。
:
第 轮
:
:
现在需要 证明
所有长度为前一轮的一半。然后替换:
如果此时 的长度不等于 ,回到上一步;
否则这是最后一轮:
:
:
- 计算 ,如果 则接受,输出 True;否则拒绝,输出 False.
示例
问题
对于 , 需要向 证明, 知道 和 , 使得
Commit
计算 并发送给 。
第一轮
:
- 从 中获取 ,
- 从 中获取 ,
- 从 中获取 ,
- 从 中获取 ,
- 计算
- 计算
- 并将 发送给
第二轮
:
:
:
因此接受.
安全性分析
correctness
按照协议正确执行,那么 一定能够输出 True,因为
可以扩展为:
如果 正确计算了 , , , , 那么最后一轮 能够得出
soundness
能否作恶来欺骗 ?
假设 提交了 ,其中 ,
要想最后成功验证,第二轮的参数需要满足内积形式:
是在 承诺 后选取的随机 ,因此上面等式成立的概率约为 ,是一个可以忽略的值。
性能优化
每轮都需要更新 base ,但是他其实只需要每轮把 发送过去,只有最后的时候需要验证,因此可以把 base 更新放到最后,并且使用标量之间的运算替代中间步骤的 msm。
:
:
的 系数对应 的标量乘法。
的 系数对应 的标量乘法。
使用 IPA 验证多项式
承诺的计算
场景:
- 验证 在 处的取值。
- 令 , ,则我们可以通过 IPA 验证承诺 具体“内积属性”。并且通过改进,还能验证 的结果
内积属性的含义是:
:
:
:
:
这里有个问题, 可以作弊,比如他提交 ,然后能够证明 。问题的来源是 在承诺的时候就知道了base ,因此 可以在收到 和 之后重新选择 , 为一个随机标量。
优化
是已知的,可以参考前面对 的优化。由 给出系数。
前面给出了系数形式的 IPA
虽然给定 个系数或者 个点都能唯一确定 次多项式,但是点值形式转系数形式需要 FFT,有 次运算,并且要求定义域使用 Root of unity。否则是 。
为了避免这项开销,直接对值进行承诺:
这表示
使用重心公式:
如果我们选择 :
就能得到
新场景
- 知道 ,,
- 知道 ,不知道(不想知道)
- base 为 和
过程:
一直到 :
此外,
发送给
验证:
verify_multiexp:
用 IPA 证明
asdfads
有两个数据 255,1,order+1