5.5 区块索引

超级账本提供多种区块索引(Block Index)方式,以便能够快速找到区块。这些方式包括:

·区块编号;

·区块哈希;

·交易编号;

·同时按区块编号和交易编号;加 入 会 员 微 信 dedao555

·区块交易编号;

·交易验证码。

5.5.1 文件位置指针

索引的内容是文件位置指针(File Location Pointer),位置指针的结构如下所示:


 

type fileLocPointer struct {
   fileSuffixNum int
   locPointer
}

type locPointer struct {
   offset      int
   bytesLength int
}


文件位置指针由3个部分组成:

·所在文件的编号fileSuffixNum;

·文件内的偏移量offset;

·区块占用的字节数bytesLength。

区块查找是一个三级索引过程,查找一个区块就是先确定是哪个链,然后根据文件编号找到对应的文件,再根据文件的偏移量和占用的字节数确定区块的内容,如图5-3所示。

image.png

图5-3 多链下区块的三级索引

文件位置指针序列化后保存到LevelDB数据库中,不同的索引方式对应的键如表5-1所示(“+”是逻辑符号,不是真实的键组成部分):

构建哪些索引类型是可配置的,默认是所有类型都建立索引(排序服务也会建立索引,但只有区块编号这种索引类型)。有两种途径可以构建索引:

·提交区块(Commit Block);

·同步索引(Sync Index)。

表5-1 区块索引类型

image.png

提交区块到账本的时候会自动按照表5-1所示的区块类型构建索引,下面来看一下索引的同步过程。

5.5.2 索引的同步过程

索引同步只在创建区块文件管理器(blockfileMgr)的时候执行,验证数据库里保存的索引是否和区块文件系统里的一致。

数据库记录了两个检查点的信息:

·索引检查点信息(indexCheckpointKey);

·区块检查点信息(blkMgrInfo)。

索引检查点信息记录的是最后建立索引的区块编号。通过索引检查点信息的区块编号,可以查询到区块编号对应的文件位置指针,它代表了数据库中记录的最新状态。这个状态由于系统异常等原因可能和区块文件系统存储的不一致。

区块检查点信息记录的是已提交到账本的区块信息,数据结构如下:


 

type checkpointInfo struct {
   latestFileChunkSuffixNum int      // 最新区块的文件编号
   latestFileChunksize      int      // 最新区块的文件偏移
   isChainEmpty             bool     // 是否为空链
   lastBlockNumber          uint64   // 最新的区块编号
}


区块检查点信息记录的是区块文件系统的一个状态,可能和索引检查点信息记录的区块编号不一致,也可能和区块文件系 统不一致。由于记录过程是先提交区块到区块文件系统,再记录区块检查点信息,最后是索引检查点信息,所以区块文件系统的信息是最完整的。可以通过区块文件 系统同步区块检查点信息和索引检查点信息。区块检查点信息和索引检查点信息记录的状态可能不是最新的,代表的是过去某个时刻正确的状态,索引同步可以从检 查点记录的状态开始,更新为区块文件系统的最新状态,减少同步时间。

区块文件管理器在创建的时候会从数据库中获取区块检查点信息,并且需要和区块文件系统对比检查其是否为最新的状 态。检查过程是基于区块检查点的文件编号和文件内由偏移构建的一个区块文件流(blockfileStream),从这个偏移开始验证该文件是否还有区块 数据。如果确实还有区块,找到该文件实际存储的最大区块编号,更新区块检查点信息。这里用的是区块文件流,它只会检查单个文件。这可能会存在一个特殊情 况,就是上一个区块刚好写满这个文件,达到了上限maxBlockfileSize,这个区块从下一个文件开始写,写完区块数据以后,更新区块检查点信息 的时候出现异常,这时会导致区块检查点信息记录和区块文件系统的永久性不一致。

经过上面的检查后,区块检查点信息就和区块文件系统完全一致了。根据区块检查点信息,构建区块流,从索引检查点信息记录的区块文件和偏移开始,到区块检查点记录的最新区块的文件编号为止,全部重新构建索引,并更新索引检查点信息。

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=1066

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值