比特币提供了世界上第一种智能合约编程语言。脚本称为这种语言,它使用户可以编码可以使用硬币的不同条件。但是,尽管这是一个革命性的概念,但使用起来并不容易,尤其是对于更复杂的支出条件而言。编写复杂的合同以及验证合同是否按预期进行都容易发生人为错误。但是,尤其是在资金紧张的情况下,正确解释条件至关重要.

在过去的一年中,区块链工程师Andrew Poelstra,Pieter Wuille和Sanket Kanjalkar着手改善这一点。通过将Script精简为基本要素,他们的“新”编程语言-“文字稿” —消除了复杂性,应该使参与其中的每个人都可以更轻松,更安全地进行比特币编程.

“从理论上讲,Miniscript比脚本更具限制性,” Blockstream研究总监兼Miniscript联合设计师Andrew Poelstra告诉《比特币杂志》。 “但是它可以完成人们实际使用脚本的所有工作。”

脚本

让我们从头开始.

每个比特币交易都包括两个主要部分:输入和输出,这两个部分都由代码段组成。输入“解锁”硬币,输出再次“锁定”硬币,指定在何种条件下可以在后续交易输入中将其解锁。此类要求通常包括有效的密码签名,但还有更多的可能性。例如,在花费硬币之前可能已经经过了一定的时间,或者必须包含特定的秘密号码.

交易中的此代码是使用Script创建的,Script是专门为比特币设计的编程语言。脚本的灵感来自于Forth,这是一种1960年代发明的编程语言,最初是为操作射电望远镜而设计的。脚本进行了调整,但是使其更适合比特币.

例如,脚本没有使“循环”产生的操作码(指令):该语言不支持无限制次数地执行相同的计算。在比特币中,无需执行无数次相同的计算,因为比特币节点实际上并不计算交易,而是验证交易。 (有关为何会出现这种情况的更多技术说明,请参见 这个帖子 由Blockstream工程师Russell O’Connor设计。)

脚本也是“未键入的”。这意味着可以用不同的方式来解释和使用计算结果。例如,有效签名的结果可以为“ true”,但可以将“ true”依次解释并用作数字“ 1”,然后在数学方程式中使用:“ true”加“ true”将添加最多为“ 2”,例如,如果需要最少两个有效签名,则意味着提供了足够的签名.

在本文中,这将我们带到了Script最重要的属性:很难“关于的原因.实质上,这意味着可以用多种方式来解释计算结果。例如,即使签名无效,也可以编写脚本,以使事务由于某些其他原因仍然有效.

Poelstra解释说:“比特币脚本中有一些操作码确实很荒唐。” “就像,将签名解释为真/假值,在其上分支;将该布尔值转换为数字,然后索引到堆栈中,然后根据该数字重新排列堆栈。而如何做到这一点的具体规则实在是太疯狂了。”

这可能会使Script难以使用。特别是如果花费(“解锁”)硬币的要求变得更加复杂,则交易的作者可能会无意中在代码中包含某些内容,以使硬币可以在与预期不同的条件下花费。相反,交易的接收者可能没有注意到这种怪癖,而将硬币丢给了确实注意到这一点的攻击者.

问题的具体示例

这是这些问题如何限制Script有用性的具体示例.

Blockstream Green钱包具有标准的“共同签名”设置。钱包用户控制两个键之一,而Blockstream控制另一个键。资金可以两种方式使用。首先,每当用户想要花费硬币时,他们就签署交易并要求Blockstream也对其进行签署。 Blockstream通常会这样做,尽管这可能需要用户通过诸如电子邮件确认之类的辅助手段来确认他们确实要进行交易。但是,Blockstream的一端可能出了点问题–也许公司消失了或丢失了密钥,或者由于其他原因而无法签名。在那种情况下,用户仍然可以使用备用解决方案来花费其比特币:在时间锁定到期后,他们可以在经过预定时间后创建有效交易。大概一个月.

这可以正常工作,但也有一定的局限性。即使他们可能想在设置结束时增加更多的灵活性,用户也无法再利用比特币的智能合约潜力.

