在比特币核心的debug.log文件中,缓存配置描述如下。
缓存配置:
使用2.0 MiB建立块索引数据库
用8.0 MiB实现链式状态数据库
将441.0 MiB用于内存中的UTXO集(加上多达286.1 MiB的未使用内存池空间)
这里为chainstate数据库分配的8MB缓存空间是用来做什么的?它和内存中的UTXO集有什么区别和联系?
比特币核心
utxo集合
调试
隐藏物
分享
改进这个问题
跟随
两小时前编辑的
迈克尔·福克森
582077银牌2222铜牌
3月27日4:05问
戈涅夫
10377青铜徽章
添加评论
1个答案
1
块索引和链状态数据库是LevelDB数据库。LevelDB有自己的缓存和缓存管理。因此,为块索引的LevelDB数据库缓存分配了2个MiB,为链状态的LevelDB数据库缓存分配了8个MiB。
然而,比特币核心本身会进行额外的缓存,尤其是存储在链状态数据库中的UTXO集。因此比特币核心也为自己分配了441个MiB来管理UTXO集合条目的缓存。
不同之处在于,LevelDB的缓存组织方式不同于比特币核心的内存UTXO集,因为LevelDB是一个数据库系统。因此,它针对数据处理进行了优化,并且具有一种可推广到各种数据库用途的策略。然而,比特币核心知道它将哪些数据放入数据库,因此它可以更有效地缓存这些数据。它在需要序列化和写入数据库之前缓存数据。因为比特币核心知道如何使用数据,所以它通过内存中的UTXO集进行缓存可以针对实际用例进行优化。
分享
改进这个答案
跟随
3月27日4:49回答
麻吉弟弟周立铭♦
52.9k44金徽章5555银徽章108108铜徽章
非常感谢。你的回答很有帮助。因此,我对这些缓存的用途的理解如下(如果我错了,请纠正我):当一个节点验证一个事务时,对于块中使用的UTXO,该节点首先在441MiB内存UTXO集中执行一个查询。如果找不到,则需要访问磁盘中的levelDB数据库。但是,由于levelDB还有一个8MiB缓存,因此节点需要首先查询这个8MiB缓存。如果仍然找不到,请转到磁盘进行搜索,并将搜索结果写入8MiB缓存,而不是441MiB内存UTXO集。是吗?——戈涅夫3月27日5点47分
@好的,没错麻吉弟弟周立铭♦ 3月27日17:53
添加评论