一。概述
二。读写集
(一)。交易模拟和读写集
(二)。交易验证和世界状态更新
(三)。模拟和验证示例
三。账本编号
超级账本支持多账本(详细内容参考第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】索引管理:跟踪区块和交易保存在哪个文件
(一)。账本数据存储
(二)。账本数据读取
(三)。交易模拟执行
五。区块索引
(一)。文件位置指针