时间:2021-12-01|浏览:454
比特币的 Taproot 软分叉升级将提高比特币块的高度 709632 处(预计是 2021 年 11 月 15 日本)激活。这次升级包含了很多重要而精彩的内容,但在中国世界却缺乏足够的重视。本文将从技术角度简要介绍 Taproot 升级内容,反映比特币的发展方向。常见的说法是,Taproot 提高比特币的隐私性、智能合同的功能性、同质性。但是,我想理解 Taproot 要升级内容和想象空间,首先要了解一些比特币。
比特币上的智能合同
很多人不明白的是,比特币也支持智能编程合同 2.但它的智能合同类型不同于其他区块链(如以太网)。详细解释这种差异需要一篇特殊的文章,这在这篇文章中并不重要。这里只介绍几个常见的比特币智能合同编程模块 方便大家了解其应用场景:
多签合同。比特币支持多签名授权资金:在 N 在记录良好的公钥中,必须有 M 公钥对应的私钥(对于同一操作)签名,资金可以使用。比特币支持最多 15 多签名公钥合同。时间锁。用户可以使用两种类型的时间锁来规定一笔资金的可用时间:(1)CLTV绝对时间锁,以特定的时间或特定的块高度来定义,过了这段时间才能使用;(2)CSV,相对时间锁,例如生成资金的交易链 1000 一块之后,这笔资金就可以动用了。
多条件编程 “IF ... ELSE ...” 公式语句,为同一资金设定多个解锁条件,满足任何条件即可使用该资金。A 公钥对应的私钥可以解锁,或者在块高度 XXXX 以后,B 公钥对应的私钥可以解锁,或者在交易中链接 YYYY 块之后,A、B、C 三个公钥中任意两个对应的私钥都可以解锁。
比如读者可以想象,这些模块看起来很简单,但是组合起来的可能性很大:多签合同定义了不同主体的权限,可以适应非常丰富的应用场景,从公司运营到家庭金库;时间锁规定了不同主体在不同时间段的权限。多条件显著放大了这些权限控制的组合效果。你甚至可以根据几个条件做一个支持社会恢复和有遗产分配效果的合同:我(A 公钥)可以控制这笔资金。如果三个月没有人使用,我(B 公钥)和四个朋友,五个可以一起控制资金;如果一年没人用,我老婆可以控制资金。
但是,这些合约要实际上派上用场,两个因素就不能忽视:效率性和隐私性。效率性的意思是,比特币交易的手续费是根据交易的体积来计算的,更多条件的脚本会占用更大的空间(以字节数计),交易费也会更高。隐私性的考量是,脚本曝光会使其他人知道某些公钥之间是有身份关联的,更容易分析出公钥主人的真实身份。
目前,比特币合同体现在 P2SH 地址(其实是哈希值)。其特点是生成合同时,脚本可以不公开,必要时直接支付脚本的哈希值;但这些资金花费时,与这个哈希值对应的脚本会完全公开,放入交易中(否则无法验证这个脚本的哈希值就是这个哈希值)。以多签合同为例,其他人可以直接支付这个多签合同脚本的哈希值。但是,当多签合同的参与者想要使用这些资金时,他们必须公开整个脚本 3。
此外,在 SegWit 升级前,单独签名的个人钱包和合同钱包是截然不同的,前者是 P2PKH 地址,后者是 P2SH 地址,能从地址中看出,这是另一个不利于隐私的因素。 SegWit 升级后,还可以采用支持隔离见证的个人钱包 P2SH 原生隔离见证地址(P2WPKH)和合约地址(P2WSH)仍然是泾渭分明的 4。
了解了这些之后,我们来看看 Taproot 三大部分升级(MAST、Schnorr 签名、Taproot如何做得更好?默克尔抽象语法树(MAST()默克尔抽象语法树(Merklized Abstract Syntax Trees,MAST)5 这意味着支持在比特币脚本验证中验证默克尔证据。
默克尔树是一种将多个数据元素哈希成一个哈希值的密码学方法。它的结构和哈希函数的特点决定了它可以提供一些证据(哈希值)来证明某个数据元素参与生成这个哈希值。我们不断哈希(相邻)数据元素,最终生成默克尔根。Individual Merkle proofs for Banana,Peach and Kumquat聪明的读者一定想到,有了这个功能,合同的作者可以把多个条件分成不同的数据元素,哈希一个默克尔根值;当比特币需要在一定条件下解锁时,只需要证明这个条件在这棵默克尔树上,不需要披露所有其他条件。
是的,这正是 MAST 的妙用。如下图所示,这笔资金的解锁条件有两个,而编写者把它们分割了开来,用默克尔树抽象成了一个哈希值,在以任一个条件解锁使用时,都不需要公开另一个。MAST 在 P2SH 在此基础上迈出了一大步,其提高效果首先体现在隐私性上:原本在 P2SH 在合同的使用中,所有的脚本内容都必须公开,无论那些内容是否使用,都必须公开;现在,有了 MAST,用户就只需要公开需要用到的解锁条件,无需公开全部内容了;同时,别人也根本不知道你还有多少个条件。
其次,它的效率也有所提高:用户只需要提供一些需要使用的脚本和默克尔证据。当整个脚本比较大的时候,这个体积节约的效果会非常明显。因此,未来的比特币用户可以编写条件非常多的合同,获得更好的控制效果,只需要支付更少的手续费;甚至可以故意包含一些垃圾条件来丰富默克尔树,获得隐私改善的效果。
事实上,比特币的脚本都围绕着资金的控制。实现这种控制的关键环节是多条件,而且有 MAST即使是很多条件的资产管理脚本,也可以压缩成哈希值,使用时只需要暴露一部分。降低成本可以打开很多可能性,等待钱包开发者去了解。Taproot 升级后,比特币不仅支持基于椭圆曲线的密码学签名,还支持 Schnorr 数字签名方案 6。
Schnorr 这里不提签名的结构方法。我们只介绍它的重要属性:签名/密钥 聚合 —— 多个私钥的签名可以聚合成一个签名,看起来像是一个私钥签名。签名时仍由私钥持有者签名;签名验证时,似乎这些签名是对应已知公钥(当然是这些参与者的公钥聚合而成的公钥)的私钥签名。
也就是说,有了 Schnorr 签名,别人分不清一个签名是单人签名还是多人签名;多签名的解锁条件可以用聚合公钥代替。 n-n 可以享受多签名合同 Schnorr 签名提供的隐私保护。它最明显的应用是闪电网络通道,因为闪电网络通道是一个 2-2 多签合同;从那以后,其他人就不能用签名的数量来区分支付渠道和个人用户。
至于 m-n 多签合同,不用担心,别忘了我们有 MAST:我们可以把所有可能解锁的情况都变成一个分支。使用某个分支时,提供的签名只需要聚合签名。例如,假设我们想做一个 2-3 多签名合同,公钥 A、B、C 中三取其次,这个多签合同的效果相当于 “要么(A、B解锁,要么()B、C解锁,要么()A、C)解锁,可以理解为多条件脚本,每个条件都是一个 2-2 多签名,所以用相应的聚合公钥定义解锁条件(不需要用多签名定义)。因此,当我们需要用某种组合解锁资金时,我们只需要 MAST 暴露一个分支,提供一个签名,别人还是不知道是一个人,两个人,还是多个人。
探索