审查脚本模板Skill review-script-template

此技能用于审查和验证TypeScript脚本模板的实现,确保其符合最佳实践和标准,特别适用于区块链开发中的BitCom模板。关键词:脚本模板审查、TypeScript验证、区块链开发、BitCom、代码审计、最佳实践、ts-templates。

链开发 0 次安装 0 次浏览 更新于 3/15/2026

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 - 已知问题和修复