名称: 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: 创建拉取请求
- 创建功能分支:
git checkout -b feature/protocol-template - 提交更改并附带描述性消息
- 推送并创建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