一套双模型协作流程,让你的 Solidity 合约在送交真正审计之前达到应有的质量水平。用一个模型起草,用另一个审计,汇总发现,反复迭代。
智能合约漏洞的代价格外惨重。Curve 因 Vyper 编译器未强化的只读重入漏洞损失 7300 万美元;Euler 因一种在该漏洞被利用之前甚至没有名字的捐款攻击模式损失 2 亿美元;Mango 因预言机操纵损失 1.14 亿美元——任何资深审计员看五分钟就能发现,但没人做过一次像样的审查。这个模式一再重演:漏洞在审查阶段本可发现,只是没人认真去找。
在 Spearbit、Trail of Bits、OpenZeppelin 或 Code4rena 竞赛中进行专业审计,费用在 2 万至 20 万美元之间,还要排队 2 到 6 周。你不应该带着明显的重入漏洞或缺失访问修饰符的代码去参加审计——竞赛中这会消耗你的保证金,私下委托则意味着你在花钱让资深审计员写你本该自己发现的问题报告。
本教程的工作流是在那次审计之前该做什么:把代码调整到让审计员专注于发现深层系统性风险的状态,而不是在修 onlyOwner 这类低级错误。
单个模型有盲区。训练数据不同的第二个模型有不同的盲区。两者交集——即两个模型都漏掉的 bug——比任何一个单独漏掉的要少得多。这就是整个方法的核心逻辑。
实践中每个模型各自的偏重:
无论 Claude 以哪种方式完成身份验证,LingCode 的 Claude 标签页都会给你相同的智能体循环:
三种方式都驱动同一套基于 Node 的智能体桥接,支持完整工具调用、MCP 以及权限管控。从审计的角度来看,选哪种都无所谓——挑最省事的那条路即可。
如果你使用的是 LingModel Pro 套餐,它会自动出现在对话输入框的提供商切换器中,紧挨你的 Claude 选项。无需额外配置密钥。在 Settings(⌘,)→ Account 中可以确认套餐是否已激活。
LingModel 运行与 Claude Code Native 不同的模型系列,这正是审计阶段所需要的——以全新的先验知识阅读同一份合约。对一份 300 行合约做一次审计,LingModel 的费用远低于 0.1 美元。
两个不那么直观的习惯,能让审计步骤真正发挥作用:
forge init 初始化项目,合约放 src/,测试放 test/。一个 vault 合约的威胁模型注释示例:
// THREAT MODEL
// Holds: depositor USDC, up to ~$50M assumed TVL.
// Trust: governance multisig (5/9) can pause and rotate strategist;
// no other admin path. Strategist is trusted to not collude.
// Adversaries: depositors trying to mint excess shares (4626 inflation);
// MEV bots front-running deposit/withdraw; oracle griefers.
在对话输入框中点击提供商切换器,选择 LingModel。打开一个新对话——不要延续起草合约时的那个对话。与写代码的同一个模型共享上下文会让整个流程失去意义。审计阶段需要像审计员一样,冷眼阅读合约全文。
粘贴合约(以及 Foundry 测试,如果有的话),使用结构化提示词,而不是含糊地说"审计一下这个"。模糊的审计提示只会产生模糊的发现。
Audit this Solidity contract assuming it controls $10M on mainnet.
Check every item below. For each finding, give:
- Severity (Critical / High / Medium / Low / Info)
- File:line
- One-paragraph explanation
- Concrete fix or mitigation
CHECKLIST
1. Reentrancy — including read-only reentrancy and cross-function
2. Access control — modifier coverage, owner-can-rug surface area
3. Integer arithmetic — even on 0.8.x, unchecked blocks and casting
4. Oracle dependency — staleness checks, manipulation, fallback path
5. Front-running — does any path need commit-reveal?
6. Signature replay — chainId, nonce, deadline, domain separator
7. Upgrade safety (if proxy) — initializer guards, storage gaps, __gap
8. ERC-4626 share inflation — first-depositor griefing, virtual shares
9. Gas griefing — unbounded loops over user-controlled input
10. Checks-Effects-Interactions discipline — order of state updates
11. External call return values — silent failure modes
12. Token assumptions — fee-on-transfer, rebasing, blocklist, ERC-777 hooks
13. Block.timestamp / block.number assumptions
14. tx.origin usage
15. Self-destruct / selfdestruct in dependencies
Output: a numbered findings list. Don't editorialize.
保存 LingModel 的发现。然后在 Claude 中开一个新对话,用相同的检查清单提示词和同一份合约再做一次。现在你有了两份独立的发现清单。
持续循环,直到两个模型在最新版本上只产生 Info 级别的发现。那就是你交付给真正审计员的状态——足够干净,让他们把时间花在系统性风险上,而不是在做分类整理。
writing-smart-contracts社区技能 writing-smart-contracts 内置了审计师级别的 Solidity 启发式规则——重入模式、代理存储冲突、预言机/MEV 暴露面、ERC-20/721/1155/4626 代币、部署脚本常见坑——并推行 Foundry 测试优先的工作流。从 Skill Gallery 安装一次后,只要你在对话中提到 Solidity、Forge、Hardhat 或某个 EIP,它就会自动激活。
在完成 Claude / LingModel 调和之后,将它作为第三轮扫描运行。使用相同的检查清单提示词,但这次技能的启发式规则会引导模型关注那些裸模型容易略过的类别。这确实有增量价值——它不是第四个模型,而是为你当前使用的任何模型提供一个更锐利的系统提示。
在上线之前,要对自己诚实地评估这些局限性。
调和循环收敛之后,把合约部署到测试网,让它在那里运行一周。forge script ... --rpc-url $SEPOLIA_RPC --broadcast --verify,在 Tenderly 中检查存储布局,观察事件日志。真实的链上测试能发现静态审查无法发现的 gas griefing、MEV 暴露和集成失效问题。然后再预约审计。
writing-smart-contracts 技能做最终扫描,部署到 Sepolia 跑一周,再花钱做真正的审计。这套流程不能替代其中任何一个环节——它让每个环节都变得更省钱。