深度探索区块链/分布式账本存储(5)

一。概述

 

二。读写集

(一)。交易模拟和读写集

      

(二)。交易验证和世界状态更新

(三)。模拟和验证示例

 

三。账本编号

超级账本支持多账本(详细内容参考第7章实现数据隔离的多链及多通道),每个账本的数据是分开存储的。

账本编号(LedgerID)的数据存储在LevelDB数据库中,只是记录了有哪些版本,创建新的账本会检查是否有相同的账本编号存在,

这保证了全局唯一性。账本编号库并不存储与区块相关的数据。这和区块索引不一样。

四。账本数据

账本数据(Ledger)是以二进制文件的形式存储的,每个账本数据存储在不同的目录下。

后面内容都是在已经区分了账本的情况下再对数据进行查询的。

基于文件系统的区块存储实现了如下功能接口。

【1】。账本存储管理

A。提交区块到账本(AddBlock)

B。获取区块链信息(GetBlockchainInfo)

C。获取区块数据(RetrieveBlocks)

D。关闭区块存储(Shutdown)

【2】。索引管理:跟踪区块和交易保存在哪个文件。

A。根据哈希值获取区块(RetrieveBlockByHash)

B。根据区块编号获取区块(RetrieveBlockByNumber)

C。根据交易编号获取交易(RetrieveTxByID)

D。根据区块编号和交易编号获取交易(RetrieveTxByBlockNumTranNum)

E。根据交易编号获取区块(RetrieveBlockByTxID)

F。根据交易编号获取交易验证码(RetrieveTxValidationCodeByTxID)

账本数据的所有操作都是通过区块文件管理器(blockfileMgr)实现的,定义如下:

type blockfileMgr struct{
 rootDir         String     //区块链中区块存储的根目录
 conf            *Conf     //配置信息
 db              *leveldbhelper.DBHandle    //数据库指针
 index           index        //区块索引接口
 cpInfo          *checkpointInfo       //区块检查点信息
 cpInfoCond          *sync.Cond          //条件变量
 currentFileWriter      *blockfileWriter       //当前写入区块文件的指针
 bcInfo                 atomic.Value         //区块链信息
}

区块文件管理器实现的功能分为几类:

【1】账本数据存储管理

A。确定文件存储在哪个目录

B。确定区块存储在哪个文件

【2】检查点管理:跟踪最新持久化存储的文件

【3】索引管理:跟踪区块和交易保存在哪个文件

(一)。账本数据存储

(二)。账本数据读取

(三)。交易模拟执行

五。区块索引

(一)。文件位置指针

     

(二)。索引的同步过程

六。状态数据

七。历史数据

八。数据恢复

猜你喜欢

转载自www.cnblogs.com/kaixinyufeng/p/9459786.html