图片不能显示时,请查看原文:https://lessisbetter.site/2020/01/03/fabric-peer-ledger/
文章目录
区块链最核心的是 可信数据,所有的功能与设计根源都是数据。本次从数据存储的角度,看一看Peer。
账本
区块链的数据存储在账本中,账本包含:
- 区块存储
- 区块文件
- 区块索引数据库
- 世界状态数据库
- 历史数据库
- 私有数据数据库
关于账本以上各数据库的工具,官方文档中对区块存储和世界状态数据库介绍的比较详细了,但我们介绍下它没有提到的。
区块文件和区块索引数据库
区块是保存在文件中的,为了快速查找区块、交易,Fabric建立了索引,指明某通道某区块高度的第x个交易,是存在哪个文件,偏移量是多少。当然,索引还包含了区块高度、区块hash等,方便根据高度、hash查询区块。
上图展示了一个区块文件存储区块的情况,每个区块包含:
- 区块长度
- 区块头
- 每条交易长度、交易数据
每个区块的开始位置、交易的开始位置,在写区块的时候记录下来,然后写到索引数据库(Index DB)。
整个Fabric网络只有1个区块索引数据库,也就是多通道共用一个。
历史数据库
用来记录交易中每个状态数据的历史信息,直白点可以理解为链码中某个key的历史数值。它的key实际是{通道id+链码id, key, 区块高度, 交易在区块中的序号}
组成的复合key,值为空,并且只包含有效的交易。
有这样一个问题:值为空,到底怎么查询到历史状态呢?
答:通过历史数据库合成复合key,但复合key中没有交易在区块中的序号,创建一个迭代器,迭代器可以获取包含key的复合key,然后从复合key中提取到交易在区块的序号,然后去区块文件中提取交易,再提取到写集的Value,就可以合成某个key的所有历史值。
因此查询历史状态,需要结合历史数据库和区块文件。
各数据库实现
区块文件使用文件直接存储区块,没有使用数据库的原因是:区块是一种自然的追加操作,写入后不再修改,即不会覆盖历史区块,使用文件系统直接存储区块,可以达到区块最快落盘的目的,因为向文件写区块是顺序写,而写数据库是随机写,磁盘(包含HD、SSD)的顺序写性能要高于随机写。
世界状态数据库可以使用leveldb或者CouchDB,CouchDB支持富查询功能,当链码数据按JSON建模时&#x