大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说Lotus源码分析–代码目录结构「终于解决」,希望您对编程的造诣更进一步.
本文作者:星际联盟 原创作品,转载请注明出处
Filecoin官方已决定在即将到来的12月11号测试网上线时,使用Lotus作为实现系统进行测试。
![Lotus源码分析–代码目录结构「终于解决」插图1 Lotus](https://daima100.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
Lotus作为一个优秀的Filecoin实现,目前也已得到了官方和广大测试矿工的足够重视,正在紧锣密鼓地为测试网上线做着准备,每天都会有大量的更新和Bug修复。所以理解Lotus的实现对于理解整个Filcoin项目有着重要的意义。 本文作为源码分析的第一篇,会带领大家了解一下Lotus目前的目录结构,以期大家对Lotus项目有个直观的认识,为后续的深入理解源码打下不错的基础。
api目录
为Lotus命令提供后台服务,多数命令都需要与后台服务进行通信,这些命令通常会涉及到链上数据。本目录抽象了节点定义,定义了若干go interface,如 Common(定义节点通用功能)、FullNode (定义一个全节点的行为,继承自Common)、StorageMiner(存储矿工,也从Common继承)和相关的函数。
对应于上面几种主要接口,也提供了几个struct,分别为CommonStruct,FullNodeStruct,StorageMinerStruct作为实现,这些实现使用了代理模式,只是简单地将请求转发给各自的Internal成员,具体的功能函数需要使用者提供,例如获取支付通道列表函数:
![Lotus源码分析–代码目录结构「终于解决」插图3 获取支付通道列表](https://daima100.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
build目录
定义用于构建节点的函数,包括但不限于: 从受信节点获取启动相关参数(位于paramfetch.go),生成内置的创世区块(位于genesis.go)等。 genesis子目录:内置的创世区块数据
cli目录
Lotus命令行工具的实现,依赖于包gopkg.in/urfave/cli.v2,里面的go文件名基本上与Lotus的子命令保持一致。对应于每条子命令及子命令的子命令,都定义了一个Command对象,如相对于Lotus chain 命令:
![Lotus源码分析–代码目录结构「终于解决」插图5 chain命令](https://daima100.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
相应的Command定义在文件chain.go中:
![Lotus源码分析–代码目录结构「终于解决」插图7 chain.go](https://daima100.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
cmd目录
内含各种不同的命令行项目,Lotus将系统分为不同的进程模块,为每个模块定义一个项目:
目录 | 项目 | 说明 |
---|---|---|
lotus | 守护进程 | 负责公链上数据的同步,与公链进行交互等,是lotus的主要进程之一 |
lotus-bench | 基准测试工具 | |
lotus-storage-miner | 挖矿进程 | 打包信息到区块,存储矿工 |
lotus-seal-worker | 密封数据进程 | 密封数据是挖矿过程中必不可少的一环,本进程即实现此功能 |
chain目录
实现与链的交互功能,主要分为如下子目录:
- types: 定义Filecoin中的各种数据结构
- store: 公链存储相关,处理所有的本地链状态,包括链头、消息和状态等
- state:处理Filecoin的状态树,内部包装了HAMT
- actors: Filecoin网络内建的各种actor定义
- vm:Filecoin虚拟机,这里实现了调用Filecoin内actor的方法的工具
miner目录
定义产出区块逻辑,与全节点通过API进行交互
storage目录
定义存储矿工逻辑,用于实现”lotus-storage-miner”
node目录
定义了lotus节点相关的struct和interface等,各主要子目录如下:
- hello:实现hello协议
- modules:定义实现节点功能的各种函数,如:
创建钱包
func NewWallet(keystore types.KeyStore) (*Wallet, error) {
w := &Wallet{
keys: make(map[address.Address]*Key),
keystore: keystore,
}
return w, nil
}
链存储:
func ChainStore(lc fx.Lifecycle, bs dtypes.ChainBlockstore, ds dtypes.MetadataDS) *store.ChainStore {
chain := store.NewChainStore(bs, ds)
if err := chain.Load(); err != nil {
log.Warnf("loading chain state from disk: %s", err)
}
return chain
}
repo:链上数据在本地的存储仓库,与本地文件系统打交道
documentation目录
Lotus的文档目录,Lotus计划提供中英文两种文字的文档,但目前英文文档在逐步完善中,但cn目录空空如也。目前已有的文档主要涉及以下方面:
- 新手指导
- 硬件要求
- Lotus在各种系统上的安装
- 节点运行指导
- 如何加入开发网
- Pond介绍
- 挖矿指导
- 向系统存储数据
lib目录
实现lotus项目各模块公用的函数
- crypto:实现数据加密,公钥生成,签名与签名验证等
- jsonrpc:实现了一个基于json传输数据的rpc包,包括服务端和客户端,可为其它项目提供完整的rpc功能支持
- statestore:包装github.com/ipfs/go-datastore,实现状态追踪
- sectorbuilder:实现扇区管理
- bufstore::包装github.com/ipfs/go-ipfs-blockstore,集成了Blockstore的读写功能
- cborutil:包装github.com/ipfs/go-ipld-cbor,提供操作cbor数据的简便方法
- auth: 实现权限认证服务HTTP接口
lotuspond目录
Pond项目目录,Pond是一个用于管理Lotus的UI工具,可用于建立一个独立的本地网络以方便调试。Pond会启动节点,使用指定的拓扑进行连接,启动挖矿,并持续监控节点运行状况。
retrieval目录
实现检索矿工和客户端功能
scripts目录
各种运行脚本,用于布暑节点和矿工等,也包括一些用于启动的配置文件
结束语
不管你愿不愿意相信,区块链都正在改变将来也会持续改变我们周围的世界,Filecoin作为如今的明星区块链项目,自然值得我们投入精力进行研究摸索。星际联盟会持续针对Filecoin进行相关技术分享,与各位共同学习进步,提早接触下一个存储新帝国。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13786.html