比特币是通过数字签名来解锁UTXO中的未花费余额,从而完成交易的。
以下图为例,在交易B中,Bob转给Carol一个比特币。Bob需要分两步来完成这笔交易:
1. 证明自己拥有这一个比特币。
Bob为什么拥有这一个比特币,因为Alice给了他这一个比特币;Alice在交易A的「加锁」部分把给Bob的这一个比特币用Bob的公钥哈希锁上,该公钥哈希也是Bob的钱包地址。
Bob在交易B的「解锁」部分提供自己的公钥以及用私钥创建的签名,就能证明这一个比特币是自己的,从而完成解锁,可以使用这一个比特币。
2. 把这一个比特币给Carol。
Bob在交易B的「加锁」部分用Carol的公钥哈希把这一个比特币锁上,即表明这个比特币是属于Carol的了。
当Carol要使用这个比特币时,比如想转给Dave,Carol就需创建一笔交易C,先在「解锁」部分用自己的公钥及私钥签名解锁这个比特币,再在「加锁」部分用Dave的公钥哈希把这个比特币锁上。
不难发现,比特币需要利用公钥进行加锁,利用私钥签名进行解锁,从而实现加密货币的交易。公钥、私钥及其签名如何产生?通过数字签名算法。
Schnoor即是一种数字签名算法,它将在下一次升级中取代比特币现在使用的签名算法ECDSA。Schnorr由德国数学家、密码学家Claus Schnorr提出,该算法可以与ECDSA使用同一个椭圆曲线:secp256k1,因此升级起来的变动不会很大。
Schnorr最突出的特点在于它是「线性」的,也就是说,它可以把多个公钥或多个私钥签名聚合成一个新的公钥或一个新的签名(也可以理解为把多个需要同时解开的锁变成一个锁,把用于解锁的一串钥匙变成一把钥匙),而且这个新的公钥或签名还满足线性特征。
做一个不是特别适合但能说明问题的比喻,在一笔使用Schnorr的多签交易中,如果参与方Alice的公钥或签名是1,Bob的是2,Carol的是3,Dave的是4,那么这笔交易对外显示的公钥或签名是10(1+2+3+4=10),而不是1、2、3、4。
Schnoor签名算法的好处
Schnorr 开发者Andrew Poelstra认为,人们之所以对Schnoor感兴趣,是因为它提高了比特币的可伸缩性,并允许人们创建具有非常多参与者的多签交易,这里边的参与者不仅指多个人,也可能是Liquid网络、闪电网络、智能合约等等。
此外,Andrew 认为Schnorr 签名在结合Taproot 和Scriptless Scripts后,会让所有比特币交易看起来都一样,无论这是一个普通交易还是一个复杂交易,这种方式将极大改善比特币的隐私情况。
这些优势源于在多签的情况下,如果使用的是ECDSA,用N个公钥加锁,就需要有与之对应的N个签名来做验证解锁,验证的工作也需要进行N次;如果使用的是Schnorr,N个公钥可以聚合为一个公钥,验证时也只需用一个聚合签名做一次验证。
这种「线性」的特质让Schnorr在性能、体积、隐私等方面均优于ECDSA。
性能:Schnoor的性能优势显而易见,它减少了一个多签交易的验证工作量,此外还有可能实现多个交易的批量验证,也就是用一个区块中所有交易的聚合签名一次性验证所有交易,从而提升比特币的验证速度。
体积:Schnorr使用的是聚合公钥和聚合签名,这会减少多重签名的大小,通过将无关数据移出区块链提高系统的可伸缩性,节点将拥有更多的带宽同时还能减少存储量。Andrew认为如果每个人都采用这种方法,等于变相将比特币的容量增加了 10%至20%。
隐私:Schnoor的隐私优势在于它在交易脚本中使用聚合公钥和聚合签名完成加锁和解锁操作,某个用户的原公钥和原签名都不会暴露。外界只能看到10,而不能看到1、2、3、4,外界甚至无法知道这是一笔多签交易还是一笔非多签交易。
Schnoor签名还有更多有趣的使用方式,比如它能够在被调整后使用。人们可以把一个聚合公钥乘以2作为新的聚合公钥来上锁,解锁时只需要把聚合签名也乘以2就能完成解锁。这样一来其他人就无法知道原聚合公钥和原聚合签名是什么,他们也看不出公钥或签名是否被调整过。