问题描述
我有一个查询,每个节点在哪里保存区块链数据。在Google,StackOverflow和一些博客中进行长时间搜索后,得到了很多答案:例如:它保存在level-DB或rocks-DB等数据库中,有人说它保存在变量的内存中,有人说它保存在变量中。文件(来自hyperledger-fabric)。
我想知道,是否存在一种存储大多数区块链框架所遵循的块的特定方法?
我知道区块链的当前状态/世界状态保存在数据库中。当前状态/世界状态与实际的区块链完全不同。在当前状态或世界状态下,可以修改数据,但在实际的区块链块/数据中是不可变的。
为简单起见,我的问题是:
数据(不可变块)如何存储在区块链中每个完整节点的分类账中?是在“内存”中,还是在文件(例如JSON,CSV文件)中,还是在数据库中
解决方法
区块链是一个分布式数据库。这意味着数据分散在节点(参与计算机)周围。每个节点都可以决定如何存储数据(以及是否要存储数据)。
访问数据时,实际上是在向网络上的节点发送消息。原则上,如果您只想发送交易,则不必在计算机上存储区块链的任何部分。区块链协议保证您可以正确,可靠地从接收到的信息中重建数据。
对于每个节点,存储完全取决于软件的编写和配置方式。对于以太坊和比特币等大型区块链,整个区块链数据约为数百GB,因此,如果您将软件配置为在本地存储,则该软件通常会从其他计算机下载大量大文件并将其存储在磁盘上。对于某些程序,作者可能更喜欢使用数据库而不是文件。在大多数情况下,部分数据将通过操作系统缓存和程序自己的数据结构临时保存在内存中。
,这取决于节点客户端的实现。几乎所有人都使用键值存储来提高效率。仅举几例:
- 比特币核心使用LevelDB
- GoEthereum(又称geth)使用LevelDB
- Rippled(XRP客户端)可以配置为使用RocksDB或NuDB
它存储在分类帐中。现在,分类帐可以采用任何NO-SQL技术堆栈。
,比特币节点将原始块数据保留在磁盘上的.bitcoin / blocks / blk * .dat文件中。每个blknnnnnn.dat的大小为128MB,截至目前的数据总大小为300GB。 有关所有已知块的元数据都保存在.bitcoin / blocks / index / nnnnnn.ldb文件中的Level DB文件中。