术语表 /协议与升级
Miniscript
- Miniscript 是什么?
- Miniscript 是编写比特币脚本(Bitcoin Script)中实用子集的一种结构化方式,使软件能够分析花费策略、计算其成本并自动为其签名。
普通的比特币脚本(Bitcoin Script)易于编写,却几乎无法进行推理:没有任何信息能告诉您脚本是否可以花费、其见证数据有多大,或者某个分支是否已失效。Miniscript 把语法限制在一组可组合的片段内,这些片段自带上述问题的答案。Bitcoin Core 自版本24.0起即可在描述符中识别它,并自版本25.0起可为其签名。
运作方式
Miniscript 由片段和组合子构建而成:每个片段对应一种已知的操作码模式,组合子则把片段连接起来,同时不破坏其保证。
其词汇量很小。片段用来表达条件:pk(key) 表示签名,older(4320) 表示相对时间锁,after(800000) 表示绝对时间锁,sha256(h) 表示哈希原像。组合子用来表达结构:and_v、or_d、thresh 和 andor 几乎涵盖了所有人会构建的内容。一个恢复钱包可以写成 or_d(pk(daily_key),and_v(v:pk(backup_key),older(52560))),这样的策略人可以检查,编译器也可以把它转换为脚本。
每个片段都带有类型和一组属性,整套机制正是依靠类型系统运转。只有在属性相互匹配时才允许组合,因此,若某个策略会生成无人能够满足的脚本,或者会被第三方在传输途中篡改的脚本,它会在编译阶段就失败,而不是在资金已存入之后才在链上失败。
由于结构是已知的,在您入金之前,三个问题就能得到确切的答案:最坏情况下的见证数据有多大(以权重单位计);密钥、原像和经过的时间有哪些组合可以真正花费这笔资金;脚本是否符合限制,即共识规定的10,000字节,以及 P2WSH 见证脚本更严格的3,600字节标准性上限,该上限决定节点是否会转发您的这笔花费。
最后一环是满足条件。给定一个脚本和签名方持有的材料,Miniscript 实现可以自行构造成本最低的有效见证数据。因此,钱包无需为每种策略分别提供定制的签名代码,就能支持任意策略。
在哪里会遇到它
在您需要一个不止“一个密钥、一个签名”的钱包之前,Miniscript 是看不见的。
Bitcoin Core 分阶段支持了它:版本24.0能在 P2WSH 描述符中解析 Miniscript 以便观察,版本25.0则增加了为其签名的能力,正是这一版本使策略钱包可以在参考客户端中使用。Ledger 的比特币应用通过 BIP-388中定义的钱包策略格式注册策略,因此硬件设备可以显示并批准一个它从未见过的脚本。
最清晰的消费级产品是 Liana,这款钱包的全部前提就是一个 Miniscript 策略:今天用您的常规密钥花费,或在经过设定数量的区块后,用由他人持有的恢复密钥花费。遗产规划,以及带有逐级审批路径的企业账户,结构与此相同。
如果您持有的是单签名钱包,这一切与您无关。当您需要一条不依赖某家公司持续经营的备份路径时,它才开始变得重要;而在原本只能自行编写脚本的场合,它的作用最为突出。
Miniscript vs 输出描述符
描述符说明使用哪些密钥和哪种脚本类型;Miniscript 说明脚本内部做什么。两者是不同的层,而不是替代方案,并且可以嵌套:wsh(or_d(pk(A),and_v(v:pk(B),older(52560)))) 是一个描述符,其内部表达式是 Miniscript。
在 Miniscript 出现之前,描述符只能指定固定的几种模板,如 wpkh、sortedmulti 和 tr。凡是超出这些模板的需求,就意味着手写十六进制,而钱包只能观察该地址,却永远无法从中花费。Miniscript 让内部位置可以容纳任意策略,同时保持描述符的校验和、密钥来源和派生路径原样不变,因此 Miniscript 备份仍然只是一行您可以打印出来的文本。