BSV 脚本模板
BSV BLOCKCHAIN QQ 脚本模板
用于官方 BSV 类型SDK 的脚本模板集
概览
这个寄存器的目标是提供一个位置,让来自生态系统周围的开发者可以发布各种脚本模板,而无需更新核心库. 我们一般对人们的贡献是中立的,没有偏见的,所以可以自由地贡献,看看人们用你的酷点子做什么!
使用
你可以这样写代码:
import { Transaction } from '@bsv/sdk'
import { OpReturn } from '@bsv/templates'
// Then, just use your template with the SDK!
const instance = new OpReturn()
const tx = new Transaction()
tx.addOutput({
lockingScript: OpReturn.lock(...),
satoshis: ...
})
当前模板
| 名称 | 说明 |
|---|---|
| Bsv21 纸币 | 锁定并解码 BRC-162( BSV- 21 二进制) 符号输出 |
| 选择返回 | 在非消耗性脚本中标记数据 |
| 梅达特 | 创建遵循 Metanet 协议的交易 |
| 多笔 | 创建多个可信任所有者的数据令牌 |
| P2MSKH (英语) | 使用M-of-N公用钥匙阈值 |
| R1K1 钱包 | 正常使用 P-256 硬件和 K1 恢复键 |
签名信任边界
签名模板验证源交易 ID, 输出索引, satoshi 数量、锁定脚本、序列和签名范围,然后请求 钱包签名。 当一个完整的源交易和明确的源 元数据是提供的,它们必须完全一致。 将验证失败视为一种 源验证或交易构建错误; 不丢弃重试 一种相互矛盾的价值观.
MultiPushDrop 仅标出完整的合同形状和支持
最多120个不同的压缩锁键。 其记录的可信任拥有者
模式仍然适用:任何一位拥有者都可以花去或摧毁该令牌.
P2MSKH 只在命令的公用钥匙列表中将承诺排入
源代码锁定脚本和钱包生成的签名密钥属于此
列表中选择一个选项。 在收集递增签名时,保留同样订购的清单;
地址、密钥列表或部分解锁未信任方的脚本
已核实,但本身并不证明打算付款的政策是安全的.
BRC-162 令牌 : Bsv21Binary
OneColor 是 BRC-162 1 Color 模板。 它读和写相同的产出
作为 Bsv21Binary 以及首次部署于
非零输出时的BRC-161(<txid>_<vout>);一个36字节的代号 有vout 0是
拒绝. Bsv21Binary 不变,仍然只接受32字节的id.
Bsv21Binary 构建和阅读 BRC-162号卫星 (BSV-21二进制)
符号输出。 符号输出是普通锁定脚本上的固定前缀 :
<token id | OP_0> <amount> OP_2DROP [<payload> OP_DROP] OP_DUP OP_HASH160 <pkh> OP_EQUALVERIFY OP_CHECKSIG
import { PrivateKey } from '@bsv/sdk'
import { Bsv21Binary, encodeStrictCbor, tokenIdFromString, tokenIdToString } from '@bsv/templates'
const owner = PrivateKey.fromRandom()
const pubKeyHash = owner.toPublicKey().toHash() as number[]
// A deploy output has a null token id; its payload is a strict-CBOR map.
const template = new Bsv21Binary()
const deployScript = template.lock(null, 0n, pubKeyHash, encodeStrictCbor({ sym: 'USD', dec: 2n }))
console.log(Bsv21Binary.decode(deployScript).role) // 'deploy'
// Later outputs name the token by `<deploy txid, 64 lowercase hex>_0`.
const tokenId = `${'ab'.repeat(32)}_0`
const lockingScript = template.lock(tokenId, 1_000_000n, pubKeyHash) // amounts are bigint
const decoded = Bsv21Binary.decode(lockingScript)
console.log(decoded.role) // 'value' ('authority' when the amount is 0n)
console.log(decoded.amount) // 1000000n
console.log(decoded.tokenId !== undefined && tokenIdToString(decoded.tokenId) === tokenId) // true
console.log(tokenIdFromString(tokenId).length) // 32 wire bytes, natural order
每个值都有一个被接受的编码 所以每个读取 相同的字节读取相同的同义输出 :
- 托肯编号 : 直接推出32个字节(在自然情况下部署 txid)
字节顺序),或
OP_0在部署.OP_PUSHDATA*不接受. - 数额 :
bigint, (中文(简体) ),0改为2^64 - 1。 。 。 .0实值OP_0, (中文(简体) ),1改为16为:OP_1改为OP_16,任何更大的 是一个直接的推动(0x01改为0x09页:1 最小的小endian脚本号。 以下政策上限2^64 - 1总计 各种投入和产出的算术和养护属于呼叫者. - 角色 :
deploy(无编号),authority(id,数额)0)或(或)value。 。 。 . - 无效的对非符号 :
isTokenShaped(script)告诉剧本 开始<push> <push> OP_2DROP从任何其他脚本.Bsv21Binary.decode掷出Bsv21BinaryError对于一个非空想的符号形状的脚本 (例如数额)5被推为01 05因此,它从来没有默默地读作 "不是一个标志".
严格的 CBOR 有效载荷
有效载荷属性从一个小的无依赖子集读取
DAG- 边境保护局,因此两个解码器不能
从同一个字节读取不同的属性. encodeStrictCbor 写下来,
decodeStrictCbor 掷出 StrictCborError 财务报告和审定财务报表 tryDecodeStrictCbor 返回时
undefined 对于它之外的一切:
- 顶级是带有文本密钥的地图,严格通过编码字节增加 (无重复);
- 值是无符号整数,最多为
2^64 - 1(单位:千美元)bigint),字节字符串 (单位:千美元)Uint8Array),严格的UTF-8文本,null、布林图和嵌入图; - 信头有确定和最小长度;
- 筑巢深度最多
STRICT_CBOR_MAX_DEPTH(4) 编码最多STRICT_CBOR_MAX_BYTES(4096年),没有后行字节.
浮点、标记(包括42个)、负整数、阵列和无限期长度 拒绝.
2.0.0版本删除 MandalaToken, (中文(简体) ), MandalaAdmin 财务报告和审定财务报表 ADMIN_PROTOCOL· ;
BRC-162号卫星 Bsv21Binary 产出取而代之,与电线兼容.
R1-K1 硬件钱包
R1K1Wallet 承诺 HASH160(compressedR1PublicKey || privateSalt) (单位:千美元)
分离的secp256k1公用钥匙散列。 盐会隐藏 PIV 公钥的再利用
直至R1支出显示两种值。 保持每32字节盐的备份
钱包元数据; 丢失它会禁用输出的 R1 路径而不是 K1
复原.
import { Hash, type PrivateKey, Utils } from '@bsv/sdk'
import { R1K1Wallet } from '@bsv/templates'
declare const compressedP256PublicKeyHex: string
declare const k1RecoveryPrivateKey: PrivateKey
declare const signWithYubiKeyPiv: (digest: Uint8Array) => Promise<Uint8Array>
const template = new R1K1Wallet()
const r1PublicKey = Utils.toArray(compressedP256PublicKeyHex, 'hex')
const salt = crypto.getRandomValues(new Uint8Array(32))
const lockingScript = await template.lock(
Hash.hash160([...r1PublicKey, ...salt]),
Hash.hash160(k1RecoveryPrivateKey.toPublicKey().encode(true) as number[])
)
const normalSpend = template.unlock({
path: 'r1',
publicKey: r1PublicKey,
salt,
// Submit this 32-byte digest unchanged to PIV GENERAL AUTHENTICATE.
// Return the YubiKey DER ECDSA signature (or raw 64-byte r || s).
signDigest: digest => signWithYubiKeyPiv(digest)
})
const recoverySpend = template.unlock({
path: 'k1',
privateKey: k1RecoveryPrivateKey
})
被合成的P-256验证器在959,632字节后生成了959,632字节锁定脚本 建筑师的承诺被烤熟。 这超过了普通的500KB矿工政策; 在为某项产出提供资金之前确认目标矿工的限额.
R1解锁脚本也会推出BIP-143的预告片,其出品人: scriptCode
合同中约960 KB OP_CODESEPARATOR。R1路径
因此,涉及大约2 MB的锁定加解锁脚本材料,以及
仅证人一人就为支出交易增加了大约960 KB。 账户
由此产生的费用,并确认任何最大交易政策; estimateLength
包括这个预想推. K1 解锁脚本仍然很小.
PIV证明硬件密钥在所供应的文摘上签了名,但有一个YubiKey 不显示或独立验证比特币交易。 一个PIN或 触摸策略保护关键用途,而不是交易意图;审查交易 在批准之前,他是受信任的东道主.
贡献准则
我们总是寻找贡献者 添加最酷的新模板。 不管你想出什么样的剧本 - 所有的贡献都是受欢迎的.
- 叉和克隆( C):叉出此寄存器并克隆到您的本地机器上.
- 设置运行
npm i以安装所有依赖. - 更改: 创建新的分支并进行修改.
- 测试: 确保所有测试通过运行
npm test。 。 。 . - 提交: 提交修改并按到叉上.
- 拉请求: 打开从您叉到此寄存器的拉取请求 . 详情请查看 储存库贡献准则。 。 。 .
关于过去释放的信息,请查看 更改日志对于今后的计划,请检查 路线图来啊!
支持联系人( C)
项目所有人: Ty Everett
发展小组组长:蒂·埃弗雷特
对于问题,错误报告或特性请求,请在 GitHub 上打开一个问题或直接与我们联系.
许可证
当前 TS Stack 更改根据 Open BSV 许可证版本 6 获得许可; 参见
LICENSE.txt (英语)。该软件包还保留了统一前代码
在开放BSV许可证版本4下. 补给者必须保留
第三次议会 NoTICES.md 和适用的文本在
LICENSES/。 。 。 .
感谢您参与BSV Blockchain脚本模板项目. 让我们一起打造BSV区块链的未来!