比特币的扩容

01
扩容之争

比特币系统从2009年到现在已经运行了10年,有惊无险地度过了一些危机,也在不断的完善升级。比特币作为一个去中心化的系统,每一次的升级有些人会支持,也有一些人会反对。2017年,由于被比特币的一次升级方案无法达成一致,发生了一场内战。

内战爆发的原因,还得从比特币系统的交易处理说起。比特币每10分钟挖出一个大小在1M左右的区块。假设每笔比特币交易平均是250字节,每个区块最多可以放进多少笔交易呢?答案是:最多大约4000笔交易,算下来比特币系统每秒可以处理的交易笔数不超过7笔。对比其他的传统支付处理工具,PayPal每秒可以处理数百笔、Visa每秒可以处理数千笔、支付宝可以达到每秒处理数万笔。没有对比就没有伤害呀

而且比特币每个区块能装的交易笔数还只是理论上最多能装4000笔交易。实际区块中能够装入的数量还得打个对折,只能装2000多笔左右。所以实际上比特币的TPS(Transaction per second)也就是每秒能处理的交易笔数在3~4笔左右,也叫每秒的吞吐量。吞吐量是指对网络和其他一些设施单位时间内成功的传送数据的数量。

可见比特币是一个比较低效的交易处理系统,如果有很多人在上面发生交易,矿工一时之间打包不完的话,就会造成系统拥堵。2017年2月22日,比特币网络发生了非常严重的拥堵,它的高峰时期有超过10万笔交易在等待着被矿工打包上链。有的交易一直等不到被矿工确认,那些着急的用户只能支付更高的手续费,让自己的交易得到更快的确认。

那中本聪当初设计的时候,怎么会把区块大小设置在1M那么小呢?为什么不设置成10M或者直接设成1GB呢?这样区块不就可以容纳更多的交易笔数了吗?交易的拥堵问题也就能够缓解了。其实早在2010年的时候,就已经有人在比特币论坛上发帖子,提出增加比特币的区块大小,认为比特币系统的交易处理速度至少要能够跟上PayPal的平均交易处理速度。中本聪当时回帖说:暂时不要去做改动,等到区块大小需要改动的时候再调整,中本聪再接下来又亲自给出了扩容的方案 ,表示扩大区块容量这个事情可以分阶段进行。这也是为什么一些扩容派总是强调扩容就是中本聪的原意。

对于中本聪当初为什么设定区块大小为1M的原因是有争议的,我们介绍一种比较常见的解释:中本聪其实是在比特币系统的交易处理速度去中心化记账这两者之间做一个权衡,区块容量扩大以后,一个区块中的交易数量确实是更多了,平均每10分钟可以打包更多的交易,将它们上链,但是整个区块链的账本很快就会变得很大,完整的账本数据对于普通人来说会变得难以保存。

如果每个区块的大小从1M变成10M,那么一年产生的区块数据就会超过500GB,500GB的储存空间不是一个普通的用户想拿就能拿得出来的。

如果区块大小从1M变成20M的话,一年产生的区块数据大小就会超过1000GB,这么大的账本数据,只有那些有资金愿意去配置设备的人才能保存,这就违背了比特币记账的去中心化原则,人人都可以保存账本数据的初衷就无法实现了,中本聪权衡之后将区块容量的上限限定在了1M。

当然这只是一种猜测,中本聪到底怎么想的,现在已经很难去做考证了,不问中本聪设定1M区块容量上限的原因是什么,结果是显而易见的:随着比特币系统在世界范围内得到了比较广泛的接受,需要处理越来越多的交易数量,交易处理速度问题就变成了迫在眉睫需要解决的了。

比特币社区里的成员对如何解决交易拥堵问题出现了分歧,主要分成两派:一派是坚持1M区块大小的核心开发团队bitcoin core,另外一派是支持扩大容量的矿工们。

比特币核心开发团队bitcoin core拿出的方案是:维持1M的小区块容量不变,通过隔离见证和闪电网络这两个技术来处理交易。矿工反对这个方案,理由是格隔离见证和闪电网络的技术实现太复杂了,容易导致网络不稳定,给系统带来很大的安全隐患。而且格隔离见证和闪电网络是指把一些非常大额的比特币交易放在网络上,把一些日常的小额交易给放到链下处理,这样矿工可以拿到的交易手续费就会减少,损害了矿工的收益。

矿工一派支持扩大容量,但是区块账本过大的话,普通的电脑会无法保存完整的账本数据,最终可能导致比特币的记账中心化中心化,而且扩大区块大小的升级方式叫做硬分叉,有分裂社区的风险。

隔离见证是把交易的签名部分从交易信息中隔离出来,在原来1M大小的区块外面单独开辟一个地方用来放签名,从而区块里能够腾出更多的空间存放其他的交易信息。

