8

我有一个查询,每个节点中保存的区块链数据在哪里。在谷歌、StackOverflow 和一些博客中搜索了很长时间后,得到了很多答案:比如:它保存在像 level-DB 或 Rocks-DB 这样的数据库中,有人说它保存在内存中的变量中,有人说它保存在一个变量中文件(来自 hyperledger-fabric)。

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

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

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

简而言之,我的问题是:

数据(不可变块)如何存储在区块链中每个完整节点的分类帐上?它是在内存中,在文件中(如 JSON、CSV 文件)还是在数据库中

4

4 回答 4

11

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

于 2020-08-14T22:51:57.897 回答
5

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

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

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

于 2020-08-13T09:33:41.173 回答
5

这取决于节点客户端的实现。几乎所有这些都使用键值存储来提高效率。仅举几例:

  • 比特币核心使用 LevelDB
  • GoEthereum(又名 geth)使用 LevelDB
  • Rippled(XRP 客户端)可以配置为使用 RocksDB 或 NuDB
于 2020-08-14T04:20:49.017 回答
-2

它存储在分类帐中。现在该分类帐可以采用任何 NO-SQL 技术堆栈。

于 2020-08-14T16:28:39.220 回答