全部说明

2026-05-25

零知识证明如何工作(不讲数学)

零知识证明让您可以证明一个陈述为真,而无需透露它为什么为真。

经典例子:想象一位色盲朋友,手里拿着两个外观相同的球 —— 一个红色,一个绿色。您可以向他证明这两个球的颜色确实不同,而不必告诉他哪个是哪个。做法是让他在背后将两个球交换(或不交换),然后您告诉他是否发生了交换。经过足够多轮之后,他相信您能区分红色和绿色,但他仍然不知道哪个球是哪种颜色。

这就是全部要点。SolMask 将 ZK 证明用于一个具体陈述:

"我知道一个秘密,它对应于该屏蔽池中的某一笔存款,并且我已经授权向钱包 X 提取 N 个代币。"

证明对哪一笔存款只字不提。链上看到一笔合法的提款,但无法将其与任何具体的存款匹配。

证明里包含什么

当您存款时,SolMask 计算了一个承诺:

commitment = Poseidon(secret, nullifier_secret, amount, unlock_slot)

只有承诺会落到链上。四个输入 —— 您的秘密、nullifier、金额,以及您同意等待的时间 —— 永远不会离开您的浏览器。它们不会被保存到某个需要您看管的文件里:您的钱包通过签署一条固定消息,在需要时重新派生出它们,而存款会把一段由钱包加密的恢复数据块发布到链上,让同一个钱包在任何地方都能重新找回这张 note。

当您提款时,您的浏览器生成一份 Groth16 证明,用数学语言来说:

  1. 该承诺是池子 Merkle 树中的某一片叶子(不说是哪一片)。
  2. 您现在揭示的 nullifier 是您先前承诺的那个 nullifier secret 的哈希。
  3. 已经过了足够的时间(current_slot >= unlock_slot)。
  4. 您提取的金额与该承诺的价值一致。
  5. 任何找零都被哈希成一个新的承诺,并由您加入树中。

证明大约 200 字节。Solana 程序在几毫秒内即可验证完毕。

为什么需要 nullifier?

每笔存款都附带一个独特的秘密。提款时,您揭示该秘密的哈希 —— 即 nullifier。链上会记录见过的每一个 nullifier;如果您试图将同一笔存款提取两次,第二次会暴露出相同的 nullifier,从而被拒绝。

关键在于,nullifier 是从您的私密秘密生成的 —— 所以只有能为您的存款生成它,但链上无需获取秘密本身即可对其进行验证。

为什么用 Poseidon?

像 SHA-256 这样的标准哈希在被表达为零知识证明时极其昂贵(想想:数十万条约束)。Poseidon 是一种专为 ZK 电路内部廉价运行而设计的哈希 —— 在相同安全等级下,约束数量大约是 Keccak 的 1/5。代价是:如果直接在 CPU 上计算,它比 SHA-256 慢,但这对我们的用例无关紧要。

为什么用 Groth16?

Groth16 是 ZK 领域中经过生产实战检验最多的证明系统。它的证明非常小(3 个椭圆曲线点,约 200 字节),并且在常数时间内完成验证。代价是:它需要一次性的可信设置仪式来生成公共参数。SolMask 的仪式记录在我们的可信设置说明中。

您不需要信任什么

您不需要信任 SolMask 的运营方。验证器代码在链上且公开。电路是公开的、可复现的。Relayer 可以拒绝广播您的提款,但无法窃取您的资金 —— 证明绑定了接收地址,任何重定向的尝试都会使其失效。

您确实需要信任什么

可信设置。如果参与过仪式的任何人保留了秘密的"有毒废料",他就可能伪造证明并榨干池子。SolMask 的仪式使用一个公开的 Bitcoin 区块信标作为随机性锚点;随着协议成熟,计划进行一场公开的多方仪式。

打开应用

零知识证明如何工作(不讲数学) · SolMask