name: compact-reviewer:performance-review description: 用于审查Compact电路的性能问题、优化约束数量、分析证明生成时间或识别Gas和成本优化机会时使用。
性能审查技能
分析电路效率并识别Compact合约中的优化机会。
何时使用
此技能在以下查询时激活:
- 电路性能和效率
- 约束数量优化
- 证明生成时间
- Gas/成本优化
- 性能瓶颈
触发词:性能、优化、约束、电路效率、证明生成、Gas、成本
快速参考
约束成本表
| 操作 | 成本 | 备注 |
|---|---|---|
加法 (+) |
0 | 在R1CS中免费 |
减法 (-) |
0 | 免费 |
乘法 (*) |
1 | 单个约束 |
除法 (/) |
~1 | 包含逆运算 |
相等性检查 (==) |
~1 | 直接检查 |
不等式检查 (<, >) |
~254 | 位分解 |
| 哈希 (Pedersen) | ~1,000 | 已优化 |
| SHA256 | ~25,000 | 昂贵 |
| Merkle证明 (深度 N) | ~N×1,000 | 每层哈希 |
复杂度估算
总约束数 ≈
(哈希操作数 × 1,000) +
(SHA256操作数 × 25,000) +
(比较操作数 × 254) +
(Merkle深度 × 1,000) +
(循环迭代次数 × 循环体成本)
快速优化
| 优化措施 | 节省量 | 难度 |
|---|---|---|
| 替换 SHA256 → Pedersen | 每个哈希节省约25倍 | 低 |
使用 == 代替 < |
节省约253个约束 | 低 |
| 减少Merkle深度 | 每层节省约1,000个约束 | 中 |
| 将计算移至见证数据 | 可变 | 中 |
审查流程
1. 统计昂贵操作
扫描合约中的以下内容:
// 高成本操作
persistentHash() // ~1,000 个约束
persistentCommit() // ~1,000 个约束
sha256() // ~25,000 个约束 ❌ 避免使用
ecMul() // ~5,000-10,000 个约束
// 中等成本操作
if x < y { } // ~254 个约束 (位分解)
for i in 0..N { } // 内部约束乘以 N
// 低成本操作
x + y // 免费
x * y // 1 个约束
x == y // ~1 个约束
2. 分析循环
针对每个循环:
1. 循环内部有哪些操作?
2. 有多少次迭代?
3. 是否有操作可以移到循环外部?
4. 循环是否必要?
示例:
// ❌ 低效:哈希在循环内
for i in 0..10 {
hashes[i] = hash(data[i]); // 10 × 1,000 = 10,000 个约束
}
// ✅ 考虑:是否可以在见证数据中完成?
3. 检查类型选择
较小的类型意味着更便宜的比较:
| 类型 | 比较成本 |
|---|---|
| Uint<8> | ~8 个约束 |
| Uint<64> | ~64 个约束 |
| Uint<254> | ~254 个约束 |
4. 评估Merkle使用
// 深度为20的Merkle树
const proof = get_merkle_proof(); // ~20,000 个约束
// 考虑:深度20是否必要?
// 深度10将需要约10,000个约束
参考资料
相关技能
- 设计架构 - 结构效率
- compact-core/标准库 - 高效函数