通过前边两篇文章 比特币技术入门2(数据模型) 和 比特币技术入门3(写入流程) 的介绍,我们可以估算系统的吞吐率,这个系统满足现实世界的需求吗?有什么改进方案呢?
本文预计阅读时间 4 分钟。
系统问题
在传统的关系型数据库的使用场景中,比如银行,为了保证数据不丢失,一般都是做主备的,数据一共有两份,每个节点存储一份,单机存储能力就是整个系统的最大存储数据量。
进入大数据时代,第一个问题就是数据量增多,一个节点的存储能力已经不能满足需求了,因此需要用多个节点来一起存储,每个节点存储一部分数据。如GFS、HDFS等分布式文件系统。在这些系统中为了保证数据不丢失,通常采用三副本机制,即每个数据存储 3 份,分别存放在不同节点。
回来看比特币系统,每个节点存储了全量数据,有几个节点就有几个副本,这个副本量可以达到几千。而他的存储能力也和传统的单机数据库一样,这就必然会导致一个问题,数据多了怎么办?
另一个问题是,区块链平均每10分钟产生一个区块,每个区块大概存储 2000 笔账单,那就是每秒 3.3 笔账单。对于一个全球电子货币系统,这个吞吐率是很低的。这么低的吞吐率正好解决了上边那个问题,因为数据就不会太多。就这样,系统维持在一个数据缓慢增长的水平。
但是,双十一支付宝的峰值是每秒 25.6 万笔。作为一个全球电子货币系统,其吞吐率的需求比支付宝只高不低。这个吞吐率极大的限制了比特币的应用场景。于是,在比特币的社区,人们也分成了两个阵营表达了对这个问题的看法。
是否要增加区块大小?
正方:可以合理增加区块大小。
反方:保持区块大小不变,扩大网络规模。
(正方)可以增加每个区块的大小,原来是1M,增加为2M,4M,8M,并随需求逐渐增大。
(反方)增大区块的大小会增加数据量,要知道区块链的设计之初是允许任何人随时加入或离开网络的,每次加入网络需要下载全部数据。数据量的增加也会相应增大节点加入的成本,导致一些小节点无法支撑只能被关闭。这样,比特币系统可能被大公司掌控。
(正方)当前区块链总大小 145GB,每月增加 4G,将块大小翻倍也就是每月增加 8G,亚马逊云平台每月每 G 的费用是 2 美分,因此合理增加块大小不会导致节点退出。
(反方)这个推理目光短浅,翻一倍只能满足一时,未来会不停翻倍,有可能会到达每块 1GB 的大小。到时候普通人就没法运行完整节点了。
一些解决方案
1、segregated witness(隔离证明):这个机制已经被吸收进比特币系统了。
基本功能是:在不改变块大小的基础上,使用新的块结构,与原系统无缝集成,达到增加块容纳的交易数的目的。
基本原理:原来每笔交易的输入部分会带一个签名,现在将这个签名移到交易的末尾,并将这些签名压缩成原来的 1/4,使得一个块能容纳的交易适当增多。(具体可以参考:http://learnmeabitcoin.com/faq/segregated-witness)
隔离证明在容量问题上属于扬汤止沸的。但是隔离证明主要解决了另一个问题,我们下篇介绍。
2、Lightning(闪电网络):在区块链的基础上构建的应用层闪电网络,目的是加速交易。区块链只记录少量验证信息,大量交易数据放在上层应用中(具体可以参考:http://lightningbitcoin.io/)。这样,区块链更类似一个分布式校验系统。
总结
比特币的区块链每个节点存储了所有历史数据,副本数和节点数相同。由于交易数据量小,限制写入速度,数据不会快速增长,可以让比特币系统在当前保持稳定运行。但是这种限制不能满足现实世界未来的需求,且不一定适合其他应用场景。在比特币的发展过程中也经历了技术升级,逐渐让这个系统变得更好。
致谢:DPer