发布于 2026-01-06 0 阅读
0

匿名举报人收件箱,提供零知识证明

匿名举报人收件箱,提供零知识证明

这是为Midnight Network 的“隐私优先”挑战赛——“保护数据”主题提交的作品

我建造的

Midnight Whistleblower是一款以隐私为先的去中心化应用 (DApp),它重新定义了安全举报的方式。试想一下,你需要举报一些敏感信息(例如腐败、违反安全规定或不当行为),但又担心遭到报复。传统的举报系统迫使你做出选择:要么保持沉默,要么冒着被曝光的风险。Midnight Whistleblower 打破了这种两难困境。

魔法✨

我们的平台融合了三种强大的隐私保护技术:

  1. 零知识证明:无需透露您的身份即可证明您有权进行报告
  2. 速率限制无效器 (RLN):在保持完全匿名性的同时防止垃圾邮件
  3. 端到端加密:只有指定的审核员才能解密举报内容,即使是我们的服务器也无法读取。

翻开每一页的旅程🗺️

🏠 首页:通往匿名真相的门户
首页描述

  • 简洁、极简的设计,不会让人感到畏惧。
  • 两条清晰的路径:“我需要举报某些内容”或“我是版主”。
  • 隐私承诺放在最显眼的位置:“您的身份信息受到数学保护”

📝 提交报告(记者页面):勇气与密码学的交汇
提交描述

  • 第一步:建立信任关系。粘贴管理员的公钥(就像选择谁可以阅读你的密封信件一样)。
  • 第二步:撰写报告。自信地撰写报告,并添加证据。每次击键操作在加密前都保留在本地。
  • 步骤三:精彩瞬间。点击提交,观看视频:
    • 您的浏览器会生成一个零知识证明(证明您可以在不透露身份的情况下提交内容)。
    • 内容采用军用级 AES-GCM 加密。
    • 本纪元中,唯一的无效化符可防止重复提交。
    • 你会得到一个模拟交易哈希值(根据挑战规则,不涉及真钱交易)。

🔐 版主控制面板:值得信赖的守护者工具包
主持人描述

  • 密钥保管库:生成、导入或导出您的加密密钥,并启用密码保护。
  • 加密收件箱:解密前,报告会显示为神秘的锁定盒子。
  • 证明验证:每份报告的零知识证明都会在您解密之前进行验证。
  • 工作流程管理:标记为已审核或已存档(统计数据即时更新)
  • 信任模型:您的私钥永远不会离开您的浏览器。

📊 指标页面:了解真相的流动
指标描述

  • 实时统计:待处理、已审核、已存档
  • 随时间变化的趋势可视化
  • 帮助版主管理工作量并发现模式
  • 所有内容均源自加密数据,无内容泄露。

📈 公开统计数据:透明且不妥协
统计数据说明

  • 展示汇总数据以建立公众信任
  • “已提交147份报告,已审核89%”
  • 不包含任何身份识别信息,只有问责指标

⚙️ 设置:您的控制中心
设置说明

  • 云同步开关:一个开关,简单易用
    • 关闭 = 纯本地模式,您的数据绝不会离开您的设备。
    • 开启 = 通过 Vercel KV 进行加密同步,实现多设备访问
  • 智能合约模式:默认启用(为模拟挑战而设置)
  • 高级选项:默认隐藏,除非您需要使用。我们尊重您的认知负荷。

🛡️隐私页面:我们的承诺详解
隐私说明

  • 用通俗易懂的语言解释我们的密码技术
  • 我们存储的内容(密文),我们不存储的内容(你的身份信息)
  • 无需数学博士学位,RLN 也能运作
  • 您的权利和我们的承诺

演示

架构概述

