推出金色硬核(hardcore)栏目,为读者提供热门项目介绍或者深度解读。
正如我们在“
btc第三次减半全解读
”中所说,比特币在2020年值得关注的一个进展就是schnorr/taproot软分叉,计划的这次分叉将包含三个比特币改进协议bip 340、341和342。我们将对这三个bip进行系列解读,本期金色硬核(hardcore)解读bip340,主要是schnorr签名。enjoy it
2020年1月21日,开发者pieter wuille提交请求,要求比特币进行下一个软分叉升级。这一请求意味更多开发人员将检查代码。这对比特币而言意义重大,因为意味着这些协议整合进比特币协议中更进了一步。
这些升级被称为比特币改进协议bip340、341和342,其中包括schnorr签名,taproot和tapscript。
这三个bip,代表了迄今为止比特币最大的升级,也是两年前隔离见证(segwit)激活后的第一次升级。三个协议捆绑在一起升级,对比特币的功能、可扩展性和隐私性具有显著的改进。
这一次软分叉的激活方法正在讨论中。bip没有规定网络升级的确切方法。bip 340–342所述的升级最早可能在2020年冬季实施,当然可能需要更长的时间。
作为本系列的第一篇文章,我们将解释比特币交易的工作原理,介绍比特币使用的脚本系统,概述schnorr签名以及bip 340的优点。未来两篇文章将介绍taproot(bip 341)和tapscript(bip 342),请关注金色硬核。
比特币如何进行交易
比特币交易不是基于大家可能比较熟悉的如银行交易那样的账号余额形式进行的。
相反,比特币交易基于未花费交易输出(utxo),由输入和输出组成。每个utxo与一个私钥及交易数据相关联。当你进行比特币转账时,你是在转让utxo的所有权,你需要通过加密签名证明所有权。
utxo由比特币脚本标记,该脚本描述了花费策略,这些脚本包含了一笔交易的指令列表,说明某个比特币的新所有者如何使用它们。通过使用script编程语言,交易可以包含许多条件,其中包括多重签名(multi-sig)方案。
一笔交易的输入是utxo要花费掉的,而输出是交易创建的utxo。比如,当你创建新的比特币交易时,你将使用自己拥有的一组utxo,并提供证据证明你拥有这些比特币。要签署和授权交易,你需要提供与私钥相关联的数字签名,以证明你是所有者。
交易的输出包含两个元素:比特币数量和锁定脚本(或scriptpubkey),该脚本通过限定花费某些输出的条件来锁定比特币数量。锁定脚本会将输出锁定在特定的比特币地址,该地址将比特币的所有权转让给新的所有者。
新的所有者通过提供解锁脚本(或scriptsig)以及与其私钥相关联的签名来解锁输出,然后花费这些比特币。解锁脚本是下一笔交易输入的一部分。
为了确保你不会花费你不拥有的utxo,比特币客户端通过执行脚本来确认交易。每个输入中的解锁脚本与相应的锁定脚本一起执行,以查看是否满足花费条件。全节点跟踪并验证全部utxo集,从而确保每个人只能花费他们自己拥有的比特币。
举例来说明
下图说明了比特币交易的工作方式。
alice想付给bob 1个btc,为此,她使用bob的公共地址创建了一笔交易。为了转移比特币,alice提供了她的数字签名(由私钥和交易数据历史产生),以证明她在utxo集中拥有至少1个btc,同时没有泄露她的私钥。
比特币典型交易的可视化
t2t矿机参数作为交易的一部分,只有bob可以解锁锁定脚本。交易转账后,utxo便被转移,并将其添加到比特币区块链中。通过提供签名,bob可以解锁锁定脚本(或scriptpubkey),并且可以将utxo用作下一笔交易的输入。
比特币交易最常见也是最基本的形式是使用“付款至公钥哈希”(p2pkh)脚本。比特币的脚本语言使用命令(或函数)来确定每笔交易记录的指令以及更复杂的交易。它们被称为操作码(op_code),使我们能够设置某些条件来转移比特币的所有权。
例如,多重签名方案(简称multi-sig)可以指定5个参与者中必须有3个参与者提供签名才能花费比特币。另一个示例是时间锁(例如nlocktime)的使用,将比特币锁定到将来指定的某个时间点。
另一种高级的交易类型是支付到脚本哈希(p2sh),它允许付款方将资金转入到任意有效脚本的哈希中。p2sh的例子包括多重签名和非原生segwit交易。此外,可以组合几个花费条件来创建复杂的智能合约。
p2sh交易中的锁定脚本现在被“赎回脚本”(redeem script)替换。当比特币的所有者花费它们时,所有脚本都会显示出来,以及锁定比特币脚本的解决方案。使用区块链中脚本的哈希,任何人都可以检查花费这些比特币的脚本条件。
p2sh地址以“3”开头,而p2pkh地址以“1”开头。p2sh交易的一个缺点是它们会揭示多重签名中所有可能的条件和身份。
从上图比特币富豪排行榜中,我们可以轻松区分p2pkh和p2sh地址。上面“ 3”开头的地址被标识为多重签名地址(3-of-5和2-of-3)。以“ 3”开头的地址也可以是segwit脚本或lightning network客户端。以“ 1”开头的地址是p2pkh地址,并且未启用segwit。
一旦花掉比特币,p2sh交易会显示整个脚本,因此网络参与者可以发现满足他们条件的所有不同方式(从而可以区分多签名交易和p2pkh交易)。网络参与者也可以推断出使用了哪种钱包。
在可扩展性方面也有一个缺点:复杂的脚本具有更大的交易数据,需要在区块链上占有更多空间(导致更高的交易费用)。
schnorr签名(bip 340)
pieter wuille提出的三个bip中的第一个是bip 340,提出了针对比特币的、更有效的数字签名方案:schnorr签名。
huobi注册什么是schnorr签名?
正如前面关于比特币交易如何工作的部分所述,脚本语言控制着比特币的花费,并使用数字签名来转移比特币的所有权。比特币使用椭圆曲线数字签名算法(ecdsa)来验证加密签名(该算法不原生支持多签交易的,导致了2012年p2sh交易的标准化)。
简而言之,schnorr签名方案是一种更有效的签名方案。该签名方案是由claus-peter schnorr在1989年开发的,直到2008年专利才过期。
schnorr建立在“隔离见证”之上,该见证于2017年8月在比特币上激活,以解决可延展性(malleability)问题。segwit将所有脚本和签名数据移至“见证”部分。见证是交易的一部分,作为一个单独结构,不再包含在输入列表中。
让我们看一下schnorr的主要属性以及对比特币的好处。首先,我们看一下密钥聚合,它具有线性属性。
密钥聚合
schnorr的主要好处涉及多重签名交易。
schnorr签名是线性的,因为它们可以加或减。对公钥进行加法(或减法),等同于对应的签名的加法或减法。而ecdsa并不具有这个特性,加或减ecdsa的数字签名是没有意义的。
因为线性特性,schnorr可以密钥和签名聚合。聚合意味着我们可以将多个公钥组合为一个,因此所有方只需要一个签名。通过对输入的密钥求和,它们被汇总为一个签名,每个签名者贡献部分签名。
下面的方程式通过schnorr的线性特性说明了如何聚合。除了参与者之外,没有人知道在公共密钥/签名后面有三个人。
使用schnorr进行密钥/签名聚合
对于m-of-n多签交易,部分签名称为阈值签名(threshold signatures)。如下图所示,在当前的3-of-5多重签名中,有m = 3个签名(n = 5个)作为交易输入的一部分。
3-of-5的多重签名是如何工作的。观察者可以识别a)这是一个多签设置,和b)多签背后的公共密钥。
m-of-n多签交易至少需要m个签名者(并且每个签名都需要验证),并且要证明对多签密钥的utxo的所有权,scriptsig(或解锁脚本)必须包含m个ecdsa签名。scriptsigs的大小根据m个签名呈线性增长,这增加了这些交易的大小(也增加了交易费用)。
同样,观察者将知道a,b和c签名了交易,并且他们还可以识别所使用的多签设置。
但是,使用schnorr,m个签名被聚和到单个签名中。一旦提供了阈值公钥和阈值签名,该交易即被授权,并且在观察者看来就像正常的p2pkh交易。
schnorr进行3-of-5多签交易。观察者无法识别这是一个多签设置,只能将聚合的签名/公钥链接到交易。
schnorr使我们只需为所有m方提供一个签名。解锁脚本将只需一个代表参与者签名集合的签名。观察者不能再将交易签名链接到个人。
尽管地址和交易金额仍然是公开可见的,但schnorr本身使钱包/用处的识别变得更加困难(两者均可用于交易分析)。
schnorr的加法或减法可以进一步产生新的有趣的应用程序。
一个例子是无脚本脚本(scriptless scripts)
,这是一种在比特币上执行智能合约的方法。无脚本脚本依靠schnorr的线性属性创建适配器签名(adaptor signatures),从而允许原子交换。
下表显示了无脚本脚本原子交换的优点。
减少交易数据并加快验证
schnorr签名数据比现有的ecdsa签名数据小11%
,现有签名每个交易占用70-72个字节。由于schnorr签名在交易中/在区块链上占据的空间较小(它们固定为64个字节),因此可以实现较小的交易数据和较低的费用。
另外,如果一个比特币交易包含许多输入,每个输入都需要自己的签名。请记住,输入指向你收到比特币的地址。对于多签用户控制的任意数量的比特币,每个签名者必须将其单独的ecdsa签名发布到交易中。这些签名要一一验证,并且要有效地验证一大批签名,必须依靠一些数学技巧。
schnorr签名,所有输入仅需要一个组合签名,因为不同的签名是聚合在一起的。把交易包含在一个签名,可以使交易具有更大容量。多签交易的较小交易数据可降低费用。使用密钥聚合,我们不必检查每个单独的输入,验证速度更快。
使用ecdsa的紧凑型多重签名也比较难以生成,因为它们使用der(专有编码规则)进行编码,而schnorr签名以更节省空间的方式进行编码。
schnorr至少比ecdsa安全 如果不是更安全的话
ecdsa和schnorr数字签名方案都依赖于离散对数问题。但schnorr的好处是,与ecdsa相比,它使用的假设更少,并且有形式化的证明其是安全的。
ecdsa缺乏正式的安全证明,并且依靠额外的假设来保证这一目标。因此,schnorr是供密码学家使用的更清晰的框架。schnorr至少比ecdsa安全,如果不是更安全的话。
总结
简而言之,schnorr对可扩展性和交易隐私(而不是交易链接隐私)具有多个意义。效率的提高开放了更复杂的多重签名交易的使用,从而允许非常大的m-of-n方案和更高级的合同。与taproot和tapscript结合使用,schnorr大大拓展了比特币的隐私性和可扩展性。