1. IPFS原力区首页
  2. Filecoin
  3. Filecoin生态

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

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// 创世块cidgenesis cid.Cidhead types.TipSetmu sync.RWMutex// headEvents是一个pubsub通道,每次更改头时都会发布一个事件.headEvents *pubsub.PubSub// 按高度/父集设置跟踪tipsetstipIndex *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 *badTipSetCacheconsensus consensus.ProtocolchainStore 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”`// 与此区块一起提交的中奖TicketTicket Signature `json:”ticket”`// the set of parents this block was based onParents 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 thingMessages []*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.CidcachedBytes []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相关数据结构

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

提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。

发表评论

登录后才能评论

联系我们

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

邮件:ipfsforce@qq.com

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

QR code