Poelstra说:“目前,Green具有适用于所有客户的固定脚本,它基本上只是一个简单的多重签名。” “但实际上,我们不应该在乎脚本说的是什么。我们关心的是:在超时之前,没有我们的签名就不可能花掉硬币吗?如果用户想与我们一起使用一些疯狂的策略,只要满足我们关心的一个条件,我们就应该能够支持它。”

例如,用户可能希望在一年过去后允许亲人去世,以防他们去世。或者,也许用户实际上是一家公司,并且它想创建一个多重签名设置,其中三分之二的董事会成员可以一起花费硬币(与Blockstream结合使用).

当前,从技术上讲,这可以通过比特币脚本实现。但是,这将需要用户设计自定义设置,而Blockstream将需要参与此自定义设置.

Poelstra解释说:“但是,如果用户给我们一个任意脚本,我们就无法判断我们关心的一个条件是否得到满足,因为所有脚本行为的总和确实很复杂。” “例如,如果脚本似乎带有签名,我们需要考虑如果用户提供非签名会发生什么。可以欺骗硬币花掉吗?”

文字稿

在过去的一年中,Miniscript由Poelstra,Blockstream核心技术工程师Pieter Wuille和Blockstream实习生Sanket Kanjalkar设计。 (但是,Miniscript并不是正式的Blockstream产品。)

简而言之,Miniscript是Script的“精简版”版本:“ Script工具包”中的“工具”选项,使人们更易于使用和验证。精心选择了这些工具以启用几乎可以使用Script进行的任何操作-只有一些附带的例外情况,实际上没有人真正使用过这些例外情况。因此,尽管一行Miniscript仍然是有效的Script行,但它通过防止代码的意外(可能是意外的)结果而从本质上避免了人为错误.

以上述问题为例,使用Miniscript,用户可以轻松地设计设置,使Blockstream可以轻松检查其一个条件是否得到满足。具体来说,Blockstream可以看到,只有在签署或一个月过去之后,这笔资金才能被使用-不管用户设置的结尾是否包括其他条件,无论是额外的时间锁定,多重签名还是其他。使用Miniscript,不会有任何意外的怪癖会超越Blockstream的终结.

Miniscript非常直接且可预测,实际上,设置总是可以变成决策树:设置的可视化(“图形编码”),这很容易推理.

例如,下面的可视化显示了一种设置,其中三分之二的用户需要签名才能移动硬币。作为备用选项,可以使用紧急钥匙来移动硬币,但必须经过一段时间后才能移动.

缩图的可视化

[作者注:感谢Tejaswi Nadahalli的贡献 指出 早期的可视化描述不正确。]

“使用Miniscript,Blockstream可以轻松参与更复杂的设置-我们将脚本解码成一棵树,然后检查树的每个叶子,并询问(a)该叶子上是否存在超时条件?”或(b)此叶子需要我们的签名之一吗?”珀尔斯特拉说.

如果两个问题的答案都是肯定的,那么Blockstream可以参加.

使用中的标语

虽然Miniscript尚在开发中,但它的早期版本已经发布并可以使用.

为了使编写Miniscript的过程更加容易,Wuille还设计了一种“政策语言”。策略语言实际上就像是自己的编程语言。在对可以使用该策略语言使用硬币的条件进行编程之后,可以将其编译(“翻译”)成Miniscript,从而编译成有效脚本,以包含在比特币交易输出中.

此策略语言的一大附加好处是,根据脚本实际编码的内容,它可以自动编译为最佳,最有效的Miniscript版本。.

Poelstra说:“ Miniscript基本上是脚本……您可以使用很多不同的方式来编写’或’,或者您可以使用多种方式来编写’并且’,并且其中某些方式比其他方式更有效。” “策略语言只有一个’或’一个’和’等等,而Pieter [Wuille]编写了这个超级优化的编译器,它将为您将其转换为Miniscript,并以最佳方式进行。”

这不仅仅是一个理论上的概念。即使Miniscript的当前版本和编译器不是最终版本,Blockstream仍在内部将其用于Liquid侧链功能软件的开发分支。 (Poelstra指出,使用Wuille的优化编译器可将Blockstream节省22个字节,而其原始的“手动滚动”脚本则是这样。)Wuille为Miniscript编译器提供了策略语言的演示版,任何人都可以在其中使用。 http://bitcoin.sipa.be/miniscript/.