# 关于零知识证明的一些胡思乱想

By [ntop](https://paragraph.com/@ntooop) · 2021-11-14

---

之前看过两篇过于零知识证明的文章，但是当时没有看完只看了一点以为自己已经理解了，下面写写自己的理解（所以说本文可能是错误的）。

如何证明Alice知道一个多项式比如：`y=x^3` ? 其实特别简单，我可以问alice: f(1) 等于几？ 如果她告诉我 f(1) = 1, 那么我就大概可以判断出 Alice 是知道这个多项式的，不然它是怎么算出这个值的呢？

假如Alice知道的多项式实际上是：`y=x` ，其实也能得到这个结果，但是所以我们可以构建更复杂的多项式来提高问题的难度，或者问 f(99999) 等于几？

我知道Alice知道了这个多项式是因为我也知道这个多项式。对于零知识证明而言我需要在不知道这个多项式的情况下验证Alice知道这个多项式！！此时我们可以构建一个抽样器，这个抽样系统可以给出几组值，比如: `f(1) = 1` 、`f(2) = 8` 、`f(3) = 9` 这样我只要拿到这个采样结果并问：Alice你知道 f(1) 等于几吗？Alice告诉我结果后我只要验证 `f(1) == 1` 即可知道Alie的回答是否正确。

而我始终是不知道多项式的。

如何验证Alice知道某个数字呢？比如她是否知道Bob的银行存款数额(5)？这个问题可以简化为，`y = 5x^3` 我们只要验证Alice是否知道系数。我们继续构建采样器：`f(1)=1` 和 `f(2) = 40` , 此时不能再问Alice你知道 f(1) 等于几这个问题了因为这不是验证多项式，更友好的问法是：Alice告诉我你知道的那个值！可以设计一个方法: `f(x) =y= a*x^3` 当Alice回答了 a 之后我们就可以得到一个多项式，并用 x = 1, x = 2 算出结果到 Bob 那边验证，这样bob就知道Alice是否知道这个数字了。

这里的问题在如何设计这个方法和这个采样器 ？

这个方法应该就是ZK的 Prover 函数，而采样器就是 Verifier 函数。

**注意** ：以上所述除了第一个多项式是看来的，后面内容都是我在某个午后灵光一闪脑补出来的，如有错误，那就是错的。。。

---

*Originally published on [ntop](https://paragraph.com/@ntooop/KXMS32maoYuKcqYPrSvE)*
