美文网首页区块链xdag区块链大学
XDAG技术详解8-文件存储结构

XDAG技术详解8-文件存储结构

作者: 老五笔记 | 来源:发表于2020-01-04 19:29 被阅读0次

时间格式

因为xdag的文件存储命名使用了时间戳,需要先描述时间戳的格式。

  1. 时间戳

    xdag用的时间戳是一个64位的int值,分为两部分。

    1. 尾部低10位

      表示秒以下的单位,最小单位是1/1024秒,注意作者在这里用的是二进制运算,所以用1024去分割秒。

    2. 剩余的高54位

      UTC秒。注意,实际中用不到54位。

  2. 时间片

    xdag用64秒做为一个时间片,假设t为时间戳,则 t>>16 (先右移10位去秒,再右移6位) 为时间片序号,代码中每次取时间片都是用这种方式。

storage目录结构

一个典型的存储目录结构:

image-20190819132213748.png
  1. 文件命名

    除了0级目录名固定为storage外,1到3级目录和block文件的命名均与时间戳有关。

    假设一个block的时间戳16进制为:XX1-XX2-XX3-XX4-XX5-XX6-XX7-XX8,则这个block会被存储在名为storage/XX1XX2XX3/XX4/XX5/XX6.dat的文件中,因为通常XX1XX2都是0(目前秒的部分只需要32位就够了,而这里实际有54位),所以我们看到的实际文件名路径一般为storage/XX3/XX4/XX5/XX6.dat,但是注意,随着时间的推移,1级目录名出现XX1XX2XX3的形式是正确的。但在目前的代码实现上,只允许出现XX3,不允许出现XX1XX2XX3,所以后续都假设只有XX3一种形式

  2. 目录存储

    因为文件名的命名用的是一个字节的16进制字符表示,所以理论上,任何一个目录下的子目录或者文件个数,最多只能有256个。文件名反映了对上级时间段的256分割。

    1. 3级目录下的block文件,最多可以有256个,每个文件包含了一个时间片内所有的block存储(64秒内)。
    2. 1、2、3级目录中的目录数,也是只能最多256个。
    3. 0级目录只有固定的一个storage。

block文件结构

一个block文件(XX6.dat),存储了一个XX6时间片(64秒)内所有收到的block,按顺序把二进制放进去,个数不限,理论上这个文件可以无限大(除了受到文件系统限制)。

格式:block1-struct-binary | block2-struct-binary | ... | blockN-struct-binary。

sums文件

  1. sums文件格式

    sums.dat存储了当前目录下所有block(或者目录)的数据摘要结果。

    sum文件固定为4K大小,文件被等分为256个部分,存储当前目录下256个文件(目录)各自的sum计算结果。每个等分16字节,等于struct xdag_storage_sum的大小。

    struct xdag_storage_sum {
        uint64_t sum;   // 8字节
        uint64_t size;  // 8字节
    };
    

    每个block(目录)在sum在文件中的存储索引,就是block文件名的值(转为十进制后)。

    拿9d/sums.dat文件举例,这个文件的第138等分处,存储的是9d/8a.dat文件的sum计算结果(直接存储了xdag_storage_sum结构体),因为16进制的8a等于十进制的138。

  2. sum计算方式

    每个位置实际存储的就是xdag_storage_sum结构体的二进制内容,下面说明如何计算。

    以9d/8a.dat文件的sum计算举例,在9d/sums.dat文件的第138个位置,存储了一个下面的结构体。

    struct xdag_storage_sum {
        uint64_t sum;
        uint64_t size;
    };
    

    size:8a.dat文件中所有block的字节总和,实际上就是文件大小,之所以这样描述,是因为代码是这样写的,这是直观意图,但不排除未来这两者不再相等。

    sum:把block文件按照8字节分割,每个8字节作为一个64位int叠加到sum,原始代码:s.sum += ((uint64_t *)(buf + i))[j];。这里的目的是为了做摘要后在多结点间对比数据差异,碰撞概率上比hash大,有一定瑕疵。

  3. 1/2/3级目录sum计算

    以3级目录举例,3级目录中sums.dat文件中的存储结构与block目录的sums.dat文件存储模式一致,只不过把block的位置换成了目录的位置。

    以9d目录举例,则6c/sums.dat文件中的第157位置存储的是9d目录的sum结果,因为16进制9d等于十进制157。

    9d目录的xdag_storage_sum结构体计算方法比较简单,就是把9d/sums.dat中256个xdag_storage_sum结构体的相同字段简单求和。9d-xdag_storage_sum.size = sum(9d/sums.dat.size),sum字段类似。

    1、2级目录的sum计算方法一样。

相关文章

  • XDAG技术详解8-文件存储结构

    时间格式 因为xdag的文件存储命名使用了时间戳,需要先描述时间戳的格式。 时间戳xdag用的时间戳是一个64位的...

  • Android storage

    Android存储结构android中的文件操作详解以及内部存储和外部存储彻底理解android中的内部存储与外部...

  • 《第一行代码》学习笔记 第 6 章

    第 6 章 数据存储全方案,详解持久化技术 一:文件存储 将数据存储到文件中(使用 Java 流的方式将数据写入到...

  • XDAG技术详解1-概要

    xdag是什么 根据官网介绍,xdag是一种依据DAG模型实现的加密货币。 xdag的目的 在比特币模式的区块链系...

  • XDAG技术详解4-块类型

    在xdag网络协议中,block分类两种大的类型,普通块和伪块。 伪块是一种command类型的块,主要目的是用来...

  • XDAG技术详解3-主链

    根据定义,主链是链难度最大的的链(chain),所以,如何计算链难度(chain-diff)是关键。 链难度(ch...

  • XDAG技术详解7-挖矿POW

    难度与算力 难度根据block hash计算所得:(power(2, 128)-1)/(little-endian...

  • XDAG技术详解0-写作计划

    对xdag项目感兴趣有段时间了,也陆续学习研究了xdag项目的代码和资料,体会颇多。 xdag是个好项目,但是,这...

  • Android 与文件相关的知识

    文章出自:android中的文件操作详解以及内部存储和外部存储 内部存储(internal storage) 内部...

  • 相老师的OCP教程 26-30课 文字版

    甲骨论26课Oracle存储结构文件 数据库存储的文件结构: l 联机文件:控制文件、数据文件、联机重做日志文件 ...

网友评论

    本文标题:XDAG技术详解8-文件存储结构

    本文链接:https://www.haomeiwen.com/subject/wdsfactx.html