create-script-template
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCreate Script Template
创建脚本模板
Create script templates for the b-open-io/ts-templates repository following established patterns.
按照既定规范,为b-open-io/ts-templates仓库创建脚本模板。
When to Use
使用场景
- Create a new BitCom protocol template (like AIP, MAP, SIGMA)
- Build an OP_RETURN data template
- Implement a ScriptTemplate for a new protocol
- Add a template to ts-templates repository
- 创建新的BitCom协议模板(如AIP、MAP、SIGMA)
- 构建OP_RETURN数据模板
- 为新协议实现ScriptTemplate
- 向ts-templates仓库添加模板
Template Structure
模板结构
Every template follows this pattern:
typescript
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
// protocol-specific fields
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 { /* ... */ }
}所有模板均遵循以下模式:
typescript
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 { /* ... */ }
}Creation Process
创建流程
Step 1: Understand the Protocol
步骤1:理解协议
Gather protocol specifications:
- Protocol prefix/identifier (Bitcoin address or literal string)
- Field order and data types
- Signing requirements (if any)
- Verification logic
收集协议规范:
- 协议前缀/标识符(比特币地址或字面字符串)
- 字段顺序和数据类型
- 签名要求(如有)
- 验证逻辑
Step 2: Create Template File
步骤2:创建模板文件
Location:
src/template/bitcom/ProtocolName.tsRequired exports:
- constant
PREFIX - interface
ProtocolData - Default class implementing
ScriptTemplate
路径:
src/template/bitcom/ProtocolName.ts必需导出项:
- 常量
PREFIX - 接口
ProtocolData - 实现的默认类
ScriptTemplate
Step 3: Implement Core Methods
步骤3:实现核心方法
decode() - Parse from BitComDecoded:
typescript
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
// Extract fields from chunks using Utils.toUTF8(chunk.data)
}
}
return results
}lock() - Generate locking script:
typescript
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()
}decode() - 从BitComDecoded解析:
typescript
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() - 生成锁定脚本:
typescript
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()
}Step 4: Add to mod.ts
步骤4:添加到mod.ts
Export the new template:
typescript
export { default as Protocol, PREFIX } from './src/template/bitcom/Protocol.js'
export type { ProtocolData, ProtocolOptions } from './src/template/bitcom/Protocol.js'导出新模板:
typescript
export { default as Protocol, PREFIX } from './src/template/bitcom/Protocol.js'
export type { ProtocolData, ProtocolOptions } from './src/template/bitcom/Protocol.js'Step 5: Create Pull Request
步骤5:创建拉取请求
- Create feature branch:
git checkout -b feature/protocol-template - Commit changes with descriptive message
- Push and create PR to b-open-io/ts-templates
- 创建功能分支:
git checkout -b feature/protocol-template - 提交带有描述性信息的变更
- 推送并向b-open-io/ts-templates创建PR
Key Patterns
关键模式
Chunk-Based Parsing
基于Chunk的解析
Always use directly, never string splitting:
script.chunkstypescript
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 ?? [])始终直接使用,绝不使用字符串拆分:
script.chunkstypescript
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 Over Buffer
优先使用Utils而非Buffer
Use @bsv/sdk Utils for all byte manipulation:
- - String to bytes
Utils.toArray(string, 'utf8') - - Bytes to string
Utils.toUTF8(bytes) - - Bytes to hex
Utils.toHex(bytes) - - Bytes to base64
Utils.toBase64(bytes)
所有字节操作均使用@bsv/sdk的Utils:
- - 字符串转字节
Utils.toArray(string, 'utf8') - - 字节转字符串
Utils.toUTF8(bytes) - - 字节转十六进制
Utils.toHex(bytes) - - 字节转Base64
Utils.toBase64(bytes)
Signature Verification
签名验证
For protocols with signatures, use BSM recovery:
typescript
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 { /* try next */ }
}对于带签名的协议,使用BSM恢复:
typescript
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 { /* 尝试下一个 */ }
}Additional Resources
额外资源
Reference Files
参考文件
- - Detailed template structure
references/template-anatomy.md - - Contribution workflow for ts-templates
references/pr-workflow.md
- - 详细的模板结构说明
references/template-anatomy.md - - ts-templates的贡献流程
references/pr-workflow.md
Examples
示例
- - Minimal template (no external deps)
examples/OpReturn.ts
- - 极简模板(无外部依赖)
examples/OpReturn.ts
More Examples
更多示例
For complete production templates, see the ts-templates repository:
https://github.com/b-open-io/ts-templates/tree/master/src/template
Notable templates:
- - Transaction-bound signatures (uses sigma-protocol)
bitcom/Sigma.ts - - Author Identity Protocol
bitcom/AIP.ts - - Magic Attribute Protocol
bitcom/MAP.ts - - Bitcoin Attestation Protocol
bitcom/BAP.ts - - B:// file storage
bitcom/B.ts - - Simple OP_RETURN
opreturn/OpReturn.ts
如需完整的生产级模板,请查看ts-templates仓库:
https://github.com/b-open-io/ts-templates/tree/master/src/template
值得关注的模板:
- - 交易绑定签名(使用sigma-protocol)
bitcom/Sigma.ts - - 作者身份协议
bitcom/AIP.ts - - 魔法属性协议
bitcom/MAP.ts - - 比特币证明协议
bitcom/BAP.ts - - B://文件存储
bitcom/B.ts - - 简单OP_RETURN
opreturn/OpReturn.ts