比特币最小标记
小写是一种结构化的,人性化的表达比特币支出的方式 条件,使脚本更容易解释和分析,同时提供 保证安全 围绕花费行为.
此软件包提供了一个用于编译和分析的 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 未返回.
标签上下文
最小标记的有效性取决于脚本上下文. 有两条关键规则 更改:
MINIMALIF是共识,所以d:X包装成为单位.- 多相图用途
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。 。 。 .
TL; DR; 建议使用
- 打电话
analyzeMiniscript(或检查)issane从compileMiniscript改为: 在证人到来之前,确保小写正常. - 在花费时,建造证人 仅限 从
nonMalleableSats。 。 。 . - 处理
malleableSats(和unknownSats当启用时)作为诊断和 永远不要用它们来生产.
提示: 使用 unknowns编号 :knowns 保持满足感,特别是
multi(4,20) 风格的脚本(参见"管理满意度增长"). 启用
computeUnknowns 只检查丢弃的解决方案.
作者和贡献者
该项目最初是开发的,目前由 何塞-路易斯·兰达巴索欢迎其他开发者的贡献和帮助.
以下是一些帮助您开始捐款的资源:
从源头建楼
要下载源代码并构建项目,请遵循这些步骤:
- 清除仓库 :
git clone https://github.com/bitcoinerlab/miniscript.git
- 安装依赖性 :
npm install
- 构建工程 :
npm run build
- 运行测试套件 :
npm test
这将构建工程并生成必要的文件 dist 目录.
文档
为了生成程序员的文档,其中描述了库的编程接口,使用以下命令:
npm run docs
这将生成文件 docs 目录.
测试
在实施任何代码之前,确保通过运行来通过所有测试:
npm run tests
许可证
这个项目根据麻省理工学院的许可证获得许可.
++ 支持者
BitcoinerLAB项目得到下列机构的自豪支持: 打开卫星 组织.