实际区块链状态数据存储在哪里:内存、文件还是数据库



我有一个查询,每个节点中保存的区块链数据在哪里。在谷歌、StackOverflow和一些博客中进行了长时间的搜索后,得到了很多答案:比如:它保存在级别数据库或岩石数据库之类的数据库中,有些人说它保存在内存中的变量中,还有一些人说它存在文件中(来自超级账本结构(。

我想知道,有没有一种存储区块的特殊方法,大多数区块链框架都遵循这种方法?

或者所有这些框架都选择不同的方法(如文件、内存或DB(。

我知道区块链的当前状态/世界状态保存在数据库中。当前的状态/世界状态与实际的区块链完全不同。在当前状态或世界状态下,数据可以修改,但在实际区块链块/数据中是不可变的。

简而言之,我的问题是:

区块链中每个完整节点的账本上的数据(不可变块(是如何存储的?它是在内存中、文件中(如JSON、CSV文件(还是在DB

比特币节点将原始区块数据保存在磁盘上的文件中。Bitcoin/blocks/blk*.dat。每个blknnnnn.dat的大小为128MB,截至目前,数据的总大小约为300GB。所有已知区块的元数据都保存在.bitcoin/blocks/index/nnnnnn.ldb文件中的级别DB文件中。

区块链是一个分布式数据库。这意味着数据分散在节点(参与的计算机(周围。每个节点都可以决定如何存储数据(以及是否存储数据(。

当您访问数据时,实际上是在向网络上的节点发送消息。原则上,如果你只想发送交易,你不必在电脑上存储区块链的任何部分。区块链协议保证您可以从收到的信息中正确、可靠地重建数据。

对于每个节点,存储完全取决于软件的编写和配置方式。对于以太坊和比特币等大型区块链,整个区块链数据约为数百GB,因此,如果您将软件配置为本地存储,软件通常会从其他计算机下载大量大文件并将其存储在您的磁盘上。对于某些程序,作者可能更喜欢使用数据库而不是文件。在大多数情况下,部分数据将由操作系统缓存和程序自己的数据结构临时保存在内存中。

这取决于节点客户端的实现。几乎所有这些应用程序都使用密钥值存储来提高效率。具体列举几个:

  • 比特币核心使用LevelDB
  • GoEthereum(又称geth(使用LevelDB
  • Rippled(XRP客户端(可以配置为使用RocksDB或NuDB

它存储在Ledgers中。现在,账本可以采用任何NO-SQL技术堆栈。