Hyperledger Fabric数据存储结构

Hyperledger Fabric数据存储结构

概述

Hyperledger Fabric支持多链。每个链对应一套账本。所以区块链每个peer节点会维护多套账本。每个超级账本包含以下元素:

  • 账本编号:快速查询存在哪些账本
  • 账本数据:实际的区块数据存储
  • 区块索引:快速查询区块/交易
  • 状态数据:最新的世界状态数据
  • 历史数据:跟踪键的历史

每个peer节点会维护4个DB,它们分别是:

  • idStore,存储chainID。用户快速查询节点存在哪些账本
  • stateDB,存储world state(默认为LevelDB,可替换为CouchDB)
  • historyDB,存储stateDB的key的版本变化
  • blockIndex,存储区块文件索引

如下图:(因只展示了单链的数据存储情况,故idStore未在图中展示)


fabric db.png

其中,世界状态和账本数据是两个账本最重要的组成部分。


ledger.png

账本编号(LedgerId)

账本编号的数据存储在LevelDB数据库中,只是记录了有哪些账本,创建新的账本会检查是否有相同的账本编号存在,保证了全局唯一性。账本编号库并不存储与区块相关的数据。

账本数据(Ledger)

账本数据是以二进制文件的形式存储的,每个账本数据存储在不同的目录下。账本数据的所有操作都是通过区块文件管理器(blockfileMgr)实现的。区块文件管理器创建的文件以“blockfile_”为前缀,6位数字为后缀,后缀必须是从小到大连续的数字,中间不能有缺失。默认的区块文件大小上限是64M(目前这个大小是硬编码在代码中的),一个账本能保存最大数据量大概是61TB。
下图是区块账本数据的结构:


ledgerdata.png
  • 信息描述:B代表区块链账本数据。其中B0为创世区块,其中包含了区块头H0,区块数据D0(因为是创世区块,区块数据里不包含交易数据),区块元数据M0。区块B1区块头H1,其中包含了前一个区块B0的加密hash和本身区块的加密hash。

区块(Block)

block.png

每个区块包含三个部分。

区块头(Block Header)

区块数(Block Number):一个从0(创世区块)开始的整数,并且对于附加到区块链的每个新块增加1。
当前区块hash(Current Block Hash):当前区块中包含的所有交易的hash。
前一区块hash(Previous Block Hash):前一个区块的hash。

区块数据(Block Data)

区块数据包含了一组交易,交易在区块创建时写入。

区块元数据(Block Matadata)

元数据包含了区块创建时间,写入程序的证书,公钥和签名。

交易(transaction)

transaction.png

交易头(Header)

交易头中包含了一些重要的交易元数据,例如链码的名称、版本。

签名(Signature)

包含由application创建的加密签名。它是由application的私钥生成的。用于检查交易有没有被篡改。

交易提案(Proposal)

包含了由application生成的交易请求参数。

交易提案返回(Response)

包含了由背书节点返回的模拟执行结果(读写集RWset)。这是链码的输出,如果交易验证通过,这些数据会被用于更新世界状态。

背书(Endorsements)

包含了交易的背书。一个返回对应多个背书。

区块索引(Block Index)

Hyperledger Fabric提供了多种区块索引的方式,以便能快速找到区块。索引的内容是文件位置指针(File Location Pointer)。文件位置指针由三个部分组成:所在文件的编号(fileSuffixNum)、文件内的偏移量(offset)、区块占用的字节数(bytesLength)。

状态数据(State Database)

状态数据(state database)记录的是交易执行的结果,最新的状态代表了通道(channel)上所有键的最新值,所以又称为“世界状态”。状态数据库目前支持LevelDB和CouchDB。

  • LevelDB(默认的KV数据库):支持键的查询,组合键的查询、范围键的查询。
  • CouchDB(可选的KV数据库):支持键的查询、组合件的查询,还有复杂的查询。

不同账本的状态数据库存放在不同的目录下,不同链码的数据是按链码编号(chaincodeID)作为命名空间来划分数据。

状态数据库的基本操作是基于键值对的管理。读取状态数据的时候不用指定版本,读取到的状态数据是某个时刻最新的版本,返回的数据包含版本和数据两个部分。


worldStatus.png
  • 信息描述:状态数据库W包含两条数据。第一条,key=CAR1,value=Audi,版本=0.第二条,key=CAR2,value为一条复杂json表达式,版本也是0.

上述图片描述了世界状态数据库的基本存储结构。当发生交易后,改变数据内容,并变更版本号。

历史数据(History Database)

历史数据记录了每个状态数据的历史信息,历史信息是保存在LevelDB数据库中的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350