Schnorr签名与比特币多签详细介绍
扫描二维码
随时随地手机看文章
DAEX Lab将持续为各位区块链技术爱好者与开发者带来相关的基础知识与热门讨论,深度剖析区块链底层算法、经济模型、系统架构和应用开发等方面的硬核干货与技术细节。
比特币网络可能在2020年上线Schnorr签名,来替代目前正在使用的基于Secp256k1曲线的ECDSA签名算法用于多重签名。那么Schnorr签名是什么,与目前的签名算法有何不同,与目前算法相比优势如何,应用端钱包将会怎样变化,本文将为你一一介绍。
一、ECDSA签名回顾
数字签名是对签名的数字模拟。最早的数字签名算法是由Rivest、Shamir、Adleman三人于1978年提出的RSA签名算法,其安全性基于大整数分解的难解性,广泛地运用于数字认证与CA等领域。但是由于RSA算法的密钥尺寸较大,存储效率不及后来的基于椭圆曲线的签名算法。所以目前广泛运用于密码货币的签名几乎都是ECDSA算法,只是所基于的底层椭圆曲线不同。ECDSA的安全性是基于椭圆曲线离散对数难解性。
二、比特币签名算法--基于 SECP256k1 曲线的ECDSA
比特币目前所使用的签名算法是基于SECP256k1 曲线的ECDSA算法。将交易的详细信息m作消息摘要,即z=SHA256(m),对摘要z作核心签名算法。
密码学意义上安全的数字签名需要通过添加随机数来实现签名的随机性。但是根据RFC6979标准,签名算法中的随机数是从消息摘要z中提取出,这不是密码学意义上的随机数。这个方案在众多密码学代码库中,并应用于大多数区块链项目中。
另一方面,ECDSA签名方案中,对于签名并没有扩展性。换句话说,如果2个签名,必须用各自的公钥来验证各自签名的合法性,没有方法能一次性验证两个签名是否都正确。更精确地说,例如Alice拥有私钥sk,她对于消息摘要z 所作出的签名σ,只有私钥sk对应的公钥pk才能验证通过。并且如果Bob拥有私钥sk‘,sk’对应的公钥是pk‘,他对于同样的消息摘要z 所作出的签名是σ’,除非单独验证σ在pk合法并且σ‘在pk’合法,没有一种算法层面的方法能得到一个Alice和Bob共同的签名σs,并且这个签名可以验证它是由Alice和Bob共同参与并产生的,而这在比特币的多重签名环境中有强烈的需求。这种方式可以大幅度降低多签的存储资源和计算资源。
三、Schnorr签名的平凡方案
Schnorr签名可以解决上面所提出的多签消耗资源的问题。Schnorr是由Claus-Peter Schnorr在1989年美密会上提出的数字签名算法,并申请了专利保护。就签名算法本身而言,它相对于ECDSA算法具有,可证明安全性、可扩展性的特点。
主要算法实现如下:
初始化:
G:椭圆曲线基点,椭圆曲线算术群
密钥产生:
用户私钥:x
公钥:X=xG
签名:
2.1 选择随机数r
2.2 计算R=rG
2.3 计算s=r+H(X,R,m)x
2.4 输出签名(R,s)
验签:
验证sG==R+H(X,R,m)X
可以看出Schnorr签名也基于椭圆曲线算术,目前广泛部署于各大代码库、芯片指令中的底层算术模块依然可以有效利用,但是需要将再重新从底层接口封装指令来实现Schnorr算法。这点对于软件钱包升级比较便利。但是对于硬件钱包,升级成本可能较高。
四、Schnorr签名方案的线性性质
假设Alice和Bob分别对于消息m进行签名。具体地,假设Alice的公私钥对为(x1,X1=x1G),Bob的公私钥对为(x2,X2=x2G),
以上Alice和Bob分别通过各自的私钥同时对于相同的消息摘要h计算签名,得 到σ1和σ2并公布,其他验证人在获得这两个签名之后,结合Alice和Bob各自的公钥X1和X2,令X=X1+X2, σ=(R1+R2,s1+s2),那么用“公钥和”X来可以来验证“签名和”σ的合法性。这里发现,签名的结构是具有线性性质的。并且根本无法区分σ是通过求和的方式还是原始签名的方式作出的。这一性质可以用来作数字资产的多签方案来替代现在基于脚本的多签协议。
以上的方案只是为了展示Schnorr签名的线性性,并不能直接用于实际应用,因为这个方案可能会导致Rouge key Attack。
五、基于Schnorr签名的多签方案
5.1多签方案
以n-of-m多签方案为例。
1、假设有m个参与者,其中每个参与者Ui拥有公私钥对(xi,Xi=xiG)。
2、对于所有的m个参与者,令
3、对于n个参与多签的签名人,不妨设前n个为签名人。每个签名人Uj,Rj=rjG,rj是Uj选择的随机数,Uj与其他签名人共享Rj。再令
4、每个签名人Uj计算,其中m是交易数据。
5、再令
(R,s)是一n-of-m多签签名。可以在公钥(注意是n个签名者的“公钥和”)下可验签通过。
5.2 钱包服务架构
钱包分为服务器端(S端)和客户端(C端),C端将有多个逻辑点,对应多个用户。
C端:
1、m个参与者各自创建公私钥对
2、m个参与者将各自公钥发送给S端
3、n个签名人各自选择随机数rj,并计算Rj=rjG,将Rj发送给S端
4、n个签名人各自计算sj=rj+H(X,R,m)H(L,Xj)xj并发送给服务器
S端:
1、收集m个参与者的公钥,并计算
并将L和X广播发送给m个参与者。X是“公钥和”,可作为多签地址;
2、收集n个签名人的Rj,并计算
将R广播发送给n个签名人;
3、收集n个签名人的sj,并计算
将(R,s)编码在原始交易数据中,并广播到主网。
这里的S端和C端只是逻辑上的,可以在一个物理设备上既有S端也有C端,也可能是多个物理设备上的。
六、结论
对于Schnorr的线性性质以及签名可累积性质,使得在比特币多签交易的执 行中,不需 要过多的用户签名数据,只需要“签名和”与“公钥和”即可验证交易合法性。这会让比特币的多签交易大小大幅降低,从而区块能容纳的多签交易数量得到较大提高。以2-3多签为例,目前比特币多签的锁定脚本需要3个公钥地址,这部分会被压缩为脚本,所以升级之后大小无变化,但是解锁脚本需要2个公钥与2个签名,在升级为Schnorr之后,只需要一个“公钥和”与“签名和”。对于更通用的n-m多签,目前比特币多签的解锁脚本需要n个公钥与n个签名,Schnorr签名依然只需要一个“公钥和”与一个“签名和”。也就是说签名人越多,Schnorr签名的空间利用率越高。
数字资产的存储是DAEX生态的重要环节,为了及时响应比特币的这次重要的底层升级,DAEX正在积极研发和升级自己的软硬件钱包,会在比特币主网上线Schnorr签名的第一时间支持Schnorr多签。如果Schnorr签名在比特币上的创新获得成功,我们可以想象将会有更多的数字资产支持Schnorr多签,我们会在积极地支持用户运用Schnorr多签来保护自己的数字资产。