name: 紧凑型合约关键问题审查 reviewer: 关键问题 description: 在审查紧凑型合约时使用,用于发现错误、逻辑错误、断言问题、类型不匹配、死代码、不可达路径或控制流问题。
关键问题审查技能
检测紧凑型智能合约中的错误、逻辑错误和正确性问题。
使用时机
此技能在以下查询时激活:
- 错误检测和逻辑错误
- 断言问题
- 类型不匹配
- 死代码和不可达路径
- 控制流问题
- 状态管理错误
触发词:错误、逻辑错误、断言、不可达、死代码、类型不匹配、正确性
快速参考
常见错误类别
| 类别 | 严重性 | 示例 |
|---|---|---|
| 断言始终失败 | 🔴 严重 | assert x < y 其中 x ≥ y 始终成立 |
| 断言始终通过 | 🟠 高 | 始终为真的冗余检查 |
| 不可达代码 | 🟡 中等 | 无条件返回后的代码 |
| 类型不匹配 | 🔴 严重 | 比较中使用错误类型 |
| 整数溢出 | 🟠 高 | 无界算术运算 |
| 差一错误 | 🟠 高 | 循环边界错误 |
错误检测模式
// ❌ 始终失败的断言
export circuit verify(x: Uint<64>, y: Uint<64>): [] {
assert x > y; // 调用时 x = 0
assert x <= y; // 矛盾的断言
}
// ❌ 返回后的死代码
export circuit process(): Uint<64> {
return 42;
const x = 1; // 永不执行
}
// ❌ 差一错误
export circuit fill_array(): [] {
for i in 0..100 {
items[i + 1].write(0); // 跳过索引0,在100处溢出
}
}
审查流程
1. 断言分析
对于每个断言:
- 判断条件是否可能为真/假
- 检查是否存在矛盾的断言
- 验证断言是否有意义
需要标记的模式:
assert true- 无用assert false- 电路始终失败assert x && !x- 矛盾- 赋值后使其始终通过的断言
2. 控制流分析
追踪所有执行路径:
- 识别不可达代码
- 检查所有分支是否返回适当的值
- 验证循环边界
需要标记的模式:
return后的代码- 分支相同的
if语句 - 永不执行的循环 (
for i in 0..0) - 无限循环(如果可能)
3. 类型正确性
验证类型使用:
- 兼容类型之间的比较
- 边界内的算术运算
- 使用正确索引类型的数组/映射访问
4. 状态一致性
检查账本操作:
- 写前读模式
- 不一致的状态更新
- 缺少初始化
参考资料
相关技能
- 安全审查 - 安全漏洞
- compact-core/语言参考 - 类型系统