TGViewer
开发者工具箱|编程·开发工具·资源 开发者工具箱|编程·开发工具·资源 @devtoolboxhub · 559 subscribers
Post #1177 7
Midnight 屏蔽代币合约常见错误与修复

Midnight 的 Compact 语言与 EVM 世界截然不同,构建屏蔽流动性 DeFi 合约时极易踩坑。作者在数月实践中整理了 6 个最致命的错误及正确模式,每个错误都曾导致电路中断或证明服务器失败。

背景:Zswap 协议与屏蔽代币的运作机制
当用户调用 receiveShielded 向合约转账时,Compact 运行时记录接收义务,证明服务器随后生成 ZK 证明。但合约只描述了自己的行为,交易还需平衡:收到的代币必须来自用户钱包。钱包根据 ShieldedCoinInfo(币种颜色和金额)在用户隐私币集中找到对应 UTXO,生成 Zswap 所有权证明。ShieldedCoinInfo 必须作为电路参数传入,因为钱包需要它在构造交易时确定待平衡的 UTXO。

错误 1:为每种资产分别创建独立 QualifiedShieldedCoinInfo 账本字段
这会导致证明构造问题和账本状态不一致,且无法扩展新资产。正确做法:使用 Map<Bytes<32>, QualifiedShieldedCoinInfo> 按币种颜色统一管理所有屏蔽资产。

错误 2:在同一个电路中同时接收和发送同一币种的屏蔽代币
这会导致公开输入不匹配错误。receiveShielded 和 sendShielded 操作会修改同一个 UTXO 槽位,证明服务器无法平衡等式。正确做法:拆分为两个电路——一个只接收并更新状态为待处理,另一个只发送并验证状态。
例外情况:接收一种代币并铸造另一种(如 LP 代币)或接收后立即通过 sendImmediateShielded 销毁,因不涉及同一 QualifiedShieldedCoinInfo 可合并。

错误 3:将屏蔽代币余额当作非屏蔽余额对待
合约不会自动追踪屏蔽 UTXO。若收到存款后不显式存入 contractShieldedBalance 账本,该 UTXO 将永久丢失。每次 receiveShielded 后必须调用 insertCoin。

最佳实践 4:始终将 ShieldedCoinInfo 作为电路参数传入
不要在电路内部推导代币信息。钱包需要读取参数以选择 UTXO 并生成所有权证明。前端从钱包 API 获取可用币列表,构造 ShieldedCoinInfo 后传入。

错误 5:将每笔存款作为独立 UTXO 存储
用 Set<QualifiedShieldedCoinInfo> 积累 UTXO 会导致发送时需手动筛选合并,逻辑复杂且脆弱。正确做法:每次存款用 mergeCoinImmediate 合并到同一颜色的单一条目中。

错误 6:发送后未处理找零
sendShielded 不会自动返回找零。必须检查返回的 result.change,若有则 insertCoin 存回,若余额完全耗尽则 remove 该条目。否则下次发送将因 UTXO 已被花费而失败。

总结:可靠模式
状态设计:一个 Map<Bytes<32>, QualifiedShieldedCoinInfo> 作为所有屏蔽持有的单一事实来源;其他记账用独立非屏蔽账本。
接收:接受 ShieldedCoinInfo 参数 → receiveShielded → mergeCoinImmediate 合并
发送:查找余额 → sendShielded → 处理找零或移除
同一 QualifiedShieldedCoinInfo 的收发必须拆分电路。
安全例外:接收+铸造不同代币,或接收+立即销毁。


这些模式来自大量试错,希望帮助后来者节省时间。

#开发者 #工具 #Midnight #Compact #Zswap #ShieldedTokens #DeFi #ZK
📢 频道:@DevToolboxHub
More from @devtoolboxhub
  1. Oct 2, 2026AWS AIF-C01 偏差与方差考点梳理 备考 AWS Certified AI Practitioner 时,偏差与方差是高频易错点。核心判断逻辑只有一条:训练集与未见数据的表…
  2. Oct 2, 2026功能开关正在变成没人清理的技术债 功能开关(Feature Flag)是现代软件交付里最有效的工具之一:支持灰度发布、A/B 实验、未发布功能门控,以及生产环境的即时熔断开关。但这…
  3. Oct 2, 2026containerd 检查点恢复路径默认关闭 Kubernetes 里策略变成进程状态只有一处,就是创建。检查点恢复是通往运行进程的第二条路,而这条路上没有任何环节决定:当保存的状…
  4. Oct 1, 2026给 AI 代理建一份「自欺清单」 维也纳邮政与邮件服务商 Postservice.at 创始人 Stephan Holzbach 不是开发者,但今年公司大部分工作跑在 Claude…
  5. Oct 1, 2026代码评审评论为何比本意更刺耳 一条评审评论大约四十秒写完,通常夹在两件事之间,写的人清楚自己的语气。读的人刚在这份代码上花了三天,正想收尾,而且听不到你的声音,于是自己补上一种语气…
  6. Oct 1, 2026用 Hindsight 给客服 Agent 加上持久记忆 大多数客服 Agent 只擅长回答眼前这条消息。真正难的是同一个客户一周后再来,Agent 完全不知道之前发生过什么。作者…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →