比特币用户将会享受到一种名为Taproot的技术
扫描二维码
随时随地手机看文章
在不久的将来,比特币用户可能会享受到一种名为“Taproot”的技术。该技术最早由比特币核心开发者兼Blockstream前CTO Gregory Maxwell提出,它将扩展比特币的智能合约灵活性,同时提供更好隐私保护。在区块链领域,即使是最复杂的智能合约,也很难跟常规区分开来。
尽管这是一项非常大的工程,但它不仅仅是理论,是能够实现的。包括Pieter Wuille、Anthony Towns、Johnson Lau、Jonas Nick、Andrew Poelstra、Tim Ruffing、Rusty Russell以及Gregory Maxwell在内的几位最高产的比特币代码贡献者正在研究一种被称为Schnorr签名的方案,该方案还包含了Taproot,据悉,这些升级内容都会在下一次协议更新中呈现。
本文将介绍Taproot是什么以及它的工作原理。
P2SH
所有比特币本质上都被“锁定”在脚本中:区块链中的交易中可以嵌入几行代码,定义在下一个交易中如何使用这些比特币。花费这些比特币的条件通常包括提供签名来证明所有权。但是还可以设置其他一些条件,例如TImelocks(这部分比特币只能在特定区块高度或日期之后才能被使用)或mulTIsig(多重签名,需要在一组私钥中的多数私钥提供签名的情况下才能被使用)。
还可以混合和选择设置不同的条件,创建类型复杂的智能合约。举个例子,如果Alice和Bob都签名、或者在一周后Alice单独签名、或者Bob单独签名同时提供一个密码,就可以使用这些比特币。满足这三个条件中的任何一个,都是这部分比特币的使用方式。
自2012年以来,一开始脚本 (条件) 通常是不公开可见的;只有这些比特币的新主人知道如何使用它们。这是通过一种名为P2SH (向脚本哈希支付) 的技术实现的,最初只有脚本的哈希值被包含在区块链中。这串看似随机打乱的数字实际上包含着一部分比特币。当所有者使用时,他会同时展示整个脚本以及脚本的“解决方案”。然后,任何人都可以使用初始哈希来检查所提供的脚本是否确实是锁定比特币的原始脚本,并且可以立即得出满足脚本的执行结论。
然而,当比特币被花掉时,目前必须表明所有满足要求所需的条件——包括尚未满足的条件。这有两个主要的缺点。第一,数据量很大,尤其是条件很多的情况下。其次,这不利于隐私。所有人都可以知道这笔资金用了什么方式使用,例如,会揭露出使用了哪种钱包甚至更多的信息。
MAST
为解决这两个缺点,开发者们提出了一种使用默克尔树的解决方案:MAST(默克尔化抽象语法树)。简而言之,所有的资金使用条件都被单独进行哈希处理(而不是组合成单个哈希值),并包含在一棵默克尔树中,最终生成单个哈希值:默克尔根,以这个默克尔根来“锁定”比特币。
这么做的好处是,如果需要展示默克尔树中的任何数据,都可使用默克尔根和一些附加数据(默克尔路径)来验证特定数据是否被包含在默克尔树中。其余的默克尔树信息仍然是哈希密文状态的。
有了MAST,意味着只需要揭示出特定的满足条件。如果在上面的例子中,Alice在一周之后使用了这些资金,她只需要揭示这个条件(以及默克尔路径)。没人知道这笔钱具体是怎样花的,可能是Alice和Bob一起花的,也可能是Bob一个人花的。这使得MAST比复杂的P2SH智能合约在数据处理上更有效率,同时还增加了隐私性。
然而,在使用 Schnorr签名的情况下,Taproot可以做得更好:因为MAST结构可以隐藏在一笔交易当中。
Schnorr签名
Schnorr签名方案长期以来一直受到许多比特币开发者的青睐,目前还在开发阶段,它将会通过软分叉协议升级进行部署。许多密码学家都认为Schnorr签名方案是这一领域中的最佳方案,因为其数学特性提供了很强的正确性,不仅不受延展性影响,而且验证速度相对较快。
在比特币领域,Schnorr签名最显著的优点是其“线性数学”(linear math),它支持签名聚合:同一笔交易中的多个签名可以合并为一个签名。类似的方法也可以应用于多签交易。将公钥和签名组合到“阈值公钥”和“阈值签名”中,可以使多签交易与常规交易变得无法区分。
这种签名方案还有更多有趣的使用方式。例如,可以使用其他数据来“调整”私钥和公钥。举一个简化的例子,可以通过将私钥及其对应的公钥都乘以2来作为新的公私钥。“私钥x 2”和“公钥x 2”仍然对应,“私钥x 2”仍然可以对使用“公钥x 2”验证的信息进行签名。任何不知道原始密钥对被调整了的人,甚至都看不出有什么差异;这些调整过的密钥看起来和其他的密钥对是一样的。
这就衍生出了TapRoot。
Taproot
Taproot基于一种有趣的认知:无论多么复杂,几乎所有MAST结构都可以(或应该)包含一种条件:允许所有参与者就结果达成一致并一起签署结算交易。在前面的例子中,如果Bob知道Alice可以在下周独自动用所有资金,那么他最好现在就跟她一起签字。 (在许多典型的智能合约设置中,如果他不这样做,他甚至会受到惩罚。复杂性实际上只是为了让每个人都诚实。)
Taproot类似于MAST,并且通常允许所有参与者可以合作来花费这笔资金,即“合作终止合约”。
而通过使用Schnorr签名,它会变得非常有趣。
首先,合作终止合约将利用Schnorr签名的阈值方法,让它看起来像一笔普通交易。因此,所有参与者的公钥会叠加生成“阈值公钥”。与该阈值公钥相对应的是,所有参与者签名的组合——他们的“阈值签名”——允许他们花费这些资金。
但他们唯一能做的就是把这笔资金当作一笔普通交易来使用——目前还没有类似MAST的结构。这就是Schnorr签名的另一个作用。
所有可选择的资金使用方式(非合作结算)都会被合并到不同的脚本中。然后,对这个脚本进行哈希处理,并使用它来调整阈值公钥。与前面示例中使用的“公钥x 2”不同,这将产生“阈值公钥x脚本”(尚在简化当中)。当然,这个“阈值公钥x脚本”对应于“阈值签名x脚本”。
现在,如果资金是合作使用的,所有参与者都将他们的签名组合成“阈值签名”,并用脚本对其进行调整。产生的“阈值签名x脚本”允许他们使用这笔资金。然而,重要的是,对于外人而言,所有的这些看起来仍然像一个普通的公钥和一个常规的签名,即一笔常规的交易。
只有在合作终止合约被证明是不可能的情况下,其他人才会知道这是阈值公钥:它是经过调整的。
在这种情况下,原始阈值公钥和脚本将会被展示出来(因为剩余参与者仍然希望能动用这笔资金)。这证明“阈值公钥X脚本”是用这个特定脚本进行调整的。因此,就像P2SH中的哈希值一样,这种调整向全世界证明了,如果满足脚本中指定的其他条件,资金就应该是可花费的。
或者,与其用脚本调整阈值公钥,倒不如用默克尔树的根值来调整阈值公钥,默克尔树的根值包含所有不同的可以使用资金的条件:MAST结构。那么,要使用这些资金,只需要披露已经满足的支出条件。
因此,Taproot能够提供MAST的所有好处,而在正常情况下,没有人会知道一笔常规交易背后隐藏了如此复杂的智能合约。