降低区块链节点存储占用的方法总结

降低存储占用的方法总结

​ 随着区块链的不断运行,产生的数据越来越多,占用的存储也就越来越多。在这一点上,对于任何区块链项目都是一样的。在传统的中心化项目里,可以通过删除历史数据而降低对存储占用,保证在业务稳定的情况下,对存储的占用是稳定的, 对于区块链而言,历史数据是对新数据可信的证明,是不能随意删除的,这也就意味着存储占用只能是不断的增加,所以存储问题将是所有区块链项目面临的一个重大问题。本文讨论几种减缓存储增加速度的方法。本文讨论的方法以以太坊系公链为基础。

目标

​ 降低矿机的存储占用。

存储数据汇总

先看看目前矿机存储的区块链主要数据都有哪些。

对于以太坊系的公链(全同步矿机)来说主要是两类数据:1、区块数据 2、账户状态数据。下面具体看看都是什么样的数据,在leveldb数据库中都是以K:V的形式进行存储

1、区块数据:

​ a 区块总难度td : {headerprefix-number-hash : td}

​ b 区块header数据 : {blockhashprefix-hash:number, headerprefix-number:hash, headerprefix-number-hash:header}

​ c 区块body数据 : {bodyprefix-number-hash:body} // body即transactions,uncles

​ d 区块交易收条:{blockreceiptsprefix-number-hash:receipts} //receipts即块内所有的交易收条。

​ e 交易索引:{lookupprefix-txhash : blocknumber-blockhash-index}。//注:所以交易的查询是根据交易hash找到所在的blocknumber,blockhash,index,然后根据blocknumber,blockhash找到对应的body,然后根据index定位到交易在body中的位置。

​ f preimages : {preimagefix-txhash:preimage} //注:用于记录opsha3时的hash与data,用于vmdebug。

2、账户状态数据:

​ a 状态数据:{root : allaccountinfo} //每个区块都会有对应的stateroot 与 allaccountinfo

以上是对占用存储数据的整理,针对以上数据,如果要减少对存储的占用,大致有以下几种方式。

方法总结

1、将区块数据进行压缩存储

​ 根据测试,将区块body数据以及交易收条进行压缩存储,可降低区块数据30% ~ 65%的存储。交易收条越多,压缩比越大。

2、部分区块数据不存储

​ 考虑上述区块数据存储的必要性,如果不必要是否可以不进行存储。

​ 比如区块交易收条,对于矿机(或者部分矿机)而言,在校验完区块交易后,只要不需要查询交易收条,那收条就是没用的。而对于挖矿矿机,只负责挖矿,基本不涉及交易的查询。根据测试,普通交易的交易收条大小占整个交易数据大小的50%以上。 注:普通交易数据大小 = 交易大小 + 收条大小 + 交易索引

3、删除旧的状态数据

​ 状态数据存储的是区块对应的账户状态,在矿机以快速同步模式启动节点时,就相当于只保留区块数据,不存储状态数据。由于状态数据是需要参与到区块共识的,所以理论上保留最近的状态数据,删除旧区块的状态数据是可以的。

4、中心化存储并多副本备份

​ 完整的数据只保留在部分矿机或者专用服务器或公有云,其他矿机只保留验证信息。最近产生的区块尽量所有矿机都保存,然后根据一定的规则去删除旧的区块数据,但留下可验证的区块信息。

5、状态分片

​ 根据账户信息进行分片,每个分片只关心对应账户的交易与存储。实现复杂,会涉及到跨片/跨链交互。

6、存储分片

​ 不分片状态,只分片存储。简单模型如下:两个矿机,一个存储块号为单数的完整区块数据,一个存储块号为双数的完整区块数据。最近的块都进行存储,定时清除不属于自己应该存储的块数据,保留header,删除body,删除状态数据。

目前总结以上6种方式,欢迎讨论。

THE END!

你可能感兴趣的:(区块链)