闪电网络是对比特币的交易进行分层,闪电网络用来处理一些额度比较小的交易,少数大额的交易放在比特币的主网上去处理。打个比方:原来所有的车子,不论是小轿车还是大客车都走高架桥,现在高架桥上面发生了交通拥堵,闪电网络就是在地面上铺了几条小路,把小轿车从高架桥上面引流到地面的小路上,以此来缓解高架桥上的交通压力。

如果用闪电网络,矿工的收益也会受损,矿工就像是高架桥上面的收费站,所有走高架桥的车子都要缴纳过路费,现在这些小轿车不走高架桥走小路去了,那在高架桥上面的矿工的收益自然就变少了。

矿工不支持比特币核心开发团队的方案,核心开发团队也不认可矿工的方案。后来支持扩容的矿工一派就从比特币中分叉出去,创造了一个新的加密货币,叫做比特现金Bitcoin Cash。

02
隔离见证

今天我们主要来科普隔离见证(由于闪电网络技术实现比较复杂,以后再讲)。

隔离见证是把原本放在一起处理的信息分开来处理,原本比特币的交易信息和签名信息是一起存放在区块主体里,实施隔离见证之后,把交易信息和签名信息剥离开来,只把交易信息放在区块主体里面。

我们以银行为例:假如大白向小黑汇款100元,除了要填写小黑的银行账户和汇款金额,大白还要签上自己的大名,大白的这个签名是为了授权给银行进行这笔转账,小黑作为收款人他对大白的签名是不关心的,他只要能收到钱就行了。比特币体系里,大白是通过私钥授权网络中的矿工们帮助他进行交易的转账和记录,矿工们替代了银行的角色,需要对大白的私钥签名进行检验,作为收款方的小黑,他并不介意大白的私钥签名签没签,只要比特币到账就行。

如果把签名信息从账本中移出,1M的区块就可以容纳更多的交易,从而达到变相扩容的目的。在区块高度481,824,UTC时间2017年8月24日1:57:37,比特币网络上的隔离见证正式激活了。到今年9月份,已经有大约53%的比特币交易都是通过隔离见证来完成的。

那么签名从每笔交易的信息里面隔离出来之后放到哪里呢?区块单独开辟了一个空间放这些签名,签名只不过是放的位置不同了,原本是放在区块主体里,现在被放到整个区块的尾部,我们之前的文章中讲区块结构的时候讲过,区块是由区块头和区块主体两部分组成,区块主体是所有信息存放的地方。隔离见证之后,区块的结构变成了区块头、区块主体和扩展区块组成,扩展区块就是在原来区块结构的基础上,专门开辟了一个空间用来存放隔离出来的签名信息。

大家看上图中几个区块的信息,你会发现这几个区块的大小已经超过1M了,就是因为他们实施了隔离见证,区块头+区块主体这一部分的信息量大小仍然是不能超过1M的,但是扩展区块是不受限制的。所以加上扩展区块之后,整个区块的大小其实是超过1M的。

隔离见证根据它隔离的彻不彻底分为两种,一种是隔离得较彻底的,比较彻底的隔离见证地址是以bc1开头的,另外一种是不那么彻底的,只做到部分隔离的比特币地址以3开头

像比特派 、IM token这些加密的钱包软件,通常提供的地址是3开头的隔离见证地址,这类地址有两个作用,第1:可以和现在的大多数钱包软件兼容。以比特派的钱包为例子,一般钱包默认的比特币地址都是最普通的以1开头的地址,我们也可以去手动切换成使用隔离见证地址,软件的设置里面有个选项,点击切换隔离见证地址之后,钱包软件就生成了以3开头的隔离见证地址。如下图:

这类地址的第2个作用:是为大家接受彻底隔离见证的bc1开头的地址更多的准备时间,bc1开头的隔离见证地址比3开头的做的更彻底。这样做这个目的是为了进行一定的缓冲,隔离见证的技术比较复杂,争论也很多,甚至现在还有很多钱包、区块浏览器是不支持以bc1开头的隔离见证地址的。

 

上图中以1开头和以3开头的非格隔离见证的地址是蓝色的,可以点进去看到与地址相关的所有交易信息,以bc1开头的两个隔离见证地址的颜色是灰色,点不了,如果把这段地址复制下来,在区块浏览器里面去单独的查询,浏览器甚至会提醒说找不到这个地址的内容不存在。

上图中,同样的一笔交易信息,直接不显示bc1开头的隔离见证地址,我们可以看到左边的发出地址和右边的接收地址的第2行,这两个隔离见证的地址是直接被隐藏掉的。

经常用的区块浏览器blockchain.info、blockcypher、www.btc.com,这三个里面只有www.btc.com浏览器是支持查询隔离见证地址的详细信息。如下图:隔离见证地址和非隔离见证地址都是蓝色,都可以点进去查看。

隔离见证除了节省交易所占用的空间腾出更多的地方来放入交易笔数之外,其实隔离见证最开始被提出来的时候,并不是为了解决扩容问题,而是为了解决比特币的延展性攻击问题,通过隔离见证实现了扩容只是它附带的一个作用。

