SuperAPI AI 工具集

midnight-security

安全与审计

查看项目

更新于 10-15 14:11

技能介绍

用途

Midnight Security 是一个面向 Midnight Network 的隐私安全技能,用于在合约发布前进行隐私审计、识别数据泄露模式,并采用防御性 Compact 合约编写范式。Midnight 的隐私模型是「公共链上的可选隐私」:ZK 证明证明执行的正确性,但不会隐藏交易的存在、其结构或导出账本(export ledger)中的任何内容。因此,Midnight 上的安全意味着精确判断哪些数据会泄露,并设计合约使泄露成为有意为之。

官方安全文档截至 2026 年标注为「即将推出」,该技能用于填补这一空白。主要参考来源包括 docs.midnight.network 上关于保持数据私有、语义和智能合约的概念文档。

主要能力

基本可见性规则

导出账本中的一切都是公开的,witness 中的一切都是私有的。证明是公开的,witness 数据不是。技能给出了每种账本操作所揭示的内容,例如:ledger.insert(v) 揭示值 v;ledger.lookup(k) 揭示键 k 和返回值;set.insert(v) 揭示值 v;set.member(f(x)) 揭示 f(x) 而非 x 本身;map.insert(k, v) 揭示键 k 和值 v;counter.increment(n) 揭示增量 n 和新值;merkleTree.insert(v) 不揭示 v,只揭示树增长了;merkleTree.checkRoot(path) 只揭示有人证明了成员资格,不揭示是哪一条;电路参数全部公开,属于公共记录的一部分;witness 返回值不上链,ZK 证明只证明它们存在过。

隐私审计清单

针对每个合约在发布前运行,覆盖:账本字段(每个导出账本字段谁能读、是否可接受、是否本应作为本地 witness、是否仅因前端需要读取而存在、Map 的键是否敏感、需要匿名时是否误用 Set)、电路参数(是否属于公共记录、敏感值是否直接作为参数而非通过 witness)、承诺与哈希(小值域上的 persistentHash 是否可暴力破解、是否复用 nonce、是否用 transient* 做账本存储)、域分隔符(每个 persistentHash 是否包含唯一域分隔符、同一密钥是否无域分隔地派生多个公钥、承诺与无效化器是否共用域分隔符)、witness 信任(每个 witness 输出是否用 assert 验证)、重放与复用(认证是否缺少序列计数器或无效化器、承诺是否可复用重新授权)、交易结构泄露(调用特定电路是否泄露意图、merkleTree.insert 调用次数是否泄露私有输入信息)。

即使使用 witness 仍会泄露的信息

无论采取何种隐私措施,链上观察者始终可见:调用了哪个合约(合约地址公开)、调用了哪个电路(索引器中的 entryPoint 字段)、何时调用(区块时间戳)、发生了交易(存在性始终公开)、电路参数值(传给导出电路的每个参数)、所有账本写入(每个变化的导出账本字段)、公共记录的形状(读、写、插入的次数,但不含其背后的私有值)。实际含义:如果电路接受 vote: Boolean 作为参数,即使不直接写入账本,投票也是公开的,应移到 witness。

数据泄露模式(常见错误)

技能列出六种模式并给出错误与正确写法对照:

  1. 敏感值作为电路参数(应改为从 witness 获取)。
  2. 需要匿名时使用 Set(Set.member(v) 揭示 v,应改用 MerkleTree 证明成员资格而不揭示是哪一条)。
  3. 小值域上无 nonce 的哈希(persistentHash 对 Boolean 只有两种输出,可被轻易暴力破解,应改用 persistentCommit 配合新 nonce)。
  4. nonce 复用导致承诺关联(同一密钥作 nonce 时,相同值提交两次会在链上产生相同结果,应使用轮次计数器或新随机性派生唯一 nonce)。
  5. 缺少域分隔符导致密钥跨用途复用(同一 sk 在认证和承诺中产生相同哈希,应使用唯一域分隔符)。
  6. 未验证的 witness 输出(应使用 assert 验证所有 witness 输出后再用于逻辑)。

防御性模式(完整实现)

技能提供三个完整实现:

  • 基于哈希的认证(ZK 签名):证明知道密钥而不揭示密钥,序列计数器防止跨轮次重放。
  • 承诺/无效化器(单次匿名代币):证明代币存在于 Merkle 树中且未被花费,而不揭示是哪个代币。承诺与无效化器必须使用不同的域分隔符。
  • 匿名白名单(Merkle 成员资格):授权一组用户而不揭示是哪一位在操作。

交易语义的安全影响

Midnight 交易分两阶段执行,失败行为不同:well-formedness 检查、guaranteed 阶段、fallible 阶段。well-formedness 和 guaranteed 阶段失败时交易整体被拒绝、不包含、不收费;fallible 阶段失败时 guaranteed 阶段效果保留、fallible 阶段回滚、费用没收。安全影响包括:部分成功是真实存在的;fallible 失败会没收费用,攻击者若可强制 fallible 失败可耗尽用户钱包中的 DUST;公共记录在最终确定前于内存池可见,可能被抢跑。

ZK 证明的保证边界

ZK 证明保证:电路逻辑以某些有效私有输入正确运行;公共记录忠实记录电路对账本的读写;证明者在证明时知道满足所有电路约束的 witness。ZK 证明不保证:私有输入从应用角度是「诚实」的(只保证满足电路的 assert);证明者的身份;与之前调用使用了相同的 witness 值;电路参数的机密性(这些始终公开)。实际结论:合约关心的每个不变量都必须由电路中的 assert 强制执行。

Merkle 树深度选择

技能给出深度与最大叶子数、电路影响和适用场景的对照:深度 8(256 叶子,影响最小,用于极小名单和测试)、10(1,024,低,小用户集)、16(65,536,中等,中型 DApp)、20(1,048,576,较高,大用户集)、32(约 40 亿,显著,最大规模)。应使用所需的最小深度,每增加一层都会增大电路规模和证明时间。超出容量插入是运行时错误。HistoricMerkleTree 存储所有历史根,存储成本高于 MerkleTree,仅在需要针对过去根证明成员资格时使用。

安全速查表

技能以表格形式总结风险、错误模式与安全模式,涵盖:敏感值上链、成员资格揭示身份、可暴力破解的哈希、承诺关联、密钥跨用途复用、承诺与无效化器碰撞、重放攻击、双重花费等。

使用方式

该技能以技能(Skill)形式提供,来源为 kali-decoder/midnight-skills,页面地址为 https://www.skills.sh/kali-decoder/midnight-skills/midnight-security。当用户询问哪些数据是公开的、如何审计 Midnight 合约隐私、或如何编写防御性 Compact 合约时使用。具体安装命令与集成方式暂未提供。

适用场景

适用于在 Midnight Network 上开发或审计 Compact 智能合约的开发者,尤其是需要处理隐私数据、匿名成员证明、单次使用代币、ZK 认证等场景。也适用于在合约发布前进行隐私审计、排查数据泄露模式。

限制

官方安全文档截至 2026 年标注为「即将推出」,该技能用于填补空白。技能内容基于 Midnight 的隐私模型和 Compact 语言语义,具体版本兼容性(如 pragma language_version >= 0.22)需以实际环境为准。ZK 证明不保证私有输入的诚实性、证明者身份或电路参数机密性,合约必须自行通过 assert 强制所有不变量。