/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
去中心化 AI 会话零知识证明:基于 zk-SNARK 验证 LLM 推理完整性的极客实验

在去中心化 AI 算力网络(如 Bittensor、Gensyn、Ritual)中,最核心的信任挑战是**“推理完整性验证(Inference Integrity Verification / zkML)”**:
- 用户花钱向去中心化节点请求运行一个 70B 参数的大模型;
- 不诚实的算力节点为了偷工减料省电,可能偷偷使用一个极其劣质的 1B 小模型生成回答,甚至随机返回垃圾文本冒充正品。
在传统的 Web2 架构中,我们只能依赖“信任云厂商的声誉”。
在 Web3 密码学世界中,零知识证明(zk-SNARK / zkML) 允许算力提供方在生成回答的同时,生成一份小巧的数学证明(ZK Proof)。链上智能合约或客户端只需要花费几毫秒,就能从数学上 100% 确认:该输出确实是由特定的神经网络权重在给定输入下经过真实矩阵乘法计算出来的,且中间没有被任何恶意节点偷换或篡改。
本文复盘一个基于 Circom 与 Groth16 验证轻量神经网络推断完整性的全栈极客实验。
一、zkML 零知识推理验证全景拓扑
sequenceDiagram
autonumber
actor User as 用户客户端 (Rich.eth)
participant Prover as 去中心化 GPU 算力节点 (zk-Prover)
participant Contract as 链上验证合约 (ZKMLVerifier.sol)
User->>Prover: 1. 提交输入 Prompt 特征向量 X
Prover->>Prover: 2. 执行神经网络前向推理 Y = Activation(W * X + B)
Prover->>Prover: 3. 在 Circom 算术电路中生成 zk-SNARK 证明 (Proof $\\pi$)
Prover–>>User: 4. 返回推理结果 Y + 数学证明 Proof
User->>Contract: 5. 提交 verifyInference(X, Y, Proof)
Contract->>Contract: 6. 链上配对运算 (Pairing Check) 毫秒级验证
Contract–>>User: 7. 确认结果绝对真实,自动释放 Escrow 赏金
二、Circom 神经网络前向传播算术电路实现
为了验证矩阵乘法与 ReLU 激活函数的正确性,我们编写一个轻量级二层量化感知机(MLP)电路:
// circuits/neural_layer.circom
pragma circom 2.1.6;
// 1. 定点数矩阵乘法电路
template DenseLayer(nInputs, nOutputs) {
signal input in[nInputs];
signal input weights[nOutputs][nInputs];
signal input bias[nOutputs];
signal output out[nOutputs];
signal dot[nOutputs][nInputs + 1];
for (var i = 0; i < nOutputs; i++) {
dot[i][0] <– bias[i];
for (var j = 0; j < nInputs; j++) {
dot[i][j + 1] <== dot[i][j] + in[j] * weights[i][j];
}
out[i] <== dot[i][nInputs];
}
}
// 2. ReLU 激活函数电路
template ReLU(n) {
signal input in[n];
signal output out[n];
for (var i = 0; i < n; i++) {
// 使用定点数比较约束 (大于 0 保持原值,小于 0 归零)
out[i] <– in[i] > 0 ? in[i] : 0;
out[i] * (out[i] – in[i]) === 0;
}
}
template MainInference() {
signal input promptFeatures[4]; // 输入特征
signal input modelWeights[2][4]; // 预设模型权重 (可作为私有输入证明所有权)
signal input bias[2];
signal output predictedClass;
component dense = DenseLayer(4, 2);
dense.in <== promptFeatures;
dense.weights <== modelWeights;
dense.bias <== bias;
// 输出分类结果
predictedClass <== dense.out[0];
}
component main = MainInference();
三、TypeScript 证明生成与链上 Solidity 验证
1. Prover 端生成 Groth16 零知识证明
// scripts/generateZKProof.ts
import * as snarkjs from 'snarkjs';
import fs from 'fs';
export async function computeZKMLProof(promptFeatures: number[], modelWeights: number[][], bias: number[]) {
const input = {
promptFeatures,
modelWeights,
bias,
};
console.log('⚡ [zkML Prover] Computing SNARK proof over neural circuit…');
const startTime = Date.now();
// 生成 Witness 并计算 Groth16 证明
const { proof, publicSignals } = await snarkjs.groth16.fullProve(
input,
'circuits/neural_layer.wasm',
'circuits/circuit_final.zkey'
);
console.log(`✅ [Proof Generated] Completed in ${Date.now() – startTime}ms`);
return { proof, publicSignals };
}
2. Solidity 链上极速验签合约
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IGroth16Verifier {
function verifyProof(
uint[2] calldata a,
uint[2][2] calldata b,
uint[2] calldata c,
uint[2] calldata input
) external view returns (bool r);
}
contract ZKMLInferenceEscrow {
IGroth16Verifier public immutable verifier;
bytes32 public immutable expectedModelHash;
event InferenceVerified(address indexed prover, uint256 prediction);
constructor(address _verifier, bytes32 _modelHash) {
verifier = IGroth16Verifier(_verifier);
expectedModelHash = _modelHash;
}
// 验证 AI 推理证明并结算赏金
function verifyAndClaim(
uint[2] calldata a,
uint[2][2] calldata b,
uint[2] calldata c,
uint[2] calldata publicInputs
) external {
// 链上双线性配对运算验证证明合法性 (消耗 ~200,000 Gas)
bool isValid = verifier.verifyProof(a, b, c, publicInputs);
require(isValid, "Invalid zkML proof! Fraud detected.");
emit InferenceVerified(msg.sender, publicInputs[0]);
// 自动释放质押的 USDC 服务费给算力节点
}
}
四、zkML 的工程挑战与未来演进
zk-SNARK 为去中心化 AI 注入了不可伪造的数学底座。当神经网络的每一次脉冲都能被密码学证明,一个真正无需信任的机器智能世界才成为可能。