比特币的延展性就是指比特币交易的延展性,每一笔比特币交易都会有个交易ID,交易ID是整笔比特币交易信息的哈希值,一笔交易当中包含了交易的发送方、接收方、交易金额以及签名数据等等,这些数据一起进行哈希之后会得到一个哈希值叫做TX ID(transaction Id)。

哈希函数的一大特点就是高灵敏性,原始数据稍微做一点变动,整个哈希值就会面目全非。没有隔离见证之前的比特币交易,签名和交易信息是放在一起的,是要进行哈希的明文的一部分,所以签名稍微变动,得到的交易ID即哈希值就完全不同了。

比特币采用的椭圆曲线签名算法有个缺陷在于:修改签名的某个字节依然可以使得签名通过旷工的校验,这个签名在矿工那仍然是合法的,这样伪造签名之后,交易的发送方、接收方、交易金额都不做改变,只是对签名做一些非常细微的改动,这样的交易仍然可以通过矿工的校验,被成功打包进区块。而且这样的签名篡改不需要私钥就可以做到,因为数字签名它本质上是一种数学运算,但凡是数学运算总会有一些不同但等价的表现形式。

比如说一些数字前面要加0x是为了区分十进制和16进制。10进制里面是128和16进制的80,虽然看上去128和80不一样,但其实它们本质上或者说在数学上就是一样的,因为他们用的其实是不同的进制而已,所以同一个数字签名也是一样,他可能会有不同的多种表现形式,但是在数学上它们都是一样的。

虽然同一个数字签名可以有不同的有效的表现形式,但是它们的交易ID也就是交易哈希值却是完全不同的。哈希函数的高灵敏性,明文输入任何细微的变化,都会导致哈希值的变化。反应在比特币的交易当中,就是一笔交易的签名发生变化,虽然可以通过矿工的校验,仍然是合法的,可是它对应的交易哈希值TX Id会发生变化,一些黑客就可以利用这一点进行延展性攻击。

交易所提币的流程:发起提币申请之后,交易所会给我们一个TX ID。我们可以根据这个交易ID到区块浏览器上查看这笔提币交易的进度,这笔交易被广播到比特币网络上之后,矿工会根据交易所的签名来验证交易的合法性,如果你是一个很鸡贼很智能黑客,你可以把交易所的签名进行篡改,使得这笔交易的ID信息发生变更,依然可以通过矿工的校验,而且你的交易广播速度比交易所发起的更快,那么你篡改签名之后的交易就会被矿工优先打包进区块。因为你的交易是先到矿工那里的,交易所发起的交易后到矿工那里,它就变成了一笔双花,会校验失败。

这个时候你依然收到了交易所发给你的币,被记入区块链的这笔交易哈希值却已经不是交易所给你提供的这个原始交易哈希值了。这样你就完全可以跟交易所说:我的提币交易失败了,你需要重新给我发起一笔转账,交易所根据自己的这个交易ID查,发现果然查不到,因为它已经被矿工认为是双花了,认为已经是无效的了。于是交易所再向你转了一笔相同金额的比特币。这就是延展性攻击,之前世界上最大的交易所“门头沟”破产,据说就是因为受到了黑客的延展性攻击而导致了85万个比特币的丢失。当然现在交易所对延展性攻击都是有所防范的,黑客要得手就不太容易了。

隔离见证因为将交易信息中的私钥签名隔离出去了,这样一来交易的哈希值TX ID是唯一的了,不会出现说有人利用交易信息来开展延展性攻击。

隔离见证是解决延展性攻击的好办法,但并不是唯一的办法。比特币的硬分叉比特现金从2017年8月1日分叉出去之后,就多次遭到了恶意的延展性攻击,后来他利用其他的技术方案进行了解决。

03
隔离见证地址的生成流程

隔离见证地址的生成流程和普通的1开头的地址生成流程是一致的,只有略有不同。

1、输入公钥,点击send

2、做一次SHA256的运算

3、做一次SHA160的运算

4、前面加版本号0014

这个增加了版本号0014的公钥哈希被叫做赎回脚本

5、做一次SHA256的运算

6、做一次SHA160的运算,得到赎回脚本的哈希160值

7、在赎回赎回脚本的哈希160值的前面加前缀05

8、下面的地址生成流程和非隔离见证地址的一样

大家可以看之前详解地址生成的文章:区块链的公钥、私钥和地址的生成流程

05这个版本前缀呢,它其实是一种叫做p2sh(pay-to-script-hash)支付到脚本哈希这种地址类型的特有的,不仅是隔离见证,多重签名也是属于p2sh的一种类型。隔离见证和多重签名的地址都是以3开头的,因为他们都带有05的版本前缀,05版本前缀经过base58的编码之后,它的地址的第1个字符就固定是3。

提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