┌─────────────────────────────────────────────────────────┐
│                    USER BROWSER                         │
│  ┌─────────────────────────────────────────────────┐    │
│  │   React App + MidnightJS + Web Crypto API       │    │
│  └─────────────────────────────────────────────────┘    │
│                           │                             │
│        ┌──────────────────┼──────────────────┐          │
│        ▼                  ▼                  ▼          │
│  ┌──────────┐      ┌──────────┐      ┌──────────┐       │
│  │ZK Proofs │      │Encryption│      │   RLN    │       │
│  │(Groth16) │      │(AES-GCM) │      │Nullifiers│       │
│  └──────────┘      └──────────┘      └──────────┘       │
│                           │                             │
│                    ┌──────▼──────┐                      │
│                    │  IndexedDB  │                      │
│                    │(Local First)│                      │
│                    └──────┬──────┘                      │
└───────────────────────────┼─────────────────────────────┘
                            │ (Optional)
                    ┌───────▼────────┐
                    │  Vercel KV     │
                    │(Encrypted Only)│
                    └────────────────┘
Enter fullscreen mode Exit fullscreen mode

我如何使用 Midnight 的技术

🔮 紧凑型电路(circuits/membership_rln.compact

// Simplified view of our RLN circuit
circuit MembershipRLN {
    // Public inputs
    merkleRoot: Field
    epoch: Field
    nullifier: Field
    signalHash: Field

    // Private inputs (never revealed!)
    identitySecret: Field
    merklePath: Field[20]

    // The magic: prove membership without revealing identity
    assert(verifyMerkleProof(identitySecret, merklePath) == merkleRoot)
    assert(hash(identitySecret, epoch) == nullifier)
}
Enter fullscreen mode Exit fullscreen mode

🎯 MidnightJS 集成

我们的src/lib/midnightjs.ts隐私保护体系谱写了一曲动人的乐章:

// Load compiled artifacts (proving key, verification key, WASM)
const artifacts = await ArtifactLoader.loadArtifacts('membership_rln');

// Generate proof (happens in reporter's browser)
const proof = await midnightJS.generateProof('membership_rln', {
    merkleRoot: organizationRoot,
    epoch: currentEpoch,
    identitySecret: userSecret,  // Never leaves the browser!
    merklePath: membershipPath
});

// Verify proof (happens in moderator's browser)
const isValid = await midnightJS.verifyProof('membership_rln', proof);
Enter fullscreen mode Exit fullscreen mode

🚀 发展体验

我们构建了一个双速系统:

  • 生产模式:使用编译后的 Midnight 工件进行真正的 ZK 证明
  • 开发模式:闪电般快速的存根,实现快速迭代(VITE_USE_REAL_MIDNIGHT=false

这意味着您可以全速开发用户体验,然后切换到实际的测试版本进行验证。

数据保护作为一项核心功能

🔐 隐私堆栈

第一层:匿名身份

  • ZK 会员资格证明可让您在不透露身份的情况下证明“我有提交权限”。
  • 就像无需出示姓名即可出示有效车票一样。

第二层:无追踪反垃圾邮件

  • RLN 无效器可防止每天多次提交。
  • 巧妙之处在于:我们可以在不知道提交者身份的情况下检测重复项。
  • 空值 = Hash(你的秘密 + 今天的日期)

第三层:端到端加密

// In the reporter's browser
const encrypted = await encryptMessage(reportContent, moderatorPublicKey);
// Now it's gibberish to everyone except the moderator

// In the moderator's browser (and nowhere else!)
const decrypted = await decryptMessage(encrypted, moderatorPrivateKey);
// The report is revealed, but the identity remains hidden
Enter fullscreen mode Exit fullscreen mode

第四层:本地优先架构

  • 默认情况下,您的数据存储在 IndexedDB 中。
  • 云同步是可选的,仅传输密文。
  • 您拥有您的数据,我们只是帮助您迁移数据。

🛡️ 有何不同之处

传统举报人制度:

  • ❌ “相信我们,我们会保护您的身份”(基于信任)
  • ❌ “使用 Tor 并祈祷一切顺利”(基于网络)
  • ❌ “创建一个一次性邮箱”(弱化匿名)

午夜告密者:

  • ✅ 匿名性的数学证明(基于零知识证明)
  • ✅ 静态数据和传输中数据加密(基于密码学)
  • ✅ 提交之间不可能存在相关性(基于无效化)
  • ✅ 即使我们的服务器遭到入侵,也能正常工作(基于客户端)

设置说明/教程

🎯 快速入门(5分钟)

先决条件:Node.js 18+,Git

# 1. Clone the repository
git clone https://github.com/depapp/midnight-whistleblower.git
cd midnight-whistleblower

# 2. Install dependencies
npm install

# 3. Compile the Midnight circuits (this is the magic!)
npm run compile-circuits

# 4. Start the development server
npm run dev

# 5. Open http://localhost:5173
Enter fullscreen mode Exit fullscreen mode

🎭 扮演两种角色(教程模式)

第一幕:成为主持人

  1. 导航至/moderator
  2. 点击“生成新密钥对”
  3. 复制你的公钥(记者需要这个)
  4. (可选)导出密钥及密码以作备份

第二幕:提交报告

  1. 打开一个新的隐身窗口(以获得完整体验)
  2. 前往/submit
  3. 粘贴版主的公钥
  4. 请撰写报告:“咖啡机正在密谋对付我们”
  5. 附上证据(可选):photo_of_suspicious_coffee_machine.jpg
  6. 点击提交,见证奇迹:
    • 控制台显示:[MidnightJS] Generating proof...
    • 进度条指示加密状态
    • 你会得到一个交易哈希值(模拟值)。

第三幕:审核报告

  1. 返回版主控制面板
  2. 请查看您的加密报告(看起来像乱码)
  3. 点击解密(需先验证证据)
  4. 阅读关于咖啡机的惊人真相
  5. 标记为“已审核”,并查看统计数据更新。

🚀 生产环境部署(10分钟)

使用云同步部署到 Vercel:

# 1. Install Vercel CLI
npm i -g vercel

# 2. Deploy (follow prompts)
vercel

# 3. Add KV Storage in Vercel Dashboard
# Project Settings → Storage → Create Database → KV

# 4. Environment variables are auto-configured!
Enter fullscreen mode Exit fullscreen mode

在您已部署的应用中:

  1. 前往设置
  2. 开启“云同步”
  3. 就是这样!无需任何配置即可实现多设备同步

🔧 高级配置

开发模式:

# Fast iteration mode (stub proofs)
VITE_USE_REAL_MIDNIGHT=false npm run dev

# Disable mock contract
VITE_USE_CONTRACT=false npm run dev

# Custom sync endpoint (for self-hosting)
VITE_SYNC_BASE_URL=https://your-api.com npm run dev
Enter fullscreen mode Exit fullscreen mode

电路定制:

// Modify circuits/membership_rln.compact
// Recompile with: npm run compile-circuits
// New artifacts are auto-loaded!
Enter fullscreen mode Exit fullscreen mode

故障排除指南

问题 解决方案
“未找到工件” 跑步npm run compile-circuits
“证明生成失败” 检查浏览器控制台[MidnightJS]日志
“无法解密报告” 请确认您使用的是正确的私钥
“统计数据未更新” 等待 500 毫秒进行云同步,然后刷新
开发环境中的 CORS 错误 用于VITE_SYNC_BASE_URL跨域

📚 学习资源

理解代码:

  • src/lib/midnightjs.ts- 了解零知识证明的工作原理
  • src/lib/encryption.ts- 学习 Web 加密 API 模式
  • src/pages/ReporterPage.tsx- 遵循提交流程
  • ARCHITECTURE.md - 深入探讨系统设计

愿景🌟

想象一下这样一个世界:

  • 员工可以毫无顾虑地举报骚扰行为。
  • 公民可以安全地揭露腐败。
  • 学生可以匿名举报校园欺凌行为。
  • 记者的消息来源受到数学保护。

Midnight Whistleblower 不仅仅是一个演示,它还是尊重隐私的应用程序的蓝图,可以改变世界。

文章来源:https://dev.to/depapp/anonymous-whistleblower-inbox-with-zero-knowledge-proofs-124m