隔离见证(Segregated Witness)在比特币网络上推出前,已进入最后的测试阶段。 这一重大利好主要体现在隔离见证引入了容量扩增,允许网络处理更多的交易,同时也解决了交易延展性问题。
交易延展性,也被称作为是可锻性。 啥叫可锻? 即同样一个东西(如一坨金属),它的本质和质量都没有改变,但是它的形状改变了。而这个可锻性,会造成交易ID——TXID(交易ID)的不一致,从而导致用户找不到发送的交易。
现在比特币的交易数据格式中,将交易签名部分也纳入了整体交易中,最后对整体交易做哈希,而交易签名又可以有多种写法,攻击者篡改了它们,它们作用上是一样的,但是字节发生了变化,导致这个签名不一样了,前段时间甚至有一个矿池挖出了一个包含所有交易都是延展攻击了的,给一些应用带来了麻烦。
TXID发生变化可能会导致一些应用在查找TXID时找不到,从而影响一些钱包充值或提现的状态,给运营者和用户带来麻烦,隔离见证是为了解决这个问题而提出的,将交易数据和签名数据分开,这样一笔交易的TXID一定唯一。
并且,SegWit引入了脚本的版本管理,是对比特币协议的扩展,由此开启创新的大门。
比方说,Schnorr签名,绝对是开发者们翘首以盼的。
随着SegWit 来临, 紧随其后的应该是Schnorr密码签名算法的实施,Schnorr签名有可能一石三鸟的比特币的扩展性、效率及隐私。
简单过一遍签名。
“公钥密码术”这波数学操作应该算是比特币的核心之一了,原理非常简单:两种“密钥”(字面意思是钥匙,其实是数字串)构成的密码系统,分为私钥和公钥。
私钥和公钥之间是是算术关系。
注意: 私钥生成公钥非常容易,但是从公钥反推出私钥节本上不可能。为方便理解,可以把公私钥之间的联系想象成一条私钥到公钥的“单行道”。
好比Bob想要花掉A地址中的比特币,必须证明自己拥有对该地址中比特币的支配权。证明的方式是这样: A地址对应公钥B,那么,Bob证明私钥C可以生成公钥B,且自己是私钥C的主人就好了。
注意:Bob不能以公开私钥C的形式证明自己的所有权,好比现实世界中Bob不会为了证明自己能花掉银行卡里的钱, 把银行卡密码透露给别人道理一样。 加密世界中,要证明私钥的所有权,而不必泄露该私钥,会使用加密签名算法。
使用交易数据和私钥可以计算出公钥, 这也是公钥密码学神奇的地方:公钥已知,私钥未知的情况下,任何人都能判断出为创建签名是否使用了正确的私钥。
因此,私钥“所有人”能够签署交易然后花掉比特币,又不用担心别人拿着自己的私钥撬走自己的资产,道理很简单:除了自己没人知道私钥嘛,而且签名仅对当笔交易有效。
Schnorr签名
Schnorr签名是一种通过一系列算术规则把公私钥和签名联系在一起的签名算法。 很多密码学家都认为Schnorr签名应该是领域内最棒的存在,原因有这么几点:
1. 高度正确
2. 不受延展性影响
3. 相对快的验证速度
4. 支持多重签名,意思是能将多个签名合并为一个新的签名,这一点是非常重要的。
当前比特币中还不能有Schnorr签名这种操作。比特币现有的签名算法叫椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm ,ECDSA),想做更改的话需要硬分叉来实现。
简单回顾下椭圆曲线:
假设这个世界上所有的人都会乘法,却没有人会除法。
有一天Bob挑出了两个数字:123 和456。
Bob会乘法,算出 :123 * 456 = 56088
然后Bob问Alice:123 * ??? = 56088
前面说了,没有人会除法,Bob也没告诉别人??? 是多少,所以 ??? = ???
再后来,打算告诉Alice一个秘密:67。 但是Alice不想别人知道。
于是随手选了一个数字222。计算出:
123 * 222 = 27306
56088 * 222 + 67 = 12451603
然后Alice对Bob说:
123 * ??? = 27306
56088 * ??? + x = 12451603
Bob思考了一下:
123* 456 = 56088
所以56088 * ??? + x = 12451603 可以写成 123 * 456* ??? + x = 12451603
123 * ??? = 27306
所以123 * 456* ??? + x = 12451603 可以写成 27306 * 456 + x = 12451603
x = 12451603 - 27306 * 456
x = 67
x就这么被传递过来了。
如果我们把上面的过程写成数学公式的话,就是
G * k = K (G,K公开,k保密)
c1 = G * M
c2 = K * M + x (M随机选取,x为要加密的数字,M和x都保密)
x = c2 - c1 * k
= K * M + x - G * M * k
= G * M * k + x - G * M * k (消除左右两侧的G * M * k)
= x
谁都会除法,直接K / G就算出k了。
那么,把问题升级一下:
假设这个实际上所有人都会算指数,却没有人会算对数。那么:
Gk = K (G,K公开,k保密)
c1 = GM (M随机选取,x为要加密的数字,M和x都保密)
c2 = KM * x
x = c2 / (c1k)
其实问题是完全一样,对于上面这个问题来说,其实就是需要3个运算:
一个任意定义的加法,需要满足: a + b + c + d .... 任意调换顺序后 c + a + d + b ... 结果一致
一个定义的减法,满足 a + b - b = a
一个定义的乘法: a * n = a + a + a + a ... // n个a相加
以及一个难以简单计算的除法:a * b / b = a
在我们举例的指数的例子里,其实我们就是把+定义为数值相乘,-定义为相除,*定义为数值自己乘自己n次。/本质是就是对数
但是其实要找到一组运算+ - *很简单,/却很难,这个事情并不容易。
于是,出现一个诡异的加法运算, 方程是 y2 = x3 + ax + b
于是就出现了SegWit。
SegWit将所有签名数据转移到交易的一个单独部分,叫见证,而且见证部分不在旧的比特币协议中。那么通过脚本的版本控制,见证中使用的规则都可以通过软分叉进行变更, 包括Schnorr签名这种。
比特币受益于Schnorr签名最多的地方应该是多签合并这一点了。
比特币交易通常包含多个输入,意思是说比特币的来源有好几个地址。
好比买样东西,价格是173.5,现金结账,为凑够这笔数额,(不用大面额的钞票的前提下)怕是要有各种五毛一块有零有整了。比特币中,由于涉及多个地址,因此需要在交易中提供每个地址对应的签名,然后提交至网络打包入块,那么区块中光签名数据就占用不少空间。
Schnorr签名中,多签名就变成单签名,同样能保证比特币合法来源。厉害的地方在于,因为一笔交易只包含一个签名,提交至网络打包入块的也只有一个签名,那么区块内无形当中结余出一部分空间,也就能包含更多交易数据在里面了。
SegWit中,压缩的是见证部分的数据大小(压缩了75%左右),不是原始区块中的数据大小。 好比,1兆字节的见证数据折下来变成了0.25兆字节,相当于在原始块内多出来0.75兆字节,所以才说能包含更多的交易数据,比特币块大小不是1兆嘛。
再比方说,Schnorr签名把见证数据从1压缩到0.5兆,然后Segwit在此基础上再打个二五折,那么见证数据最后就变成0.125兆,是不是相当于多出来0.875兆的空间(在原始块里)。(Schnorr签名扩容的百分比大概是17%)
结余出来的空间大小,其实取决于打包入块的交易类型。根据比特币核心开发者Eric Lombrozo粗略估计,Schnorr签名能带来的容量扩展应该可以超过40%,别忘了SegWit这厮还能结余出来60-100%的空间。
多重签名
上述主要针对一般交易,即单笔交易多个输入。 对多重签名交易来说,即单一输入,但是需要一堆不同人的签名,Shnorr签名就更厉害了。
是这样的,即便是多重签名交易,也跟一般交易一样,一个签名就够了,不管交易涉及多少人,需要多少签名。也就是说,仅以小小的数据,就能构建出十分复杂的智能合约。无论是2/3、3/15还是100/100类型的多重签名交易,签名数据大小都跟一般单一签名一样。
隐私
Schnorr签名另个利好比较有趣:隐私激励。
如上所述,一笔交易可以包含多个输入,通常来讲,这些输入对应的地址为同一人所有。(还是参考173.5现金付款那个例子,不管拿出多少零钱整钱,都是自己口袋里的)
但是由比特币核心开发者Gregory Maxwell发明的CoinJoin这波隐私增强的操作中,允许不同用户将各自交易合并为一笔交易。那么这种交易先汇集来自不同人的多个输入,再把资金分成多个的输出,发送到不同的接收人地址。
为方便理解,这么想:一群人先往一个篮子里扔各种五毛一块,然后拿着篮子去到不同的商店各买所需。东西是买完了,但是用的钱,可不一定是自己当初仍在篮子里的五毛或一块。
或许CoinJoin能够提升比特币协议的隐私性,原理很简单:先把比特币混在一起,然后花出去。人数足够多的话,溯源应该是比较困难了。
CoinJoin不是新概念,但是有个困境:主流不爱用,因此比较小众,那问题来了,用的人就显得比较扎眼。要知道CoinJoin的出发点本来是想要低调的交易,这下鹤立鸡群不说,还搞的自己很可疑的样子。
那么Schnorr签名可以为CoinJoin带来新的突破:首先CoinJoin交易中,交易是合并在一起的,而Schnorr签名则进一步允许多个签名的合并。这么做的好处是,交易大小会比之前单纯的交易合并有所降低,因此矿工收取的交易费也会降低。
因此,有了Schnorr签名的CoinJoin不仅能够增强隐私,还能降低每个人的参与成本。 选择最为隐私的方式会带来成本的节约,因此能得到人们的拥护,反过来,进一步增强比特币的隐私表现。
注意:比特币中实施Schnorr签名仍处于概念阶段。 尽管多数比特币核心开发人员认为可以安全地在比特币中部署Schnorr签名,但现在还不能完全确定。
感谢比特币核心开发人员和Blockstream联合创始人Pieter Wuille博士提供的信息。感谢比特币核心开发人员和Ciphrex首席执行官Eric Lombrozo的校对与建议。
网友评论