CITA底层数据存储与空间占用问题

各位大侠,我在进行数据存证时遇到了如下问题:

合约:

function add(para) {
    emit event(msg.sender, xxx, yyy, zzz);
    evidence[key] = value;
}

即每笔存证产生一个事件、一条KV。

示例:
(“XXXX-20200924-PRD-INDEX-001”, “XXXX-20200924-PRD-DATA-001”)

现在经过一段时间的运行,存证数据大概有1000w条。
当我去查看CITA节点的存储情况时,发现比预期占用多很多,请问是否正常?

相关数据如下:

版本:0.24.2 国密
区块数量:122343
交易数量:10286341
节点数量:4共识
$ pwd  
/home/cita/2/data 
$ ls -l 
total 160 
drwxr-xr-x. 2 root   3 Sep 16 05:54 authorities 
drwxr-xr-x. 2 root 464 Sep 24 02:44 nosql 
drwxr-xr-x. 2 root 659 Sep 23 18:11 statedb 
drwxr-xr-x. 2 root  17 Sep 23 00:42 txwal 
drwxr-xr-x. 2 root  65 Sep 24 06:18 wal
$ du -sh * 
8.0K    authorities 
**3.8G    nosql **
**39G     statedb** 
1.1M    txwal 
29M     wal

nosql文件夹共有463个文件,以 000152.sst 形式文件为主
statedb文件夹共有658个文件,以013773.sst 形式文件为主

按照应用层算法,一笔交易就算1k,1000笔1M, 1000000笔1G,1千万笔也就10G,为什么会多出这么多?

另外,请问什么工具可以解析 sst 文件?

谢谢

sst文件就是rocksdb的文件。
cita使用了两个rocksdb实例:nosql下面是一个实例,保存交易,块等结构;statedb下是另外一个实例,保存链上状态,receipt等信息。

因为区块链有些额外的元信息,所以最终使用的存储肯定会大于纯的存证数据大小。
cita自带的存证功能可以将额外信息降低到最小,但是也要多占用50%的存储空间。
自己实现的存证合约占用空间会更大,这个要看具体合约的设计。

还有一个因素是,rocksdb本身会有空间放大效应。


区块链本身是写多读少的,为了保证写入速度,空间放大会比较明显一些。
如果持续观测的话,会发现磁盘占用其实是一个波动的曲线。

因此,要从存证的数据量推算具体磁盘占用是比较困难的。就帖子里面展示的内容,这个磁盘占用应该还在正常范围之内。