@bitcoinerlab/miniscript

中文文档
2.0.1发布于 2026/11/05MITTypeScriptCommonJS近 30 天下载 13万

比特币Miniscript,一种用于描述比特币消费条件的高级语言. 它包括一名编译员/分析员,并配有一名征兆员--agnostic satisfier,可以产生象征性的证人(例如: " sig(key) " ).

中文使用文档
文档目录13 节
  1. 安装
  2. 使用量
  3. 将政策编译为小写和比特币脚本
  4. 将迷你文字编入比特币脚本
  5. 生成脚本证人
  6. 标签上下文
  7. TL; DR; 建议使用
  8. 作者和贡献者
  9. 从源头建楼
  10. 文档
  11. 测试
  12. 许可证
  13. ++ 支持者

比特币最小标记

小写是一种结构化的,人性化的表达比特币支出的方式 条件,使脚本更容易解释和分析,同时提供 保证安全 围绕花费行为.

此软件包提供了一个用于编译和分析的 TypeScript 执行 小型标语和用于证人(支出交易必须提供的数据) 提供以解锁输出). 占卜者是可知的标志者 使用占位符等符号式证人堆栈 <sig(key)> 和图像 标记,这样你就可以解释没有私钥的满足.

安装

要安装软件包, 请使用 npm :

npm install @bitcoinerlab/miniscript

使用量

您可以使用在线游乐场演示来测试本节中的实例 https://bitcoinerlab.com/modules/miniscript. 互联网档案馆的存檔,存档日期2014-12-11。 。 。 .

将政策编译为小写和比特币脚本

政策是描述开支的更高级、人能读取的语言 条件(例如:和/或条款、时间间隔和密钥检查)。 政策 编译由配套软件包提供 @bitcoinerlab/miniscript-policies。 。 。 .

const { ready, compilePolicy } = require('@bitcoinerlab/miniscript-policies');
await ready;

const policy = 'or(and(pk(A),older(8640)),pk(B))';
const { miniscript } = compilePolicy(policy);

将迷你文字编入比特币脚本

要将 Miniscript 编译为 Bitcoin ASM, 您可以使用 compileMiniscript 函数 :

const { compileMiniscript } = require('@bitcoinerlab/miniscript');

const miniscript = 'and_v(v:pk(key),or_b(l:after(100),al:after(200)))';
const { asm } = compileMiniscript(miniscript);

生成脚本证人

从 Miniscript 生成脚本证人, 您可以使用 satisfier 函数.

这个 satisfier 运行最小标记 静态类型 系统 分析时抛出 小标语不是正常的。 正常的小标语遵循共识和标准 规则:它避免可移动的仅限路径(更多在后期),不混合 单个分支上的时锁单元,不包含重复的密钥.

证人以象征性形式(例如:, <sig(key)>, (中文(简体) ), <sha256_preimage(H)>),所以即使没有签名,也可以分析解决方案:

const miniscript =
  'c:or_i(andor(c:pk_h(key1),pk_h(key2),pk_h(key3)),pk_k(key4))';

const { nonMalleableSats } = satisfier(miniscript);

在上述例子中 nonMalleableSats 为:

nonMalleableSats: [
  {asm: "<sig(key4)> 0"}
  {asm: "<sig(key3)> <key3> 0 <key1> 1"}
  {asm: "<sig(key2)> <key2> <sig(key1)> <key1> 1"}
]

,在递增的重量单位大小中命令满足,因此可以 选择最小的证人,并支付较少的费用.

何况 asm,返回的溶液可能带有时间锁要求,当 需要:

{
  asm: string;
  nSequence?: number;
  nLockTime?: number;
}

如果解决方案包括 nSequence 或者说 nLockTime,支出交易必须 将这些字段设置在输入或交易级别(CSV使用) nSequence 百分比 输入; CLTV 使用 nLockTime (b) 为交易提供方便).

处理可溶性

SegWit消除了经典的txid可容性,但目击者可容性仍然 已存在: 开支可以有多个有效的证人堆栈, 保存 txid 在修改交易权重和收费标准的同时,保持不变。 攻击者可以 将一个有效的证人换成另一个证人,使交易规模大或小, 可能会影响收费政策或集资接受。 因此,宰相 将不可调解的解决方案(稳定、独特的证人)与可调解的解决方案分开 (可改变重量的替代有效证人). 只使用不可调用 建造花费时设定.

const { malleableSats, nonMalleableSats } = satisfier(miniscript);

管理满意度 增长

有些脚本可以产生许多满意,可以进行计算 昂贵甚至不可行 为了保持这种可控性, 萨提斯菲勒执行 默认上限 1000 解决方案。 上限计算所有衍生解决方案,包括: 中间组合和投掷一度超过. 你可以举起它 或以 satisfier(miniscript, { maxSolutions: null});。 。 。 .

然而,建议避免指数性爆炸的方法是利用 unknowns。通过 unknowns 与非信息块 现有,例如, <sig(key)> 签名或预想标记 <ripemd160_preimage(H)>。 。 。 .

例如:

const miniscript =
  'c:or_i(andor(c:pk_h(key1),pk_h(key2),pk_h(key3)),pk_k(key4))';
const unknowns = ['<sig(key1)>', '<sig(key2)>'];

const { nonMalleableSats, malleableSats } = satisfier(miniscript, { unknowns });

生产:

nonMalleableSats: [
  {asm: "<sig(key4)> 0"}
  {asm: "<sig(key3)> <key3> 0 <key1> 1"}
]

和抛弃物:

