用途
该技能用于在 Midnight Network 上构建、调试或扩展隐私保护支付 dApp,使用 1AM 钱包和 Compact 智能合约。其核心示例是一个隐私支付金库:用户通过 Compact 合约存入/提取 tNIGHT,并借助 1AM 钱包实现零 gas 费。
主要能力
- 提供从合约编写、Provider 设置、部署、电路调用、索引器/状态轮询到 UI 的完整工作流。
- 给出规范的 Provider 接线方式(lib/midnight.ts),适用于所有浏览器 dApp。
- 提供 Compact 合约示例,包含 deposit、withdraw 电路及 owner 权限校验。
- 提供会话创建、私密状态提供者、修补后的公共数据提供者、编译合约构建器、索引器轮询与状态解码等参考实现。
- 包含 Next.js 配置(WebSocket shim、webpack 回退与别名、asyncWebAssembly、topLevelAwait)及 package.json 脚本要求。
- 列出代币单位换算(1 NIGHT = 1,000,000 Stars;1 Star = 1 base unit)并强调使用 BigInt。
- 提供已知问题与修复对照表。
使用方式
按以下顺序推进:合约编写 → Provider 设置 → 部署 → 电路调用 → 索引器/状态轮询 → UI。在编写任何 provider 或电路代码前,先检查已知陷阱(references/gotchas.md)。从 references/midnight-session.md 复制 provider 接线。使用底层 SDK 函数(createUnprovenDeployTx、submitTxAsync、submitCallTxAsync),不要使用在 preprod 上失效的高层封装(deployContract、createProofProvider)。始终用修补版本包装公共数据提供者,以避免 GraphQL offset: null 错误。
交易流程:检测 1AM 钱包 → 连接 → 创建包含所有 provider 的会话 → 部署合约(底层)并存储地址与私密状态 → 存入:调用 receiveUnshielded 电路并轮询索引器 → 提取:调用 sendUnshielded 电路(仅 owner)并轮询索引器。
合约编译:cd contract && npm run compact,输出到 contract/src/managed/payment/。
ZK 资产托管:运行 npm run sync:assets 将 contract/src/managed/payment/{keys,zkir}/ 复制到 public/zk/payment/。调试任何 provider/SDK 错误前,先直接打开资产 URL(如 http://localhost:3000/zk/payment/keys/deposit.prover),404 会表现为晦涩的 SDK 错误。
适用场景
- 在 Midnight Network 上开发隐私支付 dApp。
- 使用 1AM 钱包与 Compact 智能合约进行集成。
- 调试部署挂起、证明失败、GraphQL 错误、ZK 资产 404 等问题。
- 需要参考实现来搭建 Next.js 前端与索引器轮询逻辑。
限制
- 高层封装 deployContract、createProofProvider 在 preprod 上失效,必须使用底层函数。
- 私密状态提供者为内存实现,exportPrivateStates、importPrivateStates、exportSigningKeys、importSigningKeys 均抛出 Not implemented。
- 必须使用 --webpack 标志,并配置 asyncWebAssembly 与 topLevelAwait。
- 代币金额必须使用 BigInt,Stars 在真实余额下会溢出 JS number。
- 钱包检测需优先检查 window.midnight['1am'],回退到 window.midnight?.mnLace。
- 其他未在资料中说明的功能、收费、价格、平台或效果暂未提供。