name: 审查脚本模板 description: 当用户要求“审查脚本模板”、“审计模板”、“检查模板实现”、“验证ts-templates代码”或提及审查BitCom模板如AIP、MAP、SIGMA、BAP时,应使用此技能。验证ScriptTemplate实现符合最佳实践。
审查脚本模板
审查和验证ts-templates中脚本模板实现的正确性和最佳实践。
何时使用
- 合并前审查新模板
- 审计现有模板实现
- 验证模板遵循ts-templates模式
- 检查常见实现错误
审查清单
结构验证
- [ ] 文件位于
src/template/适当子目录中 - [ ] 实现来自@bsv/sdk的
ScriptTemplate接口 - [ ] 导出PREFIX常量
- [ ] 导出包含所有协议字段的Data接口
- [ ] 默认导出是模板类
- [ ] 添加到mod.ts导出(类 + 类型)
接口要求
- [ ]
data属性是public readonly - [ ] 构造函数接受Data接口
- [ ]
bitcomIndex?: number字段用于协议位置 - [ ]
valid?: boolean字段用于验证状态
必需方法
| 方法 | 目的 | 要求 |
|---|---|---|
decode() |
静态。从BitComDecoded解析 | 返回实例数组 |
lock() |
生成锁定脚本 | 对OP_RETURN协议使用BitCom |
unlock() |
生成解锁脚本 | 如果不适用则抛出 |
verify() |
检查签名有效性 | 返回布尔值 |
代码质量
- [ ] 直接使用
script.chunks(不使用toASM().split()) - [ ] 使用@bsv/sdk Utils(不使用Buffer、TextEncoder)
- [ ] decode()中有适当的错误处理
- [ ] 没有硬编码魔术数字
- [ ] 与仓库中其他模板一致
块解析审查
正确模式:
const script = Script.fromBinary(protocol.script)
const chunks = script.chunks
const field = Utils.toUTF8(chunks[0].data ?? [])
错误模式标记:
// 错误:字符串分割
const parts = script.toASM().split(' ')
// 错误:Buffer使用
const field = Buffer.from(chunks[0].data).toString()
// 错误:TextEncoder
new TextEncoder().encode(field)
Utils使用审查
验证正确Utils函数:
| 操作 | 正确 | 错误 |
|---|---|---|
| 字符串 → 字节 | Utils.toArray(str, 'utf8') |
Buffer.from(), TextEncoder |
| 字节 → 字符串 | Utils.toUTF8(bytes) |
Buffer.toString(), TextDecoder |
| 字节 → 十六进制 | Utils.toHex(bytes) |
Buffer.toString('hex') |
| 字节 → base64 | Utils.toBase64(bytes) |
Buffer.toString('base64') |
签名验证审查
对于带签名的协议:
- [ ] 使用BSM.sign()进行签名
- [ ] 尝试所有4个恢复因子(0-3)
- [ ] 使用Signature.fromCompact()进行解码
- [ ] 验证地址匹配恢复的公钥
- [ ] 验证后设置
valid字段
BitCom集成审查
对于OP_RETURN协议:
- [ ] 在lock()中使用BitCom类
- [ ] 创建具有正确结构的Protocol数组
- [ ] 正确处理管道分隔符
- [ ] decode()接受BitComDecoded参数
常见问题
问题1:缺少空检查
// 错误:可能因缺少数据而抛出
const field = Utils.toUTF8(chunks[0].data)
// 正确:处理缺少数据
const field = Utils.toUTF8(chunks[0].data ?? [])
问题2:错误块索引
验证块索引匹配协议规范:
- 检查协议文档字段顺序
- 考虑协议前缀是单独的
问题3:不完整错误处理
// 错误:解析错误时崩溃
static decode(bitcom: BitComDecoded): Protocol[] {
const script = Script.fromBinary(protocol.script) // 可能抛出!
}
// 正确:处理解析错误
static decode(bitcom: BitComDecoded): Protocol[] {
try {
const script = Script.fromBinary(protocol.script)
} catch {
continue // 跳过无效协议
}
}
问题4:缺少mod.ts导出
检查mod.ts包含:
export { default as Protocol, PREFIX } from './src/template/...'
export type { ProtocolData, ProtocolOptions } from './src/template/...'
审查输出格式
提供结构化反馈:
## 模板审查:[模板名称]
### 结构:✅ 通过 / ❌ 失败
- [详情]
### 方法:✅ 通过 / ❌ 失败
- [详情]
### 代码质量:✅ 通过 / ❌ 失败
- [详情]
### 发现的问题
1. [问题描述和修复]
2. [问题描述和修复]
### 建议
- [可选改进]
附加资源
参考文件
references/checklist-detailed.md- 扩展验证标准references/common-bugs.md- 已知问题和修复