创建脚本模板Skill create-script-template

这个技能用于创建比特币脚本模板,支持BitCom协议如AIP、MAP、SIGMA,涉及脚本开发、模板实现和ts-templates仓库贡献。关键词:比特币脚本、BitCom协议、ScriptTemplate、ts-templates、脚本开发、区块链编程。

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

名称: create-script-template 描述: 当用户请求“创建脚本模板”、“向ts-templates添加新模板”、“创建BitCom模板”、“构建OP_RETURN模板”或提及为协议如SIGMA、AIP、MAP、BAP、B创建模板时使用此技能。指导创建@bsv/sdk ScriptTemplate实现。

创建脚本模板

为b-open-io/ts-templates仓库创建脚本模板,遵循既定模式。

何时使用

  • 创建新的BitCom协议模板(如AIP、MAP、SIGMA)
  • 构建OP_RETURN数据模板
  • 为新协议实现ScriptTemplate
  • 向ts-templates仓库添加模板

模板结构

每个模板遵循此模式:

import { ScriptTemplate, LockingScript, UnlockingScript, Script, Utils } from '@bsv/sdk'
import BitCom, { Protocol, BitComDecoded } from './BitCom.js'

export const PREFIX = 'PROTOCOL_ID'

export interface ProtocolData {
  bitcomIndex?: number
  // 协议特定字段
  valid?: boolean
}

export default class Protocol implements ScriptTemplate {
  public readonly data: ProtocolData

  constructor(data: ProtocolData) {
    this.data = data
  }

  static decode(bitcom: BitComDecoded): Protocol[] { /* ... */ }
  static sign(/* params */): Promise<Protocol> { /* ... */ }
  lock(): LockingScript { /* ... */ }
  unlock(): { sign: Function, estimateLength: Function } { /* ... */ }
  verify(): boolean { /* ... */ }
}

创建过程

步骤1: 理解协议

收集协议规范:

  • 协议前缀/标识符(比特币地址或字面字符串)
  • 字段顺序和数据类型
  • 签名要求(如果有)
  • 验证逻辑

步骤2: 创建模板文件

位置:src/template/bitcom/ProtocolName.ts

必需导出:

  • PREFIX 常量
  • ProtocolData 接口
  • 实现ScriptTemplate的默认类

步骤3: 实现核心方法

decode() - 从BitComDecoded解析:

static decode(bitcom: BitComDecoded): Protocol[] {
  const results: Protocol[] = []
  for (const protocol of bitcom.protocols) {
    if (protocol.protocol === PREFIX) {
      const script = Script.fromBinary(protocol.script)
      const chunks = script.chunks
      // 使用Utils.toUTF8(chunk.data)从chunks提取字段
    }
  }
  return results
}

lock() - 生成锁定脚本:

lock(): LockingScript {
  const script = new Script()
  script.writeBin(Utils.toArray(field1, 'utf8'))
  script.writeBin(Utils.toArray(field2, 'utf8'))

  const protocols: Protocol[] = [{
    protocol: PREFIX,
    script: script.toBinary(),
    pos: 0
  }]

  return new BitCom(protocols).lock()
}

步骤4: 添加到mod.ts

导出新模板:

export { default as Protocol, PREFIX } from './src/template/bitcom/Protocol.js'
export type { ProtocolData, ProtocolOptions } from './src/template/bitcom/Protocol.js'

步骤5: 创建拉取请求

  1. 创建功能分支:git checkout -b feature/protocol-template
  2. 提交更改并附带描述性消息
  3. 推送并创建PR到b-open-io/ts-templates

关键模式

基于块解析

始终直接使用script.chunks,切勿字符串分割:

const script = Script.fromBinary(protocol.script)
const chunks = script.chunks

const field1 = Utils.toUTF8(chunks[0].data ?? [])
const field2 = Utils.toUTF8(chunks[1].data ?? [])
const signature = Array.from(chunks[2].data ?? [])

使用Utils而非Buffer

使用@bsv/sdk Utils进行所有字节操作:

  • Utils.toArray(string, 'utf8') - 字符串转字节
  • Utils.toUTF8(bytes) - 字节转字符串
  • Utils.toHex(bytes) - 字节转十六进制
  • Utils.toBase64(bytes) - 字节转base64

签名验证

对于带有签名的协议,使用BSM恢复:

for (let recovery = 0; recovery < 4; recovery++) {
  try {
    const publicKey = sig.RecoverPublicKey(
      recovery,
      new BigNumber(BSM.magicHash(message))
    )
    if (BSM.verify(message, sig, publicKey) &&
        publicKey.toAddress().toString() === address) {
      return true
    }
  } catch { /* 尝试下一个 */ }
}

附加资源

参考文件

  • references/template-anatomy.md - 详细模板结构
  • references/pr-workflow.md - ts-templates的贡献工作流程

示例

  • examples/OpReturn.ts - 最小模板(无外部依赖)

更多示例

对于完整的生产模板,请参阅ts-templates仓库: https://github.com/b-open-io/ts-templates/tree/master/src/template

显著模板:

  • bitcom/Sigma.ts - 交易绑定签名(使用sigma-protocol)
  • bitcom/AIP.ts - 作者身份协议
  • bitcom/MAP.ts - 魔法属性协议
  • bitcom/BAP.ts - 比特币认证协议
  • bitcom/B.ts - B://文件存储
  • opreturn/OpReturn.ts - 简单OP_RETURN