Source: https://rareskills.io/zh-cn/post/trusted-setup
可信设置是 ZK-SNARKs 用于在某个秘密值上评估多项式的一种机制。
请注意,多项式 $f(x)$ 可以通过计算其系数与 $x$ 的连续幂的内积来进行评估:
例如,如果 $f(x)=3x^3+2x^2+5x+10$ ,那么其系数为 $[3,2,5,10]$ ,我们可以将该多项式计算为
$f(x)=\langle[3,2,5,10],[x^3,x^2,x, 1]\rangle$
<aside> 💡 💡 一句话理解:算多项式其实就是『两列数对应相乘再相加』。把系数排成一列 $[3,2,5,10]$,把 $x$ 的各次幂排成另一列 $[x^3,x^2,x,1]$,对齐相乘后加起来,就是 $f(x)$。这种『对应相乘再求和』就叫内积 $\langle\cdot,\cdot\rangle$。这一步看似多此一举,却是后面所有魔法的入口——因为它把『算多项式』拆成了系数和幂次两份,可以分开处理。
</aside>
换句话说,对于上面的多项式,我们通常会将评估 $f(2)$ 视为
$f(2)=3(2)^3+2(2)^2+5(2)+10$
但我们也可以将其评估为
$f(2)=\langle[3,2,5,10],[8,4,2,1]\rangle = 3\cdot8+2\cdot4+5 \cdot2+10\cdot1$
现在假设有人选择了一个秘密标量 $\tau$ 并计算
$[\tau^3,\tau^2,\tau,1]$
然后将这些点中的每一个与密码学椭圆曲线群的生成元(generator point)相乘。结果将如下所示:
$[\Omega_3, \Omega_2, \Omega_1, G_1]=[\tau^3G_1,\tau^2G_1,\tau G_1,G_1]$
<aside> 💡 💡 这里是全文最关键的一招:先偷偷选一个秘密数 $\tau$(比如 88),算出它的各次幂,再把每个幂都『锁进保险箱』——也就是乘上椭圆曲线的生成元 $G_1$,得到 $\Omega_3,\Omega_2,\Omega_1$。椭圆曲线有个神奇性质:你能看到 $\tau G_1$ 这个点,却没办法反推出 $\tau$ 是多少(这叫离散对数难题)。就像你能看到一杯调好的奶茶,却尝不出里面到底放了几勺糖。于是 $\tau$ 被永久藏了起来,但它的幂次信息还在,随时能用。
</aside>
现在,任何人都可以获取 结构化参考字符串 (SRS,structure reference string) $[\Omega_3, \Omega_2, \Omega_1, G_1]$ ,并对 $\tau$ 评估一个三次(或更低次)的多项式。
<aside> 💡 💡 打个比方:SRS 就像一套已经盖好印章的『空白支票』$[\Omega_3,\Omega_2,\Omega_1,G_1]$,公开发给所有人。每张支票背后都藏着 $\tau$ 的一个幂,但谁也看不出 $\tau$。拿到这套支票,你就能在这个谁也不知道的秘密点 $\tau$ 上算任意三次以内的多项式——这正是它叫『结构化参考字符串』的原因:它不是乱凑的随机数,而是按 $\tau$ 的幂次精心排好的结构。
</aside>
例如,如果我们有一个二次多项式 $g(x)=4x^2+7x+8$ ,我们可以通过计算该结构化参考字符串与多项式的内积来评估 $g(\tau)$ :
$\langle[0,4,7,8],[\Omega_3, \Omega_2, \Omega_1, G_1]\rangle=4\Omega_2+7\Omega_1+8G_1$
<aside> 💡 💡 为什么能算出 $g(\tau)$ 却不知道 $\tau$:还记得前面说多项式 = 内积吗?现在把系数 $[0,4,7,8]$ 和那套保险箱 $[\Omega_3,\Omega_2,\Omega_1,G_1]$ 做内积。因为每个 $\Omega$ 里已经装好了对应的 $\tau$ 幂,相乘求和后自动得到 $g(\tau)G_1$。好比厨师早就备好了几份食材包,你只管按配方比例(系数)取用、拌在一起,根本不用知道每包里具体是什么。结果算对了,秘密却始终没露面。
</aside>