比特币存储机制
  比特币存储系统由两部分组成: kv 数据库(levelDB)索引和普通数据文件。普通文件用于存储区块链数据,kv 数据库用于存储区块链元数据。用于存储区块链数据的普通文件以 blk00000.dat , blk00001.dat 文件名格式组成。其中 index 目录存储用于存储区块元数据。
普通区块数据文件
  为了快速检索区块数据,每个文件的大小是128 M Bytes。区块里的数据(区块头和区块里的所有交易)都会序列成字节码的形式写入 dat 文件中。在序列化的过程中,如果检测到当前写入文件尺寸加上区块尺寸大于 128 M Bytes,则会重新生成一个 dat 文件。
kv数据索引
  区块的索引元数据格式如 格式, 其中 xxxxx 为 dat 文件序号,npos 为区块写入 dat 文件的起始位置。 
  交易的元数据格式如 格式, 其中 xxxxx、npos 和上面的描述一致,nTxOffset 为写入 dat 文件的起始位置(基于npos 位置)。
  上述所有元数据都将写入 kv 数据库中,其中 blockhash/txHash 将作为后续查询具体数据在 dat 文件中的索引使用。
LevelDB
  Google 的 LevelDB 数据库存储区块链元数据。Leveldb是一个google实现的非常高效的kv数据库,并且是开源的。
  它的一个主要特点就是写的性能非常好,适用于比特币客户端这种应用场景。
  levelDB虽然是个数据库,但是并不像其它的主流数据库(mysql ,oracle等)可以提供客户端连接服务。它只是一个基于c++的lib库而已,所以我们使用起来也很简单,直接在工程里链接lib库文件。
比特币代码分析11 比特币存储机制_第1张图片