【Filecoin相关】Filecoin源码解析–Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

1. Repo repo.Repo

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

 【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

这里Key 作为对象的唯一标识符,是分层的,eg.创世块的Key{“/consensus/genesisCid”}: type Key struct { string } value一般都是Key对应的值序列化后的[]byte,如chain是将Cid用json.Marshal的数据. 将MapDatastore转为ds.Datastore类型,再对其加上互斥锁转换为MutexDatastore.

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

2. ChainReader

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

2.1 BlockStore对象的创建

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

–> 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)}

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

同时其对应的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 } 创建过程为:

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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.

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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节点时创建的:

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

TipSet和TipIndex数据结构:

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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

【Filecoin相关】Filecoin源码解析--Repo相关数据结构

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方式序列化.

【Filecoin相关】Filecoin源码解析--Repo相关数据结构                    

【?活动通知】 主题:Filecoin挖矿你买/投资的究竟是什么?

时间:2019年3月19日(周二)19:00 ~  20:30 地点:(上海.徐汇区)虹漕路68号锦和中心15E 适宜人群:?投资人,Filecoin挖矿者,资深矿工⚒️ 点击“阅读原文”立即报名
【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【IPFS原力区】

总部位于上海,深耕IPFS社区发展与商业生态建设。

Force系列产品布局IPFS商业应用,贯通视频娱乐、文件共享、浏览器入口、数据加密管理等服务,为企业与个人的使用提供一站式服务。

旗下IPFS原力区是IPFS顶级价值生态社区,聚集了众多技术大咖和IPFS爱好者,通过持续输出全面、精细、优质的IPFS咨询和技术支持,将生态中的爱好者转化为IPFS支持者和参与者,推动IPFS生态的健康发展。【Filecoin相关】Filecoin源码解析--Repo相关数据结构

【Filecoin相关】Filecoin源码解析--Repo相关数据结构立即报名

原创文章,作者:IPFSforce,如若转载,请注明出处:http://ipfser.org/2019/03/21/filecoinrepo/

发表评论

登录后才能评论

联系我们

在线咨询:点击这里给我发消息

邮件:ipfsforce@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code