从Miniscript到Simplicity
Blockstream Research

从Miniscript到Simplicity

Christian Lewe

比特币由计算机程序管理,这些程序可以解锁资金以换取有效的见证。这些比特币脚本会为支出条件编码,定义什么是有效见证,什么不是有效见证。每笔交易都基于这种机制。确保这个机制有效意味着确保交易有效。那么我们如何确保这些程序是正确的呢,尤其是当它们对复杂的支出条件进行编码时?我们如何追踪这种复杂的情况?像Miniscript这样的树形程序就是解决这个问题的方案。

树是最基本的通过边(edges)链接节点的数据结构之一。每个节点都连接到零个或多个子节点,但只连接到一个父节点。树从没有父节点的特殊根节点“生长”。在这种数据结构里,我们可以取任何一个节点并查看它的后代:它是一棵较小的树!一棵树是由许多更小的树递归组成的。这意味着如果我们可以将数据表示为一棵树,我们就可以通过递归算法对其进行处理,将其一点一点分解。这使得数据分析之类的事情对我们来说更容易。

比特币的树形搜索

Miniscript是比特币脚本的一个子集。它在脚本上强加了一个树形结构,标识了脚本中每个部分的作用。有些部分要求签名,其他部分要求哈希原像(hash preimage);有些强制执行时间锁,而另一些则进行组合以形成更复杂的条件。通过查看树形结构,可以明确脚本的含义。每个部分都扮演一个角色且可以从树中看到。

这是一个比特币脚本和一个的Miniscript树结构“顶部”的示例。

事实证明,添加的结构非常有用:脚本的属性可以通过沿着树形结构移动进行静态分析和归纳证明。我们可以很容易地证明脚本接受或拒绝给定的见证,它会产生给定的费用,或者它会在执行期间达到资源限制。我们甚至可以将两个脚本合并为一个,对他们的支出条件的构成进行编码。使用此工具包,我们可以对复杂的支出条件进行编码,同时确保生成的脚本是正确的。

Raw Bitcoin脚本没有上面说的那么便利,因此使用起来更棘手。脚本的含义由C++实现并隐式定义。一般来说,脚本缺乏清晰的结构并且难以推理。最重要的是,比特币脚本本身甚至无法表达乘法或连接等基本操作。这些障碍使得我们很难自由地编码花费条件。

Miniscript通过强制脚本类似于树形结构来改进比特币脚本的核心功能。有了这个需求,我们将一些小的、运行良好的脚本包括进来,这些脚本对密钥、散列或时间锁进行编码,同时排除了负责其他事情的奇怪的脚本。因为Miniscript最终是有一个结构的比特币脚本,你现在可以在没有软分叉的情况下使用它。不过只有想要使用这种结构的钱包和软件需要添加对其的支持。

挑战极限

我们如何才能在保留Miniscript有用的属性的同时做更多的事情?我们如何在保持系统结构的同时使系统更强大?这些想法将我们引向Simplicity,这是一种全新的区块链语言,从头开始作为比特币脚本的替代品设计。

Simplicity程序是树形的:根节点代表整个程序,而每个节点执行部分计算。具体来说,父节点可以访问其子节点的计算并根据某种函数聚合它们的结果。这从叶节点开始,叶节点会返回公钥或见证数据等常量。聚合从下到上持续进行,直到在根节点计算出总体结果。


这是与上面的比特币脚本相匹配的Simplicity程序的草图。请注意它的结构等同于Miniscript树结构。Real Simplicity程序更详细(and, or, keyolder由更小的程序片段组成,称为组合器),但如果我们将其缩小,Simplicity和Miniscript看起来很相似。

Simplicity足以计算任意布尔函数。这些中的每一个都可以被认为是一项支出条件,一个接受或拒绝见证人的功能。Simplicity可以做契约、授权、零知识证明等等。这种表达能力似乎令人望而生畏,但我们可以检查程序的正确性。Simplicity具有明确的语义,因此可以很清楚程序的作用。不会有令人讨厌的意外。同样的,树形结构使得静态分析和属性证明变得容易。我们可以表明给定的程序执行起来很便宜,并且它正确地编码了给定的支出条件。我们拥有与Miniscript相同的工具包,但适用于更大的程序集。

与Miniscript不同,Simplicity需要软分叉才能在比特币上使用。它将存在于比特币脚本 (Miniscript) 旁边的一种新型Taproot叶中。下一步我们会首先在Elements中实现Simplicity,液态网络就是是建立在这个开源平台之上的,这可以证明其在比特币方面的潜力。这也将为最终的语言设计提供参考。

不同语言间架起桥梁

我们正在Miniscript和Simplicity之间构建一个桥。 Miniscript树形结构在Simplicity中很容易复制,这样我们就可以将比特币脚本转换为Simplicity程序,Miniscript会成为Simplicity的子集。您可以从现有脚本生成程序,检查程序和脚本在语义上是否等价,然后改进您的程序以超越Miniscript可以表达的范围。对于那些熟悉Miniscript的人来说,可以快速进入Simplicity的世界。我们本系列的下一篇文章将更详细地描述这一桥接器。

一个树形的未来

像Miniscript这样的树形程序易于阅读和分析。一系列工具都适用于这些程序并能帮助我们追踪它们的表现。Simplicity保留了这些特性,并允许使用树进行任意计算。它比Miniscript更强大,但仍然表现良好,这要归功于它的结构。Miniscript的优点也体现在Simplicity上。这种语言可以享受树形结构的好处,同时仍然可以进行任意计算。

希望未来是树状的。我们正在一步一步的,使Simplicity成为现实。 通过桥将Miniscript转换为Simplicity是一个很好的入门方式。请继续关注有关如何自己使用桥接器的后续信息!

If you have specific preferences, please, mark the topic(s) you would like to read: