[block #8] 应对区块链数据大爆炸
对技术话题没有兴趣的请直接跳到“题外话”部分。
比特币诞生至今八年多,累积的区块数据近140GB,加上索引文件则突破了170GB。
下图展示的是2009到2017年的数据变化曲线。
你可能会觉得是数据量在以指数级增长。其实不然。
我们看一下最近一年的变化。
这是一条非常平直的线。平均每月增加4GB多一些,一年增加50多GB。
线性变化的原因在于无论mempool多大,比特币的区块上限是1MB。
当交易量足够多,几乎填满每个区块时,总数据量就以匀速增长。
与比特币不同,以太坊没有硬性规定区块的大小。
我们不妨对比一下两者的区块数据增长趋势(含索引):
蓝线代表比特币,红线代表以太坊。
以太坊的数据量在最近一年间从50GB暴增到320GB,而且还没有出现放缓之势。
这些数据不光需要下载、存储,还需要耗费大量资源进行验证、索引和状态更新。
凡是今年同步过以太坊或比特币的人都知道那是个多么缓慢的过程。
如何应对区块链数据的增长、加速区块同步呢?
首先强烈建议使用SSD。普通硬盘在连续读写时性能不错,但是验证区块和创建索引时需要频繁地跳跃式读写区块文件,SSD在这方面的优势非常明显。
其次建议增大缓存。
bitcoind下传入-dbcache=<n>参数,n是以MB计的数据库缓存大小,范围是4到16384,默认只有300,建议设为2048或更高。geth下传入--cache=<n>,同样以MB计。
如果SSD不够用,可以把区块数据迁移到大容量硬盘上。然后更改数据目录:
bitcoind下传入-datadir=<dir>,dir是数据目录。geth下传入--datadir=<dir>。
bitcoind默认目录:
Linux: ~/.bitcoin
Mac: ~/Library/Application Support/Bitcoin
Windows: %APPDATA%\Bitcoin
即\Documents and Settings\UserName\Application data\Bitcoin
或\Users\UserName\Appdata\Roaming\Bitcoin
Ethereum默认目录:
Linux: ~/.ethereum
Mac: ~/Library/Ethereum
Windows: %APPDATA%\Ethereum
另外可以用一个技巧综合SSD的速度优势和HDD的容量优势:
需要频繁读写的状态数据放在SSD上,需要更多空间的区块数据放在HDD上,
然后用symlink(ln -s)把后者连入前者目录。
注意:bitcoind的区块位于blocks目录中;geth的位于chaindata中。
如果不需要区块链完整历史,只要最新状态的话,
可以启用剪枝模式,节省大量存储空间。
bitcoind下传入-prune=<n>,n为1时允许用rpc手动剪枝,n大于550时表示区块上限,
单位MB,达到这个值时自动删除老区块数据。此参数不能与-txindex或-rescan兼容。
geth下可以运行removedb命令删除本地数据库,
然后重启时传入--fast参数,下载剪枝过的状态树。
题外话
比特币区块链目前得以线性增长归功于中本聪在七年前写的一行代码:
static const unsigned int MAX_BLOCK_SIZE = 1000000;
它规定,区块的上限是一百万字节(约1MB)。
这不仅遏制了垃圾交易,也确保了区块链在交易量饱和时不会超线性爆炸,
间接地让更多人可以用廉价的设备运行全节点(full node),
增加网络的去中心化程度和安全性。
这行代码现在已经退役,目前区块大小的计算方式不是直接看字节数,
而是根据数据类型乘以不同的权重再求和。
对于隔离见证的“见证”部分(也就是签名),每个字节按四分之一算。
所以虽然区块上限仍然是一百万字节,原始字节数其实可以稍微超过一些。
有些人认为交易量饱和后应该提高甚至取消区块大小的上限。
这种扩容方式简单粗暴,除了必须通过硬分叉实现之外,还有诸多弊端:
大区块的传播需要更多时间,会增加临时分叉的概率,降低安全性。
大区块的同步更容易被敌对势力检测到,会增加节点被封杀的可能,降低安全性。
大区块的验证和存储需要更多资源,会增加运行全节点的成本和系统的中心化,降低安全性。
而且大区块无法从根本上实现超低延时、超低手续费和超高交易量的目标。
最有希望解决这些问题的是基于侧链的二层支付网络,
因为侧链上的交易可以瞬间完成,只有最终结算时才需要主链的确认。
然而矿工利益集团担心主链交易分流后,手续费收入会减少,
所以他们抹黑侧链和闪电网络,制造舆论诋毁Core开发者,
释放垃圾交易延迟主链上的交易确认时间、提高平均手续费,
目的就是为了力推各种大区块扩容方案,
包括Bitcoin XT、Bitcoin Classic、Bitcoin Unlimited(BU)、Bitcoin ABC、Bitcoin Cash(BCH/BCC)以及最新的SegWit2X(S2X)提案。
前几种方案支持者甚少,都在苟延残喘。
Bitcoin Cash在2017年8月1日成功分出一条支链,BCH水军甚至喊出
“可能是分叉后最纯正的比特币”那样底气不足、令人啼笑皆非的口号,
可还是改变不了它山寨币的本质和日渐衰落的市价。
(参阅:[block #7] 好好开车别急刹:谈比特币现金的紧急难度调整)
而SegWit2X是矿工利益集团蓄势待发的新一轮攻击,
意图挟持比特币名号和控制权。
从目前的区块信号看,将近94%左右的算力表示支持S2X。
Core开发者一致反对,新发布的Bitcoin Core 0.15也不包含2X代码。
交易所则意见不一。
很快,我们将目睹比特币的一场新危机。