用途
该技能用于在 Midnight Network 上构建一个「私密派对」报名 dApp。主办方可以收集报名信息,而在参与者签到并支付入场费之前,其身份保持私密。入场费用非屏蔽代币 NIGHT 支付,该支付动作构成隐私边界——因为 Midnight 上的非屏蔽代币流动始终是公开的。
主要能力
- 合约逻辑(Compact):包含 rsvp、startParty、checkIn、closeEntry、claimFees 等电路,以及 commitAddress、getDappPublicKey 辅助电路。
- 无 witness 合约:调用者鉴权通过电路私有的
_secret派生公钥getDappPublicKey(_secret),并与链上 organizer 比较完成。 - 报名隐私:访客的 UserAddress 与 secret 通过
persistentCommit生成承诺哈希,链上hashedPartyGoers只保存哈希。 - 隐私边界:checkIn 调用
receiveUnshielded(nativeToken(), entryFee)后,将访客地址通过disclose(address)插入checkedInParty,访客地址由此变为公开。 - 主办方公开:claimFees 通过
sendUnshielded(...)向主办方 UserAddress 转账,主办方地址公开。 - 配套代码:私有派对合约、Next.js 客户端 UI(主办方部署/开始/关闭/领取 + 参与者报名/签到)、钱包会话与修补后的 indexer provider、部署与各电路调用封装、Bech32 非屏蔽地址到 UserAddress 字节的转换、32 字节 DApp secret 的生成与 localStorage 存储、从合约构建同步的 ZK 证明资产。
使用方式
脚手架模式(默认):用户想要一个可运行的 dApp。直接逐字使用文档中的代码块,它们是被测试过的参考实现,不要自行重新推导。
教程模式:用户明确希望自己编写 Compact 来学习。此时按 §5 逐电路讲解 private-party.compact 并让用户自己输入,但周围的 TS/UI 仍按代码块搭建。
运行步骤:复制 templates/private-party-dapp/ 得到完整的 Next.js 项目(合约 + UI)。安装 1AM 钱包后,执行 npm install && npm run compact && npm run sync:assets && npm run dev。
工作流程:编写/搭建合约 → 理解隐私边界(私密报名 → 公开签到(非屏蔽)→ 公开支付)→ 创建连接会话 → 主办方部署(传入 partySize、entryFee、organizerSecret)→ 参与者在派对开始前调用 rsvp → 主办方调用 startParty(或名单满时自动进入 READY)→ 已报名访客调用 checkIn 并支付入场费(跨越边界)→ 主办方在未全部签到时可 closeEntry(或满员自动关闭)→ 关门后主办方 claimFees → UI 提供角色选择、派对状态面板、对公开状态的 indexer 轮询。
适用场景
适用于需要「报名阶段私密、签到付费时公开」这类隐私设计的活动报名场景,以及希望学习 Midnight Compact 隐私边界、非屏蔽代币转账、承诺哈希与链上状态机编写的开发者。
限制与注意事项
- 合约无 witness,compile 输出预期电路为 rsvp、startParty、checkIn、closeEntry、claimFees。
disclose()是开发者断言,用于标记值可安全进入公开域,它本身不执行披露。persistentCommit的输出无需disclose()即可安全上链,但需要足够随机的 salt(_secret)。- 使用
createUnprovenDeployTx + submitTxAsync,而不是deployContract()(后者在 preprod 上会挂起)。 - 需用修补过的
queryContractState包装 indexerPublicDataProvider(GraphQL offset: null 问题)。 - 入场费在账本上是 Uint<16>,但非屏蔽操作时需转为 Uint<128>;1 NIGHT = 1_000_000 Stars。
- organizer/attendee 的
_secret需持久化到 localStorage,丢失即丢失该角色的鉴权。 - 模板默认面向 preprod(钱包连接、indexer、证明服务器)。若部署目标是 preview,需修改
lib/midnight.ts中的 DEFAULT_NETWORK,这是唯一的网络字符串来源,其它位置不应硬编码网络。 - 不要在 contract/ 内运行 npm install,会出现双 WASM 实例 bug;所有依赖位于根目录,contract/package.json 仅用于 compact 编译脚本。
- 前置条件:Node 22+(vitest 测试)或 20+(Next.js 前端)、可选 Docker 本地 devnet、Compact 编译器安装脚本、浏览器 1AM 钱包(网络需与 DEFAULT_NETWORK 一致,默认 preprod)并存有用于入场费的 tNIGHT。
- 官方参考仓库:github.com/midnightntwrk/example-private-party(Compact 教程 + vitest 测试工具,Docker devnet 上运行
yarn test:local)。 - 其它如具体收费、价格、平台覆盖或效果等事实,资料未提供。