本文内容整理知乎专栏:区块链演义。这是一个非常棒的专栏,深入浅出地讲解了数字货币的原理。原作者是maxdeath,是
TU Delft大学的信息学博士。
这篇文章是本系列的第七期。在第一
期
《
比特币交易与支付宝转账的区别
》中,我们从另类视角,讲述了什么是比特币,以及比特币交易与支付宝转账的区别。
在第二
期
《
中本聪是人,不是神
》中,我们深入浅出地讲解了比特币设计的相关概念。
比特币的确设计得十分巧妙,许多设计中同时达到了多个目的。然而
中本聪也绝对不是什么ai,或者穿越者,
他没有“发明”这些看起来不明觉厉的机制
——无论是工作证明,权益证明还是拜占庭容错算法,
其实都可以在人类社会发展进程中的社会形式里,找到影子。
在第三
期 - 第五期
《
货币体系的价值
》
《
比特币这个货币体系只值21亿美元
》《
如何摧毁比特币这个货币体系
》
中,我们指出了
比特币也是一个货币体系
,并且
从货币体系的角度,评估了一下
比特币的价值,结果是不足21亿美元。而摧毁这个货币体系,甚至连21亿美元都用不上。
这个结果是大大出乎人们意料的。
在第六期《
比特币在技术上其实是非常落后的
》,我们论述了,
比特币作为区块链的开山怪,到现在为止没有进行过哪怕一次技术上的更新,
从技术上相比于其他的区块链已经是非常落后的
了
。
比特币的实现方法已经远远承载不了现在的用户体量。如果想承载更大的体量,扩容是刻不容缓的。然而扩容就可能导致分叉,我们又从技术上普及了分叉相关的概念。
今天,我们想讲一下扩容具体落地的方案。
直到现在还有很多人觉得扩容只是利益纠纷而非技术问题,这其实是非常大的误区。
以下是今天的内容:
1. 如何实现扩容?
我猜直到现在还有很多人觉得扩容只是利益纠纷而非技术问题,我上次看到一个自称区块链专家的人号称一个区块大小改成1GB或者改成1秒钟出一块也没关系,之所以不这么做只是因为会损害到矿工或者核心开发者的利益云云……
其实,这背后的东西,要比狭义的扩容这件事要复杂多了
——
这是区块链的可扩展性(scalability)的问题,至今仍旧是一个学术难题
。我可以负责任的说,想要达到和目前比特币采用的POW完全一致的安全性的共识算法,目前只有POW,其他的不可行。换言之,对于公有链,理论上来讲可以用别的算法,例如POS,例如基于POW或者POS选举决策层然后再进行BFT,但是第一这些都还是理论,第二它们的安全模型都和比特币有或多或少的区别,而这种区别,是比特币的升级方案承担不起的。
比特币,已经承载了太多的用户和价值,甚至,还承担了整个数字货币和区块链旗帜的重责。
于是,
想要完全更改共识算法,冒着不可预测的风险去扩容,无论是投资者,矿工,开发者,还是中本聪的狂信徒都不会答应。
不说别的,好不容易给人们解释完了POW说它是世界上最完美最安全最公平甚至最有效率的共识算法,现在你让我换一个?
所以说,
采用新共识算法来扩容的方案,在很早之前就被否定掉了
——如果想要新的共识算法,好,你可以自己弄个新币,反正不能在比特币上弄。
于是,比特币只能用POW。
那么?我们可以简单地把区块大小改成1GB或者一秒钟出一块吗?
答案是不行。
很多人讲的原因是——“啊,那样的话链就太大了,没人存得下”。
这是错的,储存不是问题所在。
问题所在是传输。
POW的安全的基础,是建立在一个人挖矿速度没法超过全网的50%算力的基础上的。
而这又需要一个非常重要的前置条件——你确实得是在和50%的节点公平竞争才行。
这就跟考试一样,你们得同时拿到卷子开始写才行。
而这个,就要求网络是同步的,至少是接近同步的。
对于比特币稍微了解点的人可能会有异议:“等等!比特币是个异步系统啊!”
没错,
比特币是个异步系统,但其实POW的安全性只有在(接近)同步的情况下才能保证。
于是,
POW引入了挖矿奖励,来激励矿工们保持同步。
所以我们才能看到,为了挖矿,为了让自己挖的区块被网络接收,为了不把算力浪费在不正确的链上,矿工们实际上是和打了鸡血一样地去广播,去接受新的区块——换句话说,去保持矿工网络的同步。
而矿工网络的同步性,我们可以从产生的孤块时间看出来:
孤块和最终加入主链的块的时间差了半分钟
,也就是说,产生孤块的这个矿工,在挖出这一块的时候,半分钟之前产生的那个块还没有广播到他这里。
也就是说,一个新产生的区块,要传遍整个网络,需要至少半分钟。
而矿工都是收到一个新块验证无误了之后再在上面挖矿,也就是说,新的区块就像一道新的题目,而传播就好像是发卷。这个卷子发给所有同学需要至少半分钟。
这不公平,
因为这说明每轮挖矿总有人比别的人早半分钟拿到试卷。
但大家觉得这样也没什么问题——第一,每轮先拿到试卷的人是随机的。第二,反正考试的时间是10分钟,大家觉得这半分钟的延迟可以接受。
然而,如果考试只有半分钟呢?
或者,如果卷子特别多发起来特别慢呢?
假设我们为了扩容,把比特币的区块间隔改成半分钟。从现象来讲,比特币的网络会出现大量的孤块和分叉,也就是大量的算力被浪费了。
而本质上来讲,实际上是比特币的安全模型崩塌了:
我们来考虑
自私挖矿或者说是分叉攻击。
也就是说,我挖到个区块,但是我不公布,我继续在这个区块下面挖,然后挖出一个,还不公布继续挖,直到我的链比网络里的所有链都长的时候,我再一气公布出来。
在理想的比特币的模型里,除非我的算力超过50%,否则我这么做的成功率为0。
但实际上,我所需的算力小于50%,因为我并不是在和其他人公平竞争
——他们需要发卷,发卷的时候没收到卷的人没在做题。而我永远都在做题,因为我自己给自己发卷。
当做题时间为10分钟的时候,这个优势还不明显,但是如果做题时间是半分钟的话,这个优势就很夸张了——
每一道新题,还没发到全班呢,就有人做出来了,然后重新发题。如果粗略地认为发卷的速度是线性的话,也就是平均每个人只做了15秒的题。也就是说,这个题的难度,如果全班人一起做的话,15秒就做出来了,每道题,其实都只有全班的一半算力在做,剩下的一半,他们做了错误的题目。
换句话说,我并不需要50%的算力,而只需要33%的算力就够了——因为我只和剩下的算力的一半在竞争。
而增加区块大小和这个同理。
如果把区块大小扩大十倍,传输所需的时间也会相应提高。
于是,只要传输速度和区块产生速度相比不可忽略,
比特币的安全性就会严重地打折扣。
在On scaling decentralized blockchain
这篇论文里指出,
在现行互联网中,如果十分钟产生一个区块的话,区块大小不能超过4MB。
于是,为什么不把比特币区块扩大到4MB呢?
因为比特币规定,区块大小不能超过1MB。也就是说,如果扩容要更改区块大小或者修改难度的话,一定会产生硬分叉。
而曾经(注意是曾经),比特币社区对于硬分叉畏若蛇蝎,避之不及。
那么,有没有能够在不增加区块大小的前提下增加交易容量呢?
这就是
隔离见证
。
2. 隔离见证
我们已经说了,一笔交易大概250字节,但是打开看看这里面都有什么呢?
为了不把这文章搞得像论文一样我们就不去看代码了。
总之,每笔交易粗略的说起来有两部分:
1.
谁给了
谁多少钱
:也就是交易方和交易额(什么UTXO什么地址什么输入输出都只是细节)。
2.
你有
权利做这笔交易的证明
:也就是说,作为给钱的那方,你得证明你有资格给这笔钱。而这个证明,是一组数字签名。
而看到这里,有人灵机一动——
等等!
比特币的格式里,好像允许用脚本来替换签名!
实际上,这个签名是很大的,250字节的交易里,可能有150字节都是签名。
粗略估计,签名大概占了交易大小的2/3。
然后,
我们可以把交易里所有的签名改成脚本,然后把所有的签名打包起来丢到后面去,于是,我们剩下了2/3的空间。
那么采用了隔离见证的节点发出来的新区块长啥样呢?
首先,
每笔交易都被分成了两部分:交易和见证(签名)
。交易部分只有100字节左右,于是一个1MB的区块里面能放10000笔交易(原来是4000笔),然后,所有的见证部分,大约1.5-2MB,都被扔到了后面。新节点当然可以接受这种格式,而且也认为见证是链的一部分,而旧节点虽然不认后面的部分,但他们仍旧会认为前面的部分是合法的区块。于是,无论是新节点还是老节点,都可以在对方的区块上挖矿,这岂止是软分叉,
这根本就无需分叉,然后提高了一倍多的效率,简直完美!
然而隔离见证的优势还不止这些——
隔离见证还修复了一个比特币的被称为“
可变性
”的缺陷,使得比特币的交易更容易识别。
最重要的是,可以更容易地实现一个叫做“
闪电网络
”的东西。
闪电网络是什么呢?
简单说就是一个在链上提供担保的链下交易机制
,实际上就是在比特币上签署一个协议——
例如你经常给某个人转钱,你不用每次转都把交易上传到比特币的链上了。
你们双方可以先在比特币上签署一个协议,交上一笔保证金,然后只要你们转账的总额不超过保证金,接下来你们的转账可以在私下进行
,而这个协议保证如果对方耍赖不认可你们私底下做的交易了,你可以凭着转账记录上传到区块链上把属于你的钱拿走,不用再次通过对方授权。
这东西其实和主链交易没有可比性——它是完全另一种交易形式。
但是,不管它对于扩大交易量有没有好处,是像乐观派说的能把交易全部转到链下还是悲观派认为的只会增加拥堵毫无作用,它至少提供了另外一种支付手段。
所以总结起来就是:
1. 隔离见证是软分叉甚至不分叉。
2. 隔离见证理论上来讲可能提高2-3倍的交易量。
3. 隔离见证支持闪电网络,可以将一部分交易挪到链下进行,减轻主链的负担。
那么,这么好的方案,大家还在等什么呢?
当然是
利益纠葛
了。
今天,我们讲完了分叉和扩容的技术方案。
明天,我们会讲一些分叉方面技术以外的事情,也就是
各大利益集团之间的
江湖
博弈。