{
  asm: '<sig(key2)> <key2> <sig(key1)> <key1> 1'
}

作为参考, multi(2,key1,...,key20) 产生190项满意度和 在笔记本电脑上用大约200ms完成,同时 multi(4,key1,...,key20) 产量 4,845次满意,需要6秒左右.

如果只知道6个签名,则查核结果将达到15个满意(C(6,4) = 15并且几乎马上完成.

改为 unknowns,用户可选择提供互补 参数 knowns数字 : satisfier(miniscript, { knowns })。这一论点 对应已知唯一一条信息。 这很重要 说明 knowns 或者说 unknowns 必须提供,但不能同时提供。 若为 既不提供论据 也不认为所有签名和预想 已经知道.

建模对手时,包括 knowns 一切攻击者可能 不仅拥有你自己的秘密 如果你留下攻击者的材料 knowns,你可以错误地将可移动路径归类为安全路径. 安全图案 包括所有攻击者可获得的材料 knowns选择一个 仅使用自己材料的不适性满足.

为调试或教育目的,您可以计算丢弃的未知数据 通过设定满足 computeUnknowns: true。这个集合 unknownSats 包含未知数据的解决方案:

const { nonMalleableSats, unknownSats } = satisfier(miniscript, {
  unknowns,
  computeUnknowns: true
});

nonMalleableSats: [
  {asm: "<sig(key4)> 0"}
  {asm: "<sig(key3)> <key3> 0 <key1> 1"}
]
unknownSats: [ {asm: "<sig(key2)> <key2> <sig(key1)> <key1> 1"} ]

默认 computeUnknowns 被禁用,以控制解决方案的数量,所以 未知的满意程度被压抑 unknownSats 未返回.

标签上下文

最小标记的有效性取决于脚本上下文. 有两条关键规则 更改:

  1. MINIMALIF 是共识,所以 d:X 包装成为单位.
  2. 多相图用途 multi_a (CHECKSGRADD) 而不是说 multi (CHECKMULTISIG) (CHECMULTISIG) (中文(简体) ).

因为Satisfier先运行静态分析器 你必须通过 tapscript: true 使用自定义小标记工作时:

const miniscript = 'multi_a(2,key1,key2,key3)';
const { nonMalleableSats } = satisfier(miniscript, { tapscript: true });

有些脚本只在脚本下正常. 譬如说, and_v(v:pk(key1),or_d(d:v:1,pk(key2))) 在 SegWit v0 (P2WSH) 中不是正常的, 但它在脚印上变得有效,因为 d:v:1 下为单位 MINIMALIF。 。 。 .

  • 打电话 analyzeMiniscript (或检查) issane 从 compileMiniscript改为: 在证人到来之前,确保小写正常.
  • 在花费时,建造证人 仅限 从 nonMalleableSats。 。 。 .
  • 处理 malleableSats (和 unknownSats 当启用时)作为诊断和 永远不要用它们来生产.

提示: 使用 unknowns编号 :knowns 保持满足感,特别是 multi(4,20) 风格的脚本(参见"管理满意度增长"). 启用 computeUnknowns 只检查丢弃的解决方案.

作者和贡献者

该项目最初是开发的,目前由 何塞-路易斯·兰达巴索欢迎其他开发者的贡献和帮助.

以下是一些帮助您开始捐款的资源:

从源头建楼

要下载源代码并构建项目,请遵循这些步骤:

  1. 清除仓库 :
git clone https://github.com/bitcoinerlab/miniscript.git
  1. 安装依赖性 :
npm install
  1. 构建工程 :
npm run build
  1. 运行测试套件 :
npm test

这将构建工程并生成必要的文件 dist 目录.

文档

为了生成程序员的文档,其中描述了库的编程接口,使用以下命令:

npm run docs

这将生成文件 docs 目录.

测试

在实施任何代码之前,确保通过运行来通过所有测试:

npm run tests

许可证

这个项目根据麻省理工学院的许可证获得许可.

++ 支持者

BitcoinerLAB项目得到下列机构的自豪支持: 打开卫星 组织.

OpenSats logo

版本与发布记录

@bitcoinerlab/miniscript 共发布 16 个版本,首次发布于 2022/12/25;过去 12 个月发布了 2 个版本。

版本发布日期距今
2.0.1latest2026/11/052 天前
2.0.02026/01/309 个月前
1.4.32025/11/061 年前
1.4.22025/10/301 年前
1.4.02023/09/133 年前
1.2.12023/02/033 年前

关于 @bitcoinerlab/miniscript 的常见问题

@bitcoinerlab/miniscript 是什么?

比特币Miniscript,一种用于描述比特币消费条件的高级语言. 它包括一名编译员/分析员,并配有一名征兆员--agnostic satisfier,可以产生象征性的证人(例如: " sig(key) " ).

如何安装 @bitcoinerlab/miniscript?

在项目目录运行 npm install @bitcoinerlab/miniscript,或使用 pnpm add / yarn add / bun add。

@bitcoinerlab/miniscript 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bitcoinerlab/miniscript 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@bitcoinerlab/miniscript 可以商用吗?

@bitcoinerlab/miniscript 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bitcoinerlab/miniscript 的下载量有多少?

根据 npm 官方下载统计,@bitcoinerlab/miniscript 在 2026/10/08 – 2026/11/06 这 30 天内被下载 130,389 次,日均约 4,346 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bitcoinerlab/miniscript 还在维护吗?

最新版本 2.0.1 发布于 2026/11/05(2 天前);至今共发布 16 个版本,其中过去 12 个月发布了 2 个;首次发布于 2022/12/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。