声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者& # 039;s的观点,不是火星财经的官方立场。
边肖:记得要集中注意力。
投资区块链,戳:火星财经App下载
来源:洒脱
译者:今天,由于比特币脚本的存在,比特币可以实现简单的交易功能和各种多重签名、原子交换、闪电网络交易。然而,剧本& # 039;s函数不是唯一的,但是它的复杂性限制了更多应用的可能性。Miniscript的目的是让比特币脚本更易访问,最终解锁比特币的更多应用。
对此,Pieter Wuille和Andrew Poelstra撰写了一篇文章《Miniscript: Streamlined Bitcoin Scripting》,阐述了Miniscript的起源和功能以及未来的发展方向。
以下是翻译:
(图片来自blockstream)
比特币脚本简介比特币一直有一个机制,可以通过更复杂的策略(不仅仅是一个单键)让硬币变得可消费:这就是脚本系统。虽然脚本主要用于单键支付,但它也是各种多签名钱包、原子交换结构和闪电网络的基础。
但是,这些并不是脚本可以实现的全部功能。脚本可以用来表达发布事务所需的复杂条件,比如(A,B,C中的两个)和(D或(E,F)),其中A-F分别代表唯一键,以及哈希图像检查,timelock和一些更奇特的构造。
比特币脚本的问题:它& # 039;这很难证实,但我们可以。不能充分利用比特币脚本的潜力。原因之一是它& # 039;为复杂的任务构建脚本很麻烦:it & # 039很难验证它们的正确性和安全性,甚至很难找到最经济的方式来编写它们。
这是问题的一部分:即使你知道正确的脚本,设计应用程序和协议来协商和构建事务,每次你设计一个新的结构,你都需要大量额外的开发工作。每次添加都需要更多的工程资源来满足分析和质量保证。
如果比特币应用可以使用任何脚本,而不仅仅是几种脚本设计,会怎么样?我们将不再局限于一次性的设计,我们可以根据用户指定的需求开始设计应用程序。钱包开发者还可以引入更多基于脚本的选项,同时保持与其他钱包的互操作性。
什么是Miniscript?让& # 039;让我们进入Miniscript的世界,这是一种以结构化方式表示比特币脚本的语言。它支持高效的分析、综合、通用签名等功能。
比特币脚本的一个例子:
op _ check SIG op _ if dupop _ notif op _ dupop _ hash 160 hash 160(b)op _ equal verify op _ check SIG verify op _ CSV op _ endif其中a和b表示公钥,转换成Miniscript的表示为:
OR _ D (C: PK (A),AND _ V (VC: PK _ H (B),older (144))的例子清楚地表明,当144块之后的A签名或B签名出现时,脚本的语义允许付款。大多数有意义的脚本都可以用这种方式编写。使脚本可读只是Miniscript的特点之一,其主要目的是实现脚本的自动推理,如下面的应用实例所示。
MINI的应用。目前,我们很难使用比特币脚本来构建复杂的支出条件,这需要为每个新的用例开发、测试和部署专用软件。Miniscript可以涵盖任何一组支出条件,并且通常比专用解决方案更简单、更可靠。
1.应用和优化脚本
其中一个例子是为一组给定的支出条件找到最佳脚本。在比特币脚本中,有许多不同的方式来签名,描述连接或分离,或实现阈值。即使是经验丰富的比特币脚本开发者,正确的选择也可能取决于满足不同条件的相对概率,很难计算。我们的在线编译器可以立即找到与给定支出策略相对应的最佳Miniscript。
中介绍的示例可通过以下编译策略获得:
或者(99 @ pk (a),1 @ and (pk (b),older (144))这是一种写法,即左边签名A的概率是99%,而右边签名B的概率(144块以后)是1%。
2.日用开支
一旦找到有效的脚本,使用许多脚本的一个常见障碍是不同支出机制之间缺乏互操作性。但是,希望实现长期timelock或复杂的多重签名需求的用户可能会对此感到担心。Miniscript通过直接表达支出条件,允许表达任何策略,因此任何人都可以:
计算脚本的相关地址;确定在给定时间哪些签名者是签名所必需的或足够的;给定足够的签名集,生成有效的交易;用户不& # 039;不必担心是否所有的参与者都在使用兼容的软件,而且他们也没有& # 039;当需要这样的时间锁设置时,不必担心这些软件会继续存在。他们也不& # 039;他们不必担心他们的需求可能会以与签名软件不兼容的方式改变,从而确保比特币脚本的使用不会限制他们。
3.申请,储量证明
与签名问题相关的是证明储备的问题,这是一个公司证明自己可以使用部分储备比特币而不实际使用的过程。目前有一些这方面的工具,比如Blockstream & # 039s储备证明工具,但业内没有通用标准。没有Miniscript,可能就没有一个可以覆盖当前多样化托管解决方案的储量证明标准。
支出策略的构成Let & # 039让我们看一个受互操作性要求约束的比特币脚本开发人员的具体例子。以托管大量BTC的公司为例。该公司希望这些比特币只能在大多数董事同意的情况下被动使用。然而,一些独立董事希望使用自己现有的钱包软件和硬件,而不想参与单密钥签名的方案(这要求他们使用特殊的应用程序)。
如果没有Miniscript,生成包含所有签名者的脚本将是一个无法克服的问题& # 039;要求,同时向所有签名者保证完整的脚本是健全的和完整的,并且他们的钱包软件与结果兼容。
有了Miniscript,这些主管只需在他们的钱包软件中编写策略,构建一个描述阈值要求的策略,然后将其编译到Miniscript中。他们可以直接验证编译器的输出是否与原策略匹配,原策略是否符合所有人& # 039;的需求。然后,他们可以使用任何与Miniscript兼容的软件来计算接收货币的地址,在消费时收集签名,并将这些签名组合成一个有效的交易。
举一个简单的假设性例子:一家公司正在存储带有自定义多重签名的钱包。它有两个控制器,其中一个使用Blockstream Green wallet(配置为2-of-2多重签名,经过一些延迟后变为1-of-2),另一个使用Electrum wallet(标准1-of-1)。如果没有允许结合安全和可互操作的脚本策略的工具,使用绿色钱包的董事就不可能将他们的策略添加到公司& # 039;的多重签名方案参与者& quot。如果格林和软件都用来建立公司& # 039;s的多签名支持Miniscript,那么两位导演甚至不知道钱包底部的脚本是什么,就可以直接使用自己喜欢的钱包。
我们可以找到一个具体的例子来说明动态联盟(dynamic federation) Miniscript在块流的液体侧链中的作用。Blockstream(内部称为动态联盟)目前正在开发的一个功能,这是一个脚本,允许现有的流动成员管理新成员,以添加或更新控制联盟管理的比特币的可用性。Miniscript为联盟成员提供了快速高效地构建此类脚本的工具(事实上,Miniscript编译器找到了现有Liquid脚本的22字节较短版本,与我们最初的手动优化脚本相比,节省了5%的工作量)。但更重要的是,Miniscript允许成员自动验证建议脚本的重要属性,从而减少成员之间相互协调或对建议脚本执行昂贵的手动安全审核的需要。
特别是,成员可以自动验证任何脚本提案是否包括:
他们自己的钥匙;一个时间锁紧急支出条件,以确保它是正确的和足够远的未来。也可以让他们验证新联盟的参与者是否有能力花掉旧联盟控制的钱。这种检查是必不可少的,以确保这种转换不会导致硬币的丢失,即使对于在转换期间将硬币转移到系统的用户来说也是如此,如果没有Miniscript,这几乎是不可能的。
迷你脚本的历史
Miniscript的想法最早可以追溯到2018年夏天。当年7月中旬,Pieter Wuille推出了比特币核心的输出描述符方案(output descriptor scheme),这是一种描述核心支持的许多不同地址类型的通用方法。与此同时,时任Blockstream实习开发者的安迪周(Andy Chow)正在开发部分签名的比特币交易(PSBT,也称为BIP 174)方案,这是一个钱包互操作协议,这一提案在钱包领域获得了广泛关注。
PSBT的一个重要部分是终结器,它是从PSBT中包含的签名者数据集中组装实际比特币交易的参与者。这种程序集需要知道令人满意的脚本,这意味着支持PSBT的钱包必须实现自己的专用终结器,这需要额外的开发,并将限制互操作性。
当时,Andrew Poelstra正试图将PSBT实现引入到rust版本的比特币(Rust编程语言编写的通用比特币库)软件中(该实现最初由Carl Dong提出)。在IRC通信频道上观察到的Poelstra:
"如果你有一个高度结构化的脚本模板,你不& # 039;我不再需要真正理解剧本了。"
正是这种想法最终成为了Miniscript的核心。事实上,Poelstra和Wuille一直在从事一个与主机相关的项目,但由于缺乏可用于复杂多玩家脚本的标准工具,他们感到非常沮丧。两人于2018年8月见面讨论此事。Wuille建议实施这些& quot高度结构化的脚本模板& quot作为比特币核心输出描述符的扩展。
随着扩展的形成,它演变成比特币脚本的结构化子集,最终成为Miniscript,以及一个更简单的& quot策略语言& quot直接表达支出情况,可以编制成Miniscript。2019年1月,Wuille在斯坦福区块链大会上展示了这一计划的初步成果。
今年5月,Sanket Kanjalkar加入Blockstream进行为期三个月的实习,其工作重点是实现Miniscript工具,并帮助其与比特币核心进行整合。在他的帮助下,MiniScript变得更小,更高效,更容易分析,更好地防止了可扩展性问题。
经过这些迭代工作,今天& # 039;s Miniscript最终形成。
相关的Miniscript基于比特币生态系统中的许多其他项目,并对其进行补充。特别是如上所述,Miniscript扩展了比特币核心的钱包输出描述符,补充了PSBT,实现了完全通用的更新器和整理器。
Miniscript可以与Ivy相比,Ivy是另一种旨在使比特币脚本的高级功能易于访问的语言。但是,与Ivy相比,Miniscript是脚本(子集)的直接表示,这意味着& quot迷你脚本& quot可以有效验证。Mini还可以接受很多其他形式的静态分析,这是MiniScript和Ivy都做不到的。
迷你& # 039;的战略语言类似于Ivy & # 039s,因为两者都是抽象的,都必须编译后才能在区块链上使用。但是,Miniscript的策略语言在结构上与Miniscript本身非常相似,因此可以很容易地验证编译器是否& # 039;的输出匹配编译器& # 039;s输入(其实这个甚至可以手动检查),以及是否符合用户& # 039;美国的期望很容易被证实。
另一种与Miniscript相关的区块链语言是块流的简洁性。级别Miniscript,Simplicity是一种低级语言,它被设计为直接嵌入区块链事务中。此外,Simplicity还支持许多形式的静态分析。这些分析在部署区块链合约时非常重要,但在以太坊EVM等替代产品中很难甚至不可能实现。
此外,Miniscript不像simplicity那样强大来表示任何可计算的函数,它的范围非常有限:它可以表示签名需求、timelock、hash preimage以及它们的任意组合。这种范围的缩小使Miniscript更容易解释它所覆盖的用例,更重要的是,它允许它在现有的比特币区块链上工作。相比之下,简单是完全背离比特币脚本的,比特币脚本还处于发展初期。
未来工作及结论在设计Miniscript的时候,我们就着手让比特币脚本更易访问。虽然很多工作都集中在调查和提出未来对脚本和比特币共识规则的修改,以增加额外的功能,但我们也看到基础设施没有& # 039;甚至不能以通用的、安全的、可组合的和可互操作的方式使用现有的功能,这是目前所缺乏的。
这项工作还没有完全完成。我们有两个Miniscript实现(分别是C和Rust版本)和策略编译器,但是为了使这项技术易于使用,我们需要将它集成到通用软件中。通过实现兼容Miniscript (updater和finalizer)的PSBT,即使没有明确的支持,很多PSBT签名者(包括基于硬件钱包的)都可以用于复杂的脚本。另外编译器也可以改进,因为在策略到脚本的转换上还有很多优化没有考虑到。
一路上,我们学到了很多东西:
脚本资源约束使策略优化变得复杂:大量共识和标准强加的资源约束(最大操作码、最大脚本大小、最大堆栈大小……)的存在,使得我们一旦接近这些约束,就很难找到给定策略的最佳脚本。这很有趣,因为它可以为未来的脚本改进提供建议。与此相关的是,我们还惊讶地得知,比特币共识规则居然将OP_CHECKMULTISIG(VERIFY)参与执行的键数计算为每个脚本201个非推送)操作码的限制。可变的见证大小使成本估计变得复杂:简单支付和多重签名结构具有独立于现有密钥的确切集合的见证大小。但是一旦我们转向更复杂的脚本,见证大小将变得更大,这可能会使成本估计变得复杂。特定事务输出的潜在签名者可能需要乐观地猜测要采用的廉价路径,并构造相应的事务。如果该路径的所有键或散列最终都不可用,则可能需要更改事务本身,以考虑增加的成本。segwit的堆栈编码使优化变得复杂:Segwit的输入堆栈不再编码为脚本,而是直接编码为堆栈元素的列表。这有一个不幸的副作用,就是改变了& quottrue & quot从1字节到2字节。因此,Miniscript需要关注哪些子表达式进入if/else/endif结构的哪一侧。可伸缩性:由于segwit,事务可伸缩性不再是协议正确性的破坏者,但仍可能产生不利影响(如广播事务时收费率的不确定性、减缓紧凑块的传播以及干扰散列锁作为全局发布机制的使用)。基于这些原因,我们在设计Miniscript时,考虑了不可扩展的问题,学习了验证内容不可扩展的推理(证人)。为了实现这一点,Miniscript依赖于一些特定于segwit的规则。很难消除常见的子表达式:尽管做了很多尝试,Miniscript仍然不支持优化重复的子表达式。虽然在某些特定情况下这是可能的,但在一般脚本中似乎很难做到。添加一些堆栈操作操作码可能会改变这种情况。