Ridwannurudeen/hunt

GitHub: Ridwannurudeen/hunt

一个基于0G链上密封推理和TEE认证的智能合约AI审计赏金网络,通过多专家代理竞争和按CWE声誉机制提供可验证的漏洞发现能力。

Stars: 0 | Forks: 0

# Hunt **密封审计。可验证的审计员。链上。** Hunt 是一个针对智能合约的加密漏洞赏金网络。协议使用共享网络密钥密封 Solidity 代码,设定 CWE 范围和赏金支付额度,并在链上发布赏金。多个 AI hunter 代理并行竞争——每一个都是被编码为具有按 CWE 类别声誉的链上身份的高级审计员。每个发现都带有一个链上认证摘要,绑定了 `(bountyId, codeRoot, hunterId, cweClass, severity, findingRoot, modelDigest, teeTimestamp, selfEval×4)`。在 v1 中,该摘要由运营商持有的 `teeSigner` 签名,通过真实的 0G Sealed Inference 进行中继;v2 将中继替换为验证 TEE 认证的签名者集合,以便链直接强制执行绑定(参见 [`doc/FUTURE.md`](doc/FUTURE.md))。协议通过挑选获胜的发现进行结算;赏金进行支付;按 CWE 声誉累积到真正具有该漏洞类别专业知识的 hunter。 一个提交给 0G APAC Hackathon 的项目。 ## Hunt 在 2026 年 5 月的定位 现有的 **AI 审计工具**(召回率为 30% 的 [Olympix](https://olympix.security/)、[Nethermind AuditAgent](https://docs.auditagent.nethermind.io/intro/)、[Cantina Apex](https://cantina.xyz/welcome)、[Trail of Bits 的内部 AI 原生流水线](https://blog.trailofbits.com/2026/03/31/how-we-made-trail-of-bits-ai-native-so-far/)、[Cyfrin Aderyn](https://github.com/Cyfrin/aderyn))生成的发现需要你信任运行它们的公司的诚实度——没有一个提供可验证的执行。现有的**持续监控**([Forta Firewall](https://www.forta.org/blog/the-ai-science-behind-forta-firewall)、[Hexagate](https://www.chainalysis.com/product/hexagate/)、[Hypernative](https://www.hypernative.io/products/hypernative-platform)、[Cyvers](https://cyvers.ai/)、[SphereX](https://github.com/spherex-xyz/spherex-protect-contracts))通过统计 ML、异常分类器或硬编码规则进行检测;没有一个能针对每个事件推演新型的攻击模式。[OpenZeppelin Defender 将于 2026 年 7 月 1 日停用](https://docs.openzeppelin.com/defender)。**链上 AI 替代方案**([Mira Network 的](https://mira.network/)多模型共识投票,[Bittensor 的](https://taostats.io/subnets)审计子网——Bitsec SN60 + ReinforcedAI SN92——进行验证者与矿工的真实基准评分)虽然存在,但并未针对智能合约审计采用发现者与证伪者的对抗性验证,且都没有提供按 CWE 划分的专家声誉。 **Hunt v1 提供了可验证的基础层**:基于真实 0G Sealed Inference + 按 CWE 链上声誉构建的运营商中继认证层,两者均已在 Aristotle 主网上成功实践。**Hunt v2(黑客松后,第 2-10 周)** 用验证 TEE 认证的签名者集合取代了运营商(使得链上摘要由链强制执行而不是中继),并增加了由质押支持的对抗性证伪机制 + 用于部署后监控的常驻守护网络——这两者在 2026 年 5 月的该领域中均尚未有落地产品。逐支柱计划及一手资料引用见 [`doc/FUTURE.md`](doc/FUTURE.md)。 **超越加密领域——Hunt 作为通用的可验证 AI 基础组件。** 相同的机制(密封推理、多专家竞争、按领域的链上声誉)适用于普通人需要在他们的私有数据上使用可验证 AI 的任何场景。v2 已经定位了两个非加密领域的垂直应用: - **保护公民免受私人支付方 AI 拒绝——[`audits/insurance/`](audits/insurance/README.md)。** 2023 年,7300 万 ACA(平价医疗法案)参保人的网络内索赔被拒绝;不到 1% 的人提出上诉;而上诉的成功率高达 40-75%。三款现成的 AI 上诉产品(Counterforce Health、Claimable、Fight Health Insurance)已在该类别中实现了 70-80% 的翻案率——但*没有一款*提供 TEE 认证,*所有产品*都将患者记录路由至 OpenAI/Anthropic。监管框架已经存在(科罗拉多州 SB24-205/SB26-189,欧盟 AI 法案附件 III)。架构可 1:1 平移;完整的计划 + 基于公开的 *Estate of Lokken v. UnitedHealth* 案件文书建模的合成拒赔信详见 README。 - **保护老年人、退休人员和残疾人免受公共支付方裁决的损害——[`audits/benefits/`](audits/benefits/README.md)。** 截至 2026 年 1 月,约有 33 万件 SSDI 案件等待 ALJ 听证(这是美国行政系统中最大的裁决积压);平均等待时间为 274 天;初次拒绝率为 60-70%;在有代表的情况下上诉成功率超过 50%。根据 42 U.S.C. § 406,律师的风险代理费上限为 25%——对律师来说经济上是理性的,但在结构上将低收入索赔人排除在外。Hunt 的七类缺陷登记表(医疗名录误用、RFC 错误、职业专家误分类、持续时间规则误用、SGA 计算错误、综合损伤遗漏、主治医师意见权重失效)直接映射到 SSA 自己的顺序评估法规。相同的架构;次要界面适用于 Medicare 重新审议 + VA 索赔。基于 SSA-1561 模板建模的合成 SSDI 拒赔案,包含七个标注的缺陷模式详见 README。 - **为公民提供可验证的多专家医学解读——[`audits/medical/`](audits/medical/README.md)。** 已发表的各专科诊断分歧率(普通外科病理学中约 14% 存在重大分歧,肿瘤放射学 CT 中为 20-32%,神经肿瘤学中高达 52%)是校准该领域“专家竞赛”架构的经验性真实信号——这比智能合约审计所能提供的信号更强。严格限定为“记录阅读器”范围(提供向医生提问的问题,绝不进行诊断),以符合 21 世纪治愈法案的 CDS 豁免要求 + FDA 2026 年 1 月执法自由裁量权指南。完整计划 + 一份展示了乳腺活检中最难的观察者间诊断判断(ADH 与低级别 DCIS)的合成病理报告详见 README。 这三个垂直应用是同一基础组件的不同侧面:**保险** 保护公民免受*私人支付方*不透明 AI 的侵害;**福利** 保护他们免受*公共支付方*不透明裁决的损害;**医疗** 为他们提供比原本能负担得起的*更好*的可验证 AI。相同的 Hunt 机制,相同的 TEE 认证,相同的按领域声誉——三个对手方,一个基础层。 可视化架构图 + 活跃的四大垂直应用分支展示在已部署的前端 [`hunt.gudman.xyz/verticals`](https://hunt.gudman.xyz/verticals.html)。用于离线浏览的 ASCII 版本: ``` ┌───────────────────────────────────────┐ │ 0G primitives │ │ Sealed Inference (TEE attestation) │ │ Storage (sealed encrypted input) │ │ Chain (escrow + ecrecover + rep) │ └─────┬──────────┬──────────┬───────┬───┘ │ │ │ │ ┌──────────────┘ ┌─────┘ ┌─────┘ ┌───┘ ▼ ▼ ▼ ▼ ┌────────────────┐ ┌─────────────────┐ ┌────────────┐ ┌────────────┐ │ V1 — LIVE │ │ V2 — Insurance │ │ V2 — Bene- │ │ V2 — Medi- │ │ Smart contracts│ │ Defense vs. │ │ fits │ │ cal Records│ │ on Aristotle │ │ private-payor │ │ Defense vs.│ │ Reader │ │ │ │ opaque AI │ │ public- │ │ (coopera- │ │ bounty #3 │ │ (UnitedHealth │ │ payor adju-│ │ tive 2nd │ │ strict-verify │ │ nH Predict, │ │ dication │ │ opinion) │ │ EXIT 0 │ │ Cigna PXDX) │ │ (SSDI/SSI/ │ │ │ │ │ │ │ │ VA) │ │ pathology │ │ 7 bounties │ │ 73M denials/yr │ │ 330K cases │ │ 14% major │ │ 4 settled │ │ <1% appealed │ │ pending an │ │ disagree- │ │ 3 expired │ │ 40-75% reverse │ │ ALJ hearing│ │ ment in │ │ │ │ on appeal │ │ (Jan 2026) │ │ surgical │ │ bounty #6 │ │ │ │ │ │ pathology │ │ ChartChain │ │ Colorado │ │ 20 C.F.R. │ │ │ │ cross-poll. │ │ SB24-205 frame │ │ § 404.1520 │ │ FDA Jan │ │ │ │ │ │ frame │ │ 2026 CDS │ │ counterparty: │ │ counterparty: │ │ counter- │ │ frame │ │ vulnerable │ │ private-payor │ │ party: │ │ │ │ smart contracts│ │ AI denial │ │ public- │ │ counter- │ │ │ │ algorithm │ │ payor adju-│ │ party: │ │ │ │ │ │ dication │ │ cooperative│ │ │ │ │ │ │ │ 2nd opinion│ └────────────────┘ └─────────────────┘ └────────────┘ └────────────┘ v1 load-bearing v2 positioning v2 positioning v2 positioning (live on-chain) + runnable demo + runnable demo + runnable demo ``` 每个 v2 垂直应用都提供了一个可运行的专家简报脚本 (`scripts/{insurance,benefits,medical}_specialist_brief.js`),该脚本针对新的领域输入运行 v1 的 `findingDigest` 基础组件,并在离线状态下生成真实的认证摘要。请访问 [`/verticals`](https://hunt.gudman.xyz/verticals.html) 页面查看实时的 SVG 版本、卡片网格及链接的 README。 ## 诚实说明——请先阅读 在阅读本 README 的其余部分之前,你需要了解三件事。 - **备受瞩目的实况竞赛(赏金 #3)在真实的 0G Sealed Inference 上运行,并带有 TEE 认证。** 获胜发现的链上 `modelDigest` 为 `keccak256(utf8("zai-org/GLM-5-FP8|hunt-audit-v1"))`。在本地计算它并将其传递给 `scripts/verify_bounty.js 3 --model-digest 0x` 以进行严格的重新推导检查(签名者 + 摘要 + 竞赛窗口时间戳)。退出码 0 表示链证明真实的 Sealed Inference 在竞赛窗口内生成了该发现。`lib/audit-fallback.js` 是已记录的降级路径,在推理失败时激活,并加盖一个*不同的* `modelDigest = keccak256(utf8("hunt-local-audit|hunt-audit-v1"))` 印记,因此这两条路径在链上始终是可区分的。赏金 #0 作为降级路径的诚实记录被保留;赏金 #2 是应用修复后的 Sealed Inference 竞赛,此时尚未引入按 hunter 专业方向收窄的机制;赏金 #3 是目前的重点。 - **v1 中的链上认证是由运营商中继的,而不是由链强制执行的。** 合约绑定了 `(bountyId, codeRoot, hunterId, cweClass, severity, findingRoot, modelDigest, teeTimestamp, selfEvalBps×4)` 并针对 `teeSigner` 使用 `ecrecover` 验证签名。这在链上证明了:一个运营商持有的密钥签署了带有位于 `[postedAt, raceDeadline]` 范围内 `teeTimestamp` 的摘要。它在链上**没有**证明的是:模型摘要是来自经过验证的 0G `ZG-Res-Key` 认证,或者时间戳是 TEE 自身的(v1 守护进程使用 `block.timestamp`——参见 `scripts/hunter.js:355`)。真实情况是,hunter 守护进程**确实**调用了真实的 Sealed Inference,**确实**接收到了 `ZG-Res-Key`,并且**确实**在链下运行了 `broker.inference.processResponse`——但只捕获了*这些检查的事实*,而不是它们与链上签名的加密绑定。v2 用验证 TEE 认证的中继集取代了运营商,因此链直接强制执行该绑定(`doc/FUTURE.md`)。合约语义、摘要结构以及链上 `ecrecover` 门限在 Sealed Inference 路径和记录的降级路径之间是相同的——只有 `modelDigest` 不同(这正是 `scripts/verify_bounty.js --model-digest` 允许你重新推导的依据)。 - **v1 中的 `teeSigner` 和 `verifier` 是中心化的。** 目前是两个运营商持有的密钥。v2 版本的协议将用验证 TEE 认证的中继集和去中心化的验证者网络替换这两者。参见 `doc/FUTURE.md`。 完整的注意事项列表位于本文件底部的 [`#honesty-notes`](#honesty-notes-full)。 ## 在线部署 所有交易均在 0G Aristotle(链 ID 16661)上真实发生。点击任何交易哈希即可在 chainscan 上查看。 - **合约**: `0xD4Fe5127d519B775a9a581A54ED0719BBFf0d68C` - **teeSigner**(签署指纹 + 发现认证): `0xc9c0754fDB2C22Fd19B5B649e1e60eE9d1Ccca3f` - **verifier**(在铸造时签署 GitHub 凭证): `0x3a40CA052c10FB6f0B1934e9db680034aFF1759E` ### 部署 + hunter 铸造 | 事件 | 交易哈希 | 区块 | |---|---|---| | 部署 Hunt | [`0xc08f6483a1603564ff38c6808856cc9d7e8cbe120ff95e8ccbc55722f873f6c7`](https://chainscan.0g.ai/tx/0xc08f6483a1603564ff38c6808856cc9d7e8cbe120ff95e8ccbc55722f873f6c7) | 32975183 | | 铸造 hunter #0 — `reentrancy-specialist` | [`0xdac73073211a99c16cad85961461180ead95504bfae331e8e77efb7f053f9d5d`](https://chainscan.0g.ai/tx/0xdac73073211a99c16cad85961461180ead95504bfae331e8e77efb7f053f9d5d) | (chainscan) | | 铸造 hunter #1 — `oracle-specialist` | [`0xd9ab16049e3a048ea30b49bb9dfb61584828c621c88bc467c2ad1eb85d6b8354`](https://chainscan.0g.ai/tx/0xd9ab16049e3a048ea30b49bb9dfb61584828c621c88bc467c2ad1eb85d6b8354) | (chainscan) | | 铸造 hunter #2 — `access-control-specialist` | [`0x66af88fe9718592223580034b3569cc79cc0ae8c8cd596595330a631e08d509f`](https://chainscan.0g.ai/tx/0x66af88fe9718592223580034b3569cc79cc0ae8c8cd596595330a631e08d509f) | (chainscan) | ### 赏金 #3 — 当前的主要竞赛 ★(真实 Sealed Inference + 按 hunter 专业方向收窄) 三个 hunter 针对 Aristotle 主网上分阶段的 `Vault.sol` 预言机陈旧性漏洞发起攻击。每个 hunter 的简报都被收窄为 `bounty.inScopeCwes ∩ hunter specialty`,因此专家只在其类别内进行搜寻。oracle-specialist 在第一次尝试时就 Sealed Inference,浮出了一个 `oracle-manipulation` 发现(严重性为 `high`,模型自评总体分为 88.75%),并提交了真实的 `ZG-Res-Key` TEE 认证;另外两个在并发的 broker 竞争中遇到了推理代理的瞬时 `fetch failed`,并正确地回退到本地启发式算法——该算法在他们自己的专业类别中返回了 0 个发现(正确:在 Vault.sol 上没有重入或访问控制漏洞触发匹配的启发式规则)。发布者选择了 oracle-specialist 作为赢家;按 CWE 的声誉仅累积给了该 hunter。 | 事件 | 交易哈希 | 区块 | |---|---|---| | 发布赏金 #3 — Vault.sol, 0.05 OG, 10分钟竞赛, 范围 {reentrancy, oracle, access-control} | [`0x253064e8680d098c127b9cf7b2d4379136dd25bb6258117b0e4951e848922659`](https://chainscan.0g.ai/tx/0x253064e8680d098c127b9cf7b2d4379136dd25bb6258117b0e4951e848922659) | (chainscan) | | Oracle-specialist 提交获胜发现 — **真实 Sealed Inference** (`oracle-manipulation`, `high`) | [`0x78f6075f7ccc99122144335c659005c162e750229d808258e06823a957b37523`](https://chainscan.0g.ai/tx/0x78f6075f7ccc99122144335c659005c162e750229d808258e06823a957b37523) | 33040490 | | 结算赏金 #3 — 0.05 OG 给 oracle-specialist,按 CWE 声誉已更新 | [`0x9edab38c54b927fd507aeaada991694500858af4a31977d2c7154ac658f8d241`](https://chainscan.0g.ai/tx/0x9edab38c54b927fd507aeaada991694500858af4a31977d2c7154ac658f8d241) | 33041034 | 独立验证(只读,无需项目设置): ``` git clone https://github.com/Ridwannurudeen/hunt && cd hunt && npm install # 计算标题 modelDigest(model name + version 的 keccak256): node -e "import('ethers').then(({ethers})=>console.log(ethers.keccak256(ethers.toUtf8Bytes('zai-org/GLM-5-FP8|hunt-audit-v1'))))" # 然后将该 digest 传递给 strict verifier: node scripts/verify_bounty.js 3 --model-digest 0x ``` 严格模式会打印出 `digest match: ✓`(当提供 `modelDigest` 时,链上 `attestationDigest` 可从链上字段重新推导),`signer == teeSigner: ✓`,`teeTimestamp window: ✓`,并退出码为 0。该输出是密码学证明,证明了运营商持有的 `teeSigner` 签署了带有竞赛窗口内时间戳的 Sealed-Inference-路径摘要(可通过 `modelDigest` 与降级路径区分)。它本身**不是** 0G TEE 发出响应的证明——该绑定将在 v2 中变为链强制执行(参见 `doc/FUTURE.md`)。 ### 赏金 #2 — 修复后的 Sealed Inference 竞赛(尚未加入专业收窄) 在 `max_tokens` 修复落地后,但按 hunter 专业方向收窄机制上线前发布。获胜模式与 #3 相同(oracle-specialist),但这次严重性为 `critical`,同样通过真实的 Sealed Inference 运行。作为中间状态的诚实记录被保留。 | 事件 | 交易哈希 | 区块 | |---|---|---| | 发布赏金 #2 | [`0x8da9cf06cfcf963ec9ad000d37a1652f0fb352c43909e6f254255db7091e4314`](https://chainscan.0g.ai/tx/0x8da9cf06cfcf963ec9ad000d37a1652f0fb352c43909e6f254255db7091e4314) | (chainscan) | | Oracle-specialist 提交获胜发现 (真实 Sealed Inference, `critical`) | [`0x36bd979cc452c77626493113666b6109a73506380e1f8de610c5b73874eef554`](https://chainscan.0g.ai/tx/0x36bd979cc452c77626493113666b6109a73506380e1f8de610c5b73874eef554) | 33039165 | | 结算赏金 #2 | [`0xa6e03679fc9ced9fbe6a1a185550033821343934cdb12adb9da46a149ce2ed59`](https://chainscan.0g.ai/tx/0xa6e03679fc9ced9fbe6a1a185550033821343934cdb12adb9da46a149ce2ed59) | 33039527 | ### 赏金 #7 — 重入竞赛 ★★(第二个正面的专业收窄数据点,真实 Sealed Inference) 于 2026-05-13 针对发布的 `demo/staged-bounty/Reentrancy.sol` 发布——这是一个存取款池中教科书式的检查-效果-交互(checks-effects-interactions)违规。范围锁定为 `{swc-107-reentrancy, access-control, oracle-manipulation}`。**Reentrancy-specialist (hunter #0) 通过真实的 Sealed Inference 在第一次尝试时赢得了赏金**,严重性为 `critical`。另外两名专家运行了他们的推理调用,并正确地返回了 0 个范围内的发现——oracle-specialist 以 9875bps 通过了质量关卡,理由是“基于这些事实不存在 oracle-manipulation 模式”;access-control-specialist 未返回任何范围内的发现。**这是链上第二个正面的专业收窄数据点**——赏金 #3 由 oracle-specialist 赢得了 oracle 漏洞;赏金 #7 由 reentrancy-specialist 赢得了重入漏洞。不同的专家,不同的 CWE,相同的协议。 | 事件 | 交易哈希 | 区块 | |---|---|---| | 发布赏金 #7 — Reentrancy.sol, 0.05 OG, 10分钟竞赛 | [`0xbc525ef4964b8abb39f2943be95528d9f5d1a3e8a2a11f14fd82c017af9eecac`](https://chainscan.0g.ai/tx/0xbc525ef4964b8abb39f2943be95528d9f5d1a3e8a2a11f14fd82c017af9eecac) | (chainscan) | | Reentrancy-specialist 提交获胜发现 (真实 Sealed Inference, `swc-107-reentrancy`, `critical`) | [`0x3a51f97ca7150775902ed4bca4b08536cb7e9f0a59c936cfb246a985036ddd92`](https://chainscan.0g.ai/tx/0x3a51f97ca7150775902ed4bca4b08536cb7e9f0a59c936cfb246a985036ddd92) | 33131912 | | 结算赏金 #7 — 0.05 OG 给 reentrancy-specialist (hunter #0),按 CWE 声誉已累积 | [`0x6d26cd5fd4927ed9a8631e8f421630247e92abae8008c6b0e58b3aa90f7a2a7f`](https://chainscan.0g.ai/tx/0x6d26cd5fd4927ed9a8631e8f421630247e92abae8008c6b0e58b3aa90f7a2a7f) | 33132360 | codeRoot: `0xda3bd7d3dc4211eb4406025ceb2b4976b3b1166796c4bfdc6b4693e5c0cc1a15` · 结算评级: severityCalibration=5, precision=5, coverage=4, exploitability=5 · hunter #0 `totalWins=1, totalSubmissions=1, totalEarnedWei=0.05 OG` 根据链上 `ClassRep` 账本。 ### 赏金 #1 — 第二次降级路径竞赛(保留记录) 于 UTC 时间 5 月 12 日 01:45 发布,在 `max_tokens` 预算 bug 被修复之前。与赏金 #0 具有相同的降级路径语义:oracle-specialist 通过 `lib/audit-fallback.js` 获胜,并加盖了不同的链上 `modelDigest = keccak256(utf8("hunt-local-audit|hunt-audit-v1"))` 印记。作为 Sealed Inference 返回空内容时优雅降级的第二个记录数据点被保留。 | 事件 | 交易哈希 | 区块 | |---|---|---| | 发布赏金 #1 | [`0x60cf3d75d88b1c7080b4ac9ea610d3c470ef684f5557a0809f3bf67fd57f0dc9`](https://chainscan.0g.ai/tx/0x60cf3d75d88b1c7080b4ac9ea610d3c470ef684f5557a0809f3bf67fd57f0dc9) | 32987989 | | Oracle-specialist 提交获胜发现 (降级路径, `high`) | [`0xf6d54d4a35123ccb550dabdfcb71ee2f47bfbc6efa867a0a846fefa776c5c2a6`](https://chainscan.0g.ai/tx/0xf6d54d4a35123ccb550dabdfcb71ee2f47bfbc6efa867a0a846fefa776c5c2a6) | 32988214 | | 结算赏金 #1 — 0.05 OG 给 oracle-specialist | [`0x5e06c6dc1e94b190ba9ef2fa31baa8da95e05b2a03f3d4436c951bf4d9d93768`](https://chainscan.0g.ai/tx/0x5e06c6dc1e94b190ba9ef2fa31baa8da95e05b2a03f3d4436c951bf4d9d93768) | 32988680 | ### 赏金 #0 — 原始竞赛(降级路径,如实记录) 5 月 11 日的原始竞赛。当时我们认为是 0G Sealed Inference 对于结构化的 Solidity 审计提示降级了。实际的根本原因是 `lib/review.js` 中的 `max_tokens=1500` 预算限制:`zai-org/GLM-5-FP8` 是一个推理模型,在生成任何内容之前就将整个 1500 token 的预算消耗在了内部的 `reasoning_tokens` 上,以 `finish_reason: length` 和 0 个内容 token 返回。将默认值提高到 5000 修复了 `lib/review.js` 和 `lib/fingerprint.js`。赏金 #0 作为记录在案的降级路径记录被保留在链上——每个发现仍然可以通过密码学验证,只是基于不同的本地降级 `modelDigest = keccak256(utf8("hunt-local-audit|hunt-audit-v1"))`,而不是 Sealed Inference 的那个。 | 事件 | 交易哈希 | 区块 | |---|---|---| | 发布赏金 #0 | [`0xafa7c31ea102f4543ac851711fc822e41871d139220bd7bff7d9abcd831fb2df`](https://chainscan.0g.ai/tx/0xafa7c31ea102f4543ac851711fc822e41871d139220bd7bff7d9abcd831fb2df) | (chainscan) | | Oracle-specialist 提交获胜发现 (降级路径, `high`) | [`0x371f2a328c5af8c0d75f867bda9f12048ba941e99efa6a210087c0b84a2cab8b`](https://chainscan.0g.ai/tx/0x371f2a328c5af8c0d75f867bda9f12048ba941e99efa6a210087c0b84a2cab8b) | 32977952 | | 结算赏金 #0 | [`0xe67459a13b8b0df690847560e97249eac9a23d3ef7d2cce594338b8222cdcec4`](https://chainscan.0g.ai/tx/0xe67459a13b8b0df690847560e97249eac9a23d3ef7d2cce594338b8222cdcec4) | 32978103 | ### 主要的在线审计目标 — ChartChain Hunt 主要的前瞻性审计目标是 **[ChartChain](https://github.com/Ridwannurudeen/chartchain)**,这是一个独立的、已部署在同一条链上 [`0x5DDD81e39b2f3022AB9188D4eacaCdDC16566D00`](https://chainscan.0g.ai/address/0x5DDD81e39b2f3022AB9188D4eacaCdDC16566D00) 地址的活跃 0G 项目。`scripts/post_bounty.js` 默认指向 `audits/chartchain/MedicalRecordsVault.sol`,因此任何新的竞赛都是针对真实协议的 MIT 许可证源代码发布的,而不是分阶段文件。完整计划 + 范围 + 诚实预测详见 [`audits/chartchain/README.md`](audits/chartchain/README.md)。 **赏金 #6 — Aristotle 上的首次 ChartChain 审计** | 事件 | 交易哈希 | 区块 | |---|---|---| | 发布赏金 #6 — ChartChain 源码, 0.05 OG, 10分钟竞赛, 5-CWE 范围 | [`0x7600cf2dd3ad137904832349416acaf4747410d0eebfc031633e1f5c4e03c461`](https://chainscan.0g.ai/tx/0x7600cf2dd3ad137904832349416acaf4747410d0eebfc031633e1f5c4e03c461) | (chainscan) | | 过期赏金 #6 — 没有范围内的发现,0.05 OG 已退还 | [`0xabbb0dd840e81f89d8cb9a25aac1ae2817b9fb95009bddb3cf2ba6445fc6ee22`](https://chainscan.0g.ai/tx/0xabbb0dd840e81f89d8cb9a25aac1ae2817b9fb95009bddb3cf2ba6445fc6ee22) | 33121294 | 三名 hunter 并行竞赛。两人端到端运行了真实的 Sealed Inference(重入在第 1 次尝试,总得分 9000bps;预言机在第 3 次尝试,10000bps)并返回了 0 个发现——正确地拒绝了捏造超出其声明专业范围的发现。第三个在并发 broker 负载下遇到了瞬时 `fetch failed` 3 次,并回退到 `lib/audit-fallback.js`,同样返回了 0 个范围内的发现。竞赛干净地过期;托管资金退还。**关于 ChartChain 的漏洞发现问题仍然悬而未决**——可能不存在范围内的漏洞;也可能是 LLM 未能在 10 分钟内发现它们。**链上已被证明的是按 CWE 收窄的理论**:专家运行后,在自己的领域未发现漏洞,也不会越界猜测。上面的赏金 #-#3 表格仍是具有密码学可验证性的发现记录(赏金 #3 对此合约的严格验证退出码为 0);赏金 #6 是针对真实的活跃 0G 协议的首个跨领域产物。 ## 演示:一个真实的 bug,三个 hunter,一个赢家 分阶段的 `demo/staged-bounty/Vault.sol` 包含一个微妙的预言机陈旧性 bug。合约在 `_currentPrice()` 中读取 `latestRoundData()` 并存储 `updatedAt` 字段——但针对 `block.timestamp` 的新鲜度比较仅在仅限管理员调用的 `setPrice()` 函数内进行。每个用户路径(`liquidate`、`withdraw`、`mint`、`_isHealthy`、`healthFactorBps`)都绕过了快照,并在没有新鲜度关卡的情况下信任实时数据馈送。普通的 linter 和 grep 风格的检测器看到读取了 `updatedAt` 并定义了 `maxOracleStaleness`,就会将合约标记为干净。只有当审计员追踪*哪条路径实际比较了两者*时,这个 bug 才会暴露出来。 三个 hunter 针对该赏金进行竞争: - **#0 reentrancy-specialist** — 寻找 CEI 违规和缺失的 `nonReentrant` 修饰符。返回了零个范围内的发现。正确。 - **#1 oracle-specialist** — 寻找没有 `block.timestamp - updatedAt` 检查的 `latestRoundData` 读取。触发。提交了 `oracle-manipulation`,严重性为 `high`。获胜。 - **#2 access-control-specialist** — 寻找没有 `onlyOwner` 风格关卡的 `setX` 变量修改器。返回了零个范围内的发现。正确。 这就是端到端展示的按 CWE 声誉理论。正确专业化的 hunter 会获胜。在其领域外猜测的 hunter *不会*获胜。结算时的声誉更新是按 `(hunterId, cweClass)` 进行的——oracle-specialist 的 `oracle-manipulation` 声誉上升;另外两个 hunter 的 `oracle-manipulation` 声誉保持平稳,因为他们没有提交。该链具有足够的粒度来奖励专业知识而不是凭空猜测。 ## 架构 ``` protocol ──[seal code]──> 0G Storage │ │ │ ▼ ▼ codeRoot ─┐ postBounty(codeRoot, cwes, race) │ Hunt contract on 0G │ (escrow + race state) ▼ ┌────────────────────────────────────────┐ │ N hunter agents watch BountyPosted │ │ → fetch + decrypt code in own TEE │ │ → run sealed inference (or fallback) │ │ → submitFinding(bountyId, hunterId, │ │ cweClass, sev, attestation) │ └────────────────────────────────────────┘ │ ▼ poster reads findings → settleBounty(idx, rating) │ ▼ payout to winner + per-CWE reputation updated on-chain ``` 端到端生命周期,映射到实际的合约 + 脚本路径: ``` 1. Hunter mint (one-time per persona) └─ verifier signs GitHub Credential (account age + merged PRs + reviews) └─ samples: prior audit findings → AES-encrypted to a per-hunter key → 0G Storage roots └─ embeddings: 256-dim feature-hashed → encrypted → 0G Storage roots └─ fingerprint: Sealed Inference scores samples on 4 axes → teeSigner signs └─ Hunt.mintHunter(...) — credential sig + fingerprint sig verified on-chain 2. Protocol posts bounty └─ Solidity sources serialised, symmetrically encrypted with shared hunter-network key └─ uploaded to 0G Storage → codeRoot └─ Hunt.postBounty(codeRoot, inScopeCwes[], raceDuration, { value: payout }) 3. N hunter daemons race (scripts/hunter.js, orchestrator: scripts/run_race.js) └─ each watches BountyPosted, downloads the code blob, network-key-decrypts in TEE └─ top-K retrieval over its own samples vs the decrypted code └─ lib/review.js: Sealed Inference → review + self-eval in one call └─ on 3× transport/quality failure: lib/audit-fallback.js (documented heuristic path) └─ pickBestFinding(): highest-severity in-scope finding, ties broken by array index └─ encrypts the finding to the poster's pubkey, uploads to 0G Storage └─ lib/credential.signFindingAttestation(): teeSigner-signed digest binding (bountyId, codeRoot, hunterId, cweClass, severity, findingRoot, modelDigest, teeTimestamp, selfEvalBps×4) └─ Hunt.submitFinding(bountyId, hunterId, FindingInput) — contract ecrecovers vs teeSigner 4. Poster settles └─ scripts/settle_bounty.js — chooses winningIdx + 4-axis rating └─ Hunt.settleBounty(bountyId, idx, AuditRating) — payout + ClassRep update └─ ClassRepUpdated event: (hunterId, cweClass, wins, submissions) 5. Verify the proof └─ scripts/verify_bounty.js — re-derives the attestation digest from chain state, ecrecovers the signature, checks teeTimestamp ∈ [postedAt, raceDeadline] ``` 五个 0G 基础组件,均为核心承载: - **0G Chain (Aristotle, 16661)** — 单一文件 `contracts/Hunt.sol`。Hunter 注册表、赏金托管、竞赛截止时间、结算窗口、发现提交、认证 `ecrecover`、按 CWE 的 `ClassRep` 账本。 - **0G Storage** — 用于赏金代码块的对称 AES 加密(v1 中为共享 hunter 网络密钥)加上用于样本 + 嵌入的按 hunter AES 加密;ECIES (secp256k1 + HKDF + AES-GCM) 用于将发现加密至发布者的公钥。基础组件在 `lib/storage.js` + `lib/ecdh.js` 中。 - **0G Compute / Sealed Inference** — 两个角色。(1) `lib/fingerprint.js` 在铸造时按 4 个质量维度为 hunter 的先前发现样本评分。(2) `lib/review.js` 在每次赏金的单一组合调用中运行审查 + 自我评估。两者都产生通过 `broker.inference.processResponse` 消费的 0G `ZG-Res-Key` 认证。主要的赏金 #3 端到端运行在 Sealed Inference 上(获胜发现的 `modelDigest = keccak256(utf8("zai-org/GLM-5-FP8|hunt-audit-v1"))`)。 - **TEE 认证监管链** — 链上的 `teeSigner` 地址。链下中继签署合约恢复的摘要;v2 将中继替换为验证 TEE 认证的多重签名者集合。 - **凭证验证器** — 由 GitHub OAuth 支持的 `verifier/server.js` 强制执行真实的账户年龄 / 合并的 PR / 审查数量门槛,然后钱包才能铸造 hunter。凭证绑定到铸造钱包 + 防重放保护。 ## 为什么特别选择 0G - **Sealed Inference 是反作弊基础层。** 0G 的 `ZG-Res-Key` 认证通过 `broker.inference.processResponse` 在链下进行验证,这是将诚实发现与密封飞地运行联系起来的基础组件。v1 链下承载该信号(hunter 守护进程在提交前验证它)并通过运营商持有的 `teeSigner` 将其中继到链上——因此链目前见证的是运营商的中继,而不是直接见证认证。v2(`doc/FUTURE.md`)将中继移入验证 TEE 认证的签名者集合中,以便链强制执行绑定。如果没有这个基础层中的某些东西,“AI 审计员声誉”只是一种感觉;目前没有任何其他 L1 提供类似的基础组件。 - **0G Storage 密封代码而不泄露。** 赏金代码块在上传前已加密;只有存储根登陆链上。协议的源代码永远不会到达公共链。 - **0G Chain 在一处结算托管 + 声誉。** 赏金支付、按 CWE 的 `ClassRep` 数学计算、发现签名 `ecrecover`、竞赛截止时间 + 结算窗口强制执行——一个合约,一个区块时间确定性的结算。声誉不能被链下运营商悄悄地重写,因为它不在链下持有。 ## 快速开始 ``` git clone https://github.com/Ridwannurudeen/hunt && cd hunt npm install # 复现 live deployment hashes — 全部绿色,全部在链上 16661 上真实存在。 npm test # 在本地 Serve 链上读取 frontend(镜像 hunt.gudman.xyz)。 npm run dev # → http://localhost:3000 # 亲自 Verify 实时的 race,无需设置(read-only RPC)。 node scripts/verify_bounty.js 0 ``` `scripts/verify_bounty.js 0` 从 `0xD4Fe5127d519B775a9a581A54ED0719BBFf0d68C` 获取赏金 #0,拉取获胜的发现,从链上字段重新推导认证摘要,针对签名运行 `ecrecover`,并打印验证报告。退出代码 0 表示获胜发现的认证与链上 `teeSigner` 匹配。 要自己运行完整的生命周期(铸造 hunter、发布赏金、竞争、结算): ``` cp .env.example .env # PRIVATE_KEY=0x... (Aristotle mainnet, ≥1 OG) # Deploy 一个全新的 Hunt instance 并 seed 三个 hunter personas node scripts/deploy_hunt.js node scripts/populate_hunters.js # 针对已暂存的 Vault.sol 发布 bounty node scripts/post_bounty.js # 并行 Race 所有三个 hunters 以争夺该 bounty BOUNTY_ID=0 node scripts/run_race.js # Settle(4-axis rating + 向获胜的 hunter 进行 payout) node scripts/settle_bounty.js ``` ## 项目布局 ``` contracts/ Hunt.sol — single-file Hunt contract (~470 LOC) Kin.sol — predecessor, preserved for the historical record lib/ audit-fallback.js — local heuristic audit path (oracle / reentrancy / access-control) credential.js — Credential, Fingerprint, FindingAttestation digests + signers cwe.js — canonical CWE/SWC class registry (kebab-case + bytes32) ecdh.js — secp256k1 ECIES (encrypt-to-wallet-pubkey) embedding.js — 256-dim feature-hashed L2-normalised embeddings fingerprint.js — Sealed Inference sample fingerprinter inference.js — 0G Sealed Inference adapters (lazy-loaded SDK) pubkey.js — recover wallet pubkey from on-chain tx retrieval.js — top-K cosine retrieval review.js — combined review + self-eval generator storage.js — 0G Storage helpers (raw + AES-GCM wrappers) scripts/ deploy_hunt.js — deploy Hunt to Aristotle mainnet populate_hunters.js — mint 3 demo hunter personas post_bounty.js — seal Vault.sol + post bounty #0 hunter.js — long-lived hunter daemon (one process per operator) run_race.js — one-shot orchestrator (all 3 hunters in parallel for demo) settle_bounty.js — pick winner + rating, settle verify_bounty.js — standalone verifier (no project setup needed) insurance_specialist_brief.js — v2 vertical demo: builds the insurance-defense brief + computes the v1 attestation digest against audits/insurance/sample_denial.txt benefits_specialist_brief.js — v2 vertical demo: builds the SSDI/SSI/senior-benefits defense brief + computes the v1 attestation digest against audits/benefits/sample_denial.txt medical_specialist_brief.js — v2 vertical demo: builds the Records-Reader brief (scope-locked to "questions for physician") + computes the v1 attestation digest against audits/medical/sample_pathology_report.txt public/ index.html — landing hunters.html — registry of minted hunters bounties.html — live + settled bounty list proof.html — judge proof panel (per-bounty receipt) demo/ staged-bounty/Vault.sol — staged oracle-staleness bug staged-bounty/README.md — bug walk-through + attack path + reference findings hunter-personas.json — the 3 specialist personas test/ — Hardhat test suite (Hunt + predecessor Kin tests) verifier/ — GitHub OAuth verifier service doc/ SUBMISSION.md — HackQuest submission text X_POST.md — X post drafts DEMO_VIDEO_SCRIPT.md — recording script FUTURE.md — v2 roadmap (decentralised relay + per-hunter ECDH envelope) V2_SPEC.md — predecessor Kin v2 spec (historical) ``` ## 测试 ``` npm test ``` **195 个测试通过,0 个失败。** 细分: - 68 — `test/Hunt.test.js` (合约 — 铸造、发布、提交、结算、过期、范围、竞赛窗口、认证、声誉;包括 v1.1 ClassRep 数学回归套件) - 78 — `test/Kin.test.js` (Kin v2 前身合约 — 作为基础回归基线保留) - 21 — `test/verifier.test.js` (GitHub OAuth 验器服务) - 13 — `test/ecdh.test.js` (ECIES 往返测试) - 10 — `test/embedding.test.js` - 5 — `test/pubkey.test.js` 针对已废弃的 Kin v2 代理(`agent.test.js`、`inference-libs.test.js`)的两个测试文件针对的是较旧的 `lib/review.js` schema(`review.summary`/`suggestions`),不再匹配 Hunt 的 `findings`/`selfEval` 结构。它们被停放在 `test-legacy/` 下,并从默认的 `npm test` 中排除,以保持主要计数的整洁;仅将它们视为历史回归基线。 ## 诚实说明(完整版) - **隐私模型。** 赏金代码针对存储运营商、公共链以及任何不持有共享 hunter 网络密钥的参与方进行了密封。诚实的暴露情况是:每个注册的 hunter 运营商在将其传递给 Sealed Inference 之前会在本地解密代码;0G TEE 提供商在推理时看到明文。受第三方保护的是除此之外的所有内容。 - **TEE 认证提供了什么,以及 v1 的不足之处。** 在链下,0G 的 `ZG-Res-Key` + `broker.inference.processResponse` 提供*输出完整性*——即证明给定响应来自运行已认证模型的密封飞地的可验证证明。Hunt 守护进程在每次推理调用时执行该检查。**v1 没有做的是**将链下的 `ZG-Res-Key` 验证绑定到链上签名:运营商持有的 `teeSigner` 是 `Hunt.sol` 执行 `ecrecover` 的对象,而 `teeTimestamp` 派生自 `block.timestamp`(`scripts/hunter.js:355`),而不是从 TEE 认证头中提取。因此,v1 是**建立在真实 Sealed Inference 之上的运营商中继认证层**;v2 通过使中继成为一个验证 TEE 认证的签名者集(其签名仅当底层 `ZG-Res-Key` 验证通过产生响应的模型时才有效)来弥补了这一差距。计划:`doc/FUTURE.md`。 - **最初的赏金 #0 竞赛运行在降级路径上是因为 `max_tokens` 预算 bug,而不是 0G 宕机。** `zai-org/GLM-5-FP8` 是一个推理模型,在生成任何内容之前就将整个 1500 token 的预算消耗在了内部的 `reasoning_tokens` 上;守护进程将由此产生的空内容解释为端点失败,并回退到 `lib/audit-fallback.js`(一个只运行匹配每个 hunter 专业的启发式算法的已记录的本地启发式路径)。在 `lib/review.js` 和 `lib/fingerprint.js` 中将默认值提高到 5000 修复了这两条路径。赏金 #2 和 #3 是修复后在真实 Sealed Inference 上的重新竞赛。降级路径也会在真正的瞬时故障时正确激活(在赏金 #3 中,在并发 broker 负载下的三个 hunter 中有两个观察到了这一点),并加盖一个不同的链上 `modelDigest = keccak256(utf8("hunt-local-audit|hunt-audit-v1"))` 印记,因此这两条路径始终是可区分的。 - **中心化的 `teeSigner` + `verifier`。** 目前是单一运营商持有的密钥。v2 引入了 验证 TEE 认证的中继集,它仅在 0G 的 `ZG-Res-Key` 认证针对生成响应的模型验证通过时才签名,以及 通过 EAS 的多发行方 GitHub 凭证 schema。两者均记录在 `doc/FUTURE.md` 中。 - **共享的 hunter 网络密钥。** 赏金代码块使用在 v1 中所有注册 hunter 之间共享的一个对称密钥进行密封。简单,能让竞赛启动。v2 将此替换为 `Bounty` 结构体上按 hunter 的 ECDH 信封,因此一个 hunter 的泄露仅限于该 hunter,而不会将代码暴露给整个网络。记录在 `doc/FUTURE.md` 中。 - **竞赛编排。** v1 的 `scripts/hunter.js` 是文件锁下的单进程单 hunter。演示使用 `scripts/run_race.js` 针对单个赏金并行触发所有三个角色——这是为录制而刻意选择的编排方式,而不是生产模式。v2 = N 台主机上的 N 个守护进程。 - **演示赏金是分阶段的。** `demo/staged-bounty/Vault.sol` 是一个虚构的 CDP。预言机陈旧性模式来源于公开的 Code4rena(Prisma Finance,2024 年 3 月)和 Sherlock(Angle Protocol,2024)报告。出处 + 参考发现保留在 `demo/staged-bounty/README.md` 中。 ## 前身 — Kin v2 Hunt 是从 **Kin v2** 转型而来,Kin v2 是在同一代码库上的直接前身。Kin v2 围绕高级工程师代码审查市场经济学的理念,构建了相同的基础组件(密封推理 + INFT 风格的身份 + 链上声誉)。对于 0G 的计算叙事来说,审计垂直领域的定位更加敏锐——在密封代码上竞争的对抗性 AI 代理,以 TEE 认证作为反作弊手段,正是 TEE 推理所为之构建的工作负载,而“代码审查市场”则不是。 Kin v2 的合约 `0x47F25b2fAf6E5626946582F86F0e52A4517f3234` 作为历史参考保留在链上。凭证/指纹/认证管道在两个合约之间是相同的(Hunt 是从 Kin v2 分叉出来的——`contracts/Hunt.sol` 在其文档字符串中保留了分叉说明)。Kin 特定的测试套件作为前身的回归基线保留在源码树中。 ## 链接 - **提交材料**: [`doc/SUBMISSION.md`](doc/SUBMISSION.md) - **预期的评委问题**(关于中心化、能力曲线、降级路径、v2 设计的先发制人式问答):[`doc/JUDGE_FAQ.md`](doc/JUDGE_FAQ.md) - **v2 路线图**(针对经过验证的 2026 年 5 月竞争环境的 4 支柱计划):[`doc/FUTURE.md`](doc/FUTURE.md) - **演示视频脚本**:doc/DEMO_VIDEO_SCRIPT.md`](doc/DEMO_VIDEO_SCRIPT.md) - **X 平台推文草稿**: [`doc/X_POST.md`](doc/X_POST.md) - **AI 使用情况**: [`AI_USAGE.md`](AI_USAGE.md) - **运营商入驻指南**(外部安全研究人员运行 hunter 需 ≤30 分钟):[`doc/OPERATOR_ONBOARDING.md`](doc/OPERATOR_ONBOARDING.md) - **拓展模板**(安全研究员 + 0G 核心团队):[`doc/OUTREACH_TEMPLATES.md`](doc/OUTREACH_TEMPLATES.md) - **发布资产**(视频编辑简报 + YouTube 描述 + X 平台预告话题):[`doc/RELEASE_ASSETS.md`](doc/RELEASE_ASSETS.md) - **主要在线审计 — ChartChain**(Hunt 审计 Aristotle 主网上的另一个活跃 0G 项目):[`audits/chartchain/README.md`](audits/chartchain/README.md) - **v2 垂直应用 — 保险索赔拒赔辩护**(可验证的 AI 保护公民免受私人支付方不透明 AI 拒赔的侵害;完整计划 + 可运行的演示脚本 + 合成的 Lokken 模式拒赔信):[`audits/insurance/README.md`](audits/insurance/README.md) - **v2 垂直应用 — 残疾 + 老年福利辩护**(可验证的 AI 保护自行代理的老年、退休和残疾索赔人免受公共支付方不透明裁决的损害 — SSDI/SSI/Medicare 重新审议/VA;完整计划 + 可运行的演示脚本 + 带有 7 个标注缺陷模式的合成 SSDI 拒赔信):[`audits/benefits/README.md`](audits/benefits/README.md) - **v2 垂直应用 — 医疗记录阅读器**(为普通患者提供的可验证多专家医疗解读;严格限定在 FDA 2026 年 1 月 CDS 指南范围内的“向你的医生提出的问题”;完整计划 + 可运行的演示脚本 + ADH/DCIS 边界病理报告合成样本):[`audits/medical/README.md`](audits/medical/README.md) ## 许可证 MIT。
标签:0G链, AI安全, AI智能体, Chat Copilot, CISA项目, CWE分类, Solidity, TEE, Web3基础设施, Web3安全, 人工智能审计, 代码安全, 加密网络, 区块链安全, 去中心化应用, 去中心化身份, 可信执行环境, 声誉系统, 安全审计平台, 密封推理, 数据可视化, 智能合约审计, 漏洞枚举, 自动化漏洞挖掘, 自定义脚本, 链上验证, 零知识证明, 黑客松项目