实现持久化逻辑前,需要先确定在数据库中如何存储数据。对此,我们计划参考比特币的实现。
简单来说,比特币使用下面两个bucket来存储数据:
- blocks存储用于描述所有block的元数据信息。
- chainstate用于存储blockchain的状态,包括所有交易元数据和部分元数据。
同时,出于性能考虑,每个block存放在独立的文件,这样获取单个block时不需要加载所有block。但为了简化,我们还是把所有数据存储在一个文件中。
在blocks bucket中,存储如下k-v对:
- 'b' + 32-byte block hash -> block index record
- 'f' + 4-byte file number -> file information record
- 'l' -> 4-byte file number: the last block file number used
- 'R' -> 1-byte boolean: whether we're in the process of reindexing
- 'F' + 1-byte flag name length + flag name string -> 1 byte boolean: various flags that can be on or off
- 't' + 32-byte transaction hash -> transaction index record
在chainstate bucket中,存储如下k-v对:
- 'c' + 32-byte transaction hash -> unspent transaction output record for that transaction
- 'B' -> 32-byte block hash: the block hash up to which the database represents the unspent transaction outputs
(设计原理请参考这里)
由于目前实现还没有设计交易,因此我们仅需要实现blocks bucket。同时,就如上面所说,所有数据存储在一个单一的文件中,因此不需要任何和文件号相关的信心。所以,我们仅需要一下k-v数据:
- 32-byte block-hash -> Block structure (serialized)
- 'l' -> the hash of the last block in a chain
这就是我们实现持久化所需的相关信息。