6.1 Zero-Knowledge Proofs for KYC (zk-KYC)
zk-KYC 允许用户向协议证明:“我是合法的、非受制裁的真人用户”,而无需透露“我是谁”。
6.1.1 Circuit Design for Identity Verification
我们的 ZK 电路(基于 Circom 或 Halo2 编写)旨在证明一个特定的算术陈述。
1. 凭证发行 (Credential Issuance - Off-chain)
首先,用户在本地设备向受信任的第三方发行商(Issuer,如 Synaps 或 Binance)出示实体证件。发行商验证通过后,对用户的去中心化标识符 (DID) 进行数字签名,生成凭证 $C$。
2. 电路逻辑 (The Circuit Statement)
当用户想要与 OmniPact 交互(例如充值大额资金)时,必须生成一个 Proof $\pi$。
零知识电路 $C_{kyc}$ 包含以下约束:
输入 (Inputs):
Private Inputs (私有输入): 用户的私钥 ,凭证 ,凭证的 Merkle Path。
Public Inputs (公共输入): 发行商公钥 ,合规列表的 Merkle Root ,制裁名单的 Merkle Root 。
逻辑约束 (Constraints):
签名验证: 证明 $C$ 确实是由 $PK_{Issuer}$ 签发的有效凭证。
$$\text{VerifySig}(PK_{Issuer}, C) == \text{true}$$
所有权证明: 证明用户拥有与凭证 绑定的私钥 。
成员资格证明 (Membership): 证明该凭证存在于有效用户树 中。
非成员资格证明 (Non-Membership): 证明该用户不在 OFAC 制裁名单树 中。
属性断言: (可选)证明
Attributes.Age >= 18或Attributes.Country != "North Korea",但不暴露具体数值。
3. 输出 (Output)
电路输出证明 $\pi$。智能合约验证 $\text{Verify}(\pi, PublicInputs)$。若为真,则允许交易。整个过程链上不存储任何用户姓名或证件号。
6.1.2 Nullifier Implementation for Anonymity
在保护隐私的同时,我们必须防止 “双花身份” (Identity Double-Spending),即同一个合规用户在被封禁后,换个马甲重新进入,或者同一个用户领取多次“新人奖励”。为此,我们引入了 Nullifier (无效符) 机制。
1. 确定性且不可逆的标识符
Nullifier 是一个哈希值,它对于同一个用户在同一个 Scope(作用域)下是唯一的,但无法逆向推导出用户身份。
Nullifier 计算公式:
: 用户的秘密私钥(这也是 ZK 电路的私有输入)。
Scope: 作用域参数。
如果是 全局封禁列表,Scope 为
PROTOCOL_ID。如果是 单次投票活动,Scope 为
ELECTION_ID。
PoseidonHash: 一种对 ZK 电路友好的哈希算法。
2. 运作机制 (Mechanism)
生成: 每次用户提交 zk-KYC 证明时,电路会作为副产品计算出 并作为 Public Output 公开。
记录: 智能合约维护一个
mapping(bytes32 => bool) usedNullifiers。防重放:
如果目的是“每人限领一次”,合约检查
usedNullifiers[Nullifier]是否为true。若是,则拒绝。如果目的是“黑名单追踪”,当某个 Nullifier 被 OmniPact 治理委员会标记为恶意(Malicious)时,该 Nullifier 将被永久加入
Blacklist。
匿名性: 由于 只有用户自己知道,外部观察者看到的是一串随机乱码。即便用户在不同的 DApp 中使用 OmniPact 协议,只要 Scope 不同,生成的 Nullifier 也完全不同,从而防止了跨应用的关联性攻击 (Linkability Attack)。
本节展示了 OmniPact 如何利用密码学前沿技术(Poseidon Hash, Merkle Proofs),在“绝对隐私”和“监管合规”这两个看似对立的需求之间,找到了完美的数学平衡点。

