请选择 进入手机版 | 继续访问电脑版
开启辅助访问
链路首页链路财经目前收录 币种 : 4908 交易所 : 310钱包 : 17 24H 交易量 : $43,403,137,051 总市值 : $245,388,183,835
2019
03/15
10:51
分享
评论
  • 1. Repo repo.Repo

    Repo类型是接口,封装了节点各种持久化数据的操作接口.

     

    实例类型是FSRepo,其中数据成员ds,walletDs,chainDs,dealsDs的类型是接口Datastore,实例类型是Datastore,分别对应块数据,钱包,链数据和交易数据的操作.

    先创建MapDatastore对象,数据是用map保存的K-V键值对.

    这里Key 作为对象的唯一标识符,是分层的,eg.创世块的Key{"/consensus/genesisCid"}:

    type Key struct {

    string

    }

    value一般都是Key对应的值序列化后的[]byte,如chain是将Cid用json.Marshal的数据.

    将MapDatastore转为ds.Datastore类型,再对其加上互斥锁转换为MutexDatastore.

     

    2. ChainReader

    类型是chain.ReadStore封装了对链数据的只读访问接口,其创建过程如下:

    2.1 BlockStore对象的创建

    --> bs := bstore.NewBlockstore(nc.Repo.Datastore())

    --> &blockstore{datastore:dsns.Wrap(Repo.D,Key{“blocks”})}

    --> &datastore{Datastore: d, raw: Repo.D, prefix: Key{“blocks”}}

    d=ktds.Wrap(Repo.D, PrefixTransform(prefix))=&ktds{child: Repo.D, KeyTransform: PrefixTransform(prefix)}

    看看blockstore类的成员函数就知道这个类实现了block的存取.

    这里cid.Cid与blocks.Block是可以相互转换的,其关系是:

    同时其对应的Repo.D里存储数据是:

    key-dshelp.CidToDsKey(block.Cid()),value=block.data

    2.2 chain.Store

    Node数据成员chainReader就是filecoin链数据的只读接口,默认的实例struct是DefaultStore,其数据结构如下:

    // DefaultStore是Store接口的通用实现

    type DefaultStore struct {

        // 块的磁盘存储

        privateStore *hamt.CborIpldStore

        // 加载状态的磁盘存储

        stateStore *hamt.CborIpldStore

        // ds是支持privateStore的数据存储区,它也可以直接访问以设置和获取有关链的元信息

        ds repo.Datastore

     

        // 创世块cid

        genesis cid.Cid

        head types.TipSet

        mu sync.RWMutex

     

        // headEvents是一个pubsub通道,每次更改头时都会发布一个事件.

        headEvents *pubsub.PubSub

     

        // 按高度/父集设置跟踪tipsets

    tipIndex *TipIndex

    }

    创建过程为:

    genCid存储在Repo.D中,

    key=Key{“/consensus/genesisCid”},value=json.Marshal(Cid)

    Bswap即nwork+blockstore,bservice封装了对Block的各种操作.

    cstOnline,cstOffline就是bservice+编码方式(Cbor),想了解IPLD数据模型,可参考文章:

    https://www.jianshu.com/p/4e8277cc92f4,

    https://www.jianshu.com/p/7082359f7e33.

    3. Syncer

    // DefaultSyncer根据共识协议的方法更新chain.Store,通过合法性检查的所有tipset都将添加到链存储中,并将其状态添加到cstOffline。

    type DefaultSyncer struct {

    // 锁:确保在任意时刻只有一个HandleNewBlocks在执行

    mu sync.Mutex

        // 获取块的在线存储,通过bitswap连接到网络

        cstOnline *hamt.CborIpldStore

        // 节点的共享脱机存储

        cstOffline *hamt.CborIpldStore

        // 用于过滤掉无效块的集合

        badTipSets *badTipSetCache

        consensus consensus.Protocol

        chainStore Store

    }

    作为node的主要成员,其初始化是在Build节点时创建的:

    chainReader类型是chain.ReadStore,是chain.Store接口的只读子集,chainStore是ReadStore接口的实例对象.

    TipSet和TipIndex数据结构:

    先来分析下区TipIndex数据结构,应该是存储了区块链上所有区块及其状态信息

    Block定义

    type Block struct {

        // 矿工地址

        Miner address.Address `json:"miner"`

        // 与此区块一起提交的中奖Ticket

        Ticket Signature `json:"ticket"`

     

        // the set of parents this block was based on

        Parents SortedCidSet `json:"parents"`

     

        // the aggregate chain weight of the parent set.

        ParentWeight Uint64 `json:"parentWeight"`

     

        // the chain height of this block.

        Height Uint64 `json:"height"`

     

        // 临时字段

        Nonce Uint64 `json:"nonce"`

     

        // the set of messages included in this block

        // TODO: should be a merkletree-ish thing

        Messages []*SignedMessage `json:"messages"`

     

        // S应用事务状态转换后指向状态树的cid指针。

        StateRoot cid.Cid `json:"stateRoot,omitempty" refmt:",omitempty"`

     

        // a set of receipts(收据) matching to the sending of the `Messages`.

        MessageReceipts []*MessageReceipt `json:"messageReceipts"`

     

        //  Proof is a proof of spacetime generated using the hash of the previous ticket as

        // a challenge    Proof proofs.PoStProof `json:"proof"`

     

        cachedCid cid.Cid

        cachedBytes []byte

    }

    cachedCid:

    编码方式:MerkleDAG cbor;DumpObject将Block对象以CBOR方式序列化.

                        

主题帖 436 关注 0 粉丝 0
情感指数

链路大数据分析置信度 13.74 %

TA的主题帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表