【摘要】 Hyperledger Fabric区块链结构由区块头和区块体组成,并通过父区块哈希编码构成唯一链接,Hyperledger Fabric加入一层状态缓存设计,用以提高读写性能。
Hyperledger Fabric本质上是一个分布式账本,在底层结构中都是通过键值对的方式来存储数据。而区块链1.0为了实现数据的时间可回溯性和数据防篡改机制,在链中并不保存数据的状态,而…
Hyperledger Fabric区块链结构由区块头和区块体组成,并通过父区块哈希编码构成唯一链接,Hyperledger Fabric加入一层状态缓存设计,用以提高读写性能。
Hyperledger Fabric本质上是一个分布式账本,在底层结构中都是通过键值对的方式来存储数据。而区块链1.0为了实现数据的时间可回溯性和数据防篡改机制,在链中并不保存数据的状态,而只保存对数据的变更。这就使得对某条数据的状态查询需要进行全链遍历,其查询性能很难满足一些企业级业务的性能需求,因此Hyperledger Fabric引入了“世界状态(World State)”这一概念。
Fabric 里的数据以分布式账本的形式存储。账本由一系列有顺序和防篡改的记录组成,记录包含着数据的全部状态改变。账本中的数据项以键值对的形式存放,账本中所有的键值对构成了账本的状态,也称为“世界状态”( World State )。当区块中保存某一条记录时,会同步更新对应Key的世界状态。当需要查询某个键值时,只需要查询对应的世界状态即可,而无需进行全链遍历。
世界状态是脱链保存在LevelDB/CouchDB结构中的,是一种链外附加缓存机制,世界状态的丢失并不会对区块链中的数据产生影响。
每个通道中有唯一的账本,由通道中所有成员共同维护着这个账本,每个确认节点上都保存了它所属通道的账本的一个副本,因而是分布式账本。对账本的访问需要通过链码实现对账本键值对的增加、删除、更新和查询等的操作。
账本由区块链(File System)和状态数据库(Level DB)两部分组成。如下图所示
状态数据库,记录了账本中所有键值对的当前值,相当于对当前账本的交易日志做了索引。链码执行交易的时候需要读取账本的当前状态,从状态数据库可以迅速获取键值的最新状态。
如果没有状态数据库,要获得某个键值时,需要遍历整个区块链中和该键值相关的交易,效率非常低,因此,读取状态数据库可以认为是快速定位和访问某个键值的方法。另外,当状态数据库出现故障的时候,可以通过遍历账本重新生成。
当一个区块附加到区块链尾部的时候,如果区块中的有效交易修改了键值对,则会在状态数据库中作相应的更新,这样区块链和状态数据库始终保持一致。
状态数据库原理上可以是各种键值数据库,Fabric 缺省使用的是 LevelDB ,也支持 CouchDB 的选项。CouchDB 除了支持键值数据之外,也支持 JSON 格式的文档模型,能够做复杂的查询。
数据存在节点:
/var/hyperledger/production/ledgersData
peer节点上账本数据库与区块数据文件路径的默认配置列表
数据库与文件 | 文件路径 |
---|---|
id store数据库 | /var/hyperledger/production/ledgersData/ledgerProvider |
区块数据文件 | /var/hyperledger/production/ledgersData/chains/chains |
隐私数据库 | /var/hyperledger/production/ledgersData/pvtdataStore |
区块索引数据库 | /var/hyperledger/production/ledgersData/chains/index |
状态数据库 | LevelDB默认为/var/hyperledger/production/ledgersData/stateLeveldb CouchDB需要指定服务器地址、用户名、密码等配置参数 |
历史数据库 | /var/hyperledger/production/ledgersData/historyLeveldb |
transient隐私数据库 | /var/hyperledger/production/transientStore |