FileCoin 挖矿教程 (七)Lotus 源码大致的结构目录

项目仓库

https://github.com/filecoin-project/lotus

api

为Lotus命令提供后台服务,多数命令都需要与后台服务进行通信,这些命令通常会涉及到链上数据。本目录抽象了节点定义,定义了若干go interface,如 Common(定义节点通用功能)、FullNode (定义一个全节点的行为,继承自Common)、StorageMiner(存储矿工,也从Common继承)和相关的函数。

对应于上面几种主要接口,也提供了几个struct,分别为CommonStruct,FullNodeStruct,StorageMinerStruct作为实现,这些实现使用了代理模式,只是简单地将请求转发给各自的Internal成员,具体的功能函数需要使用者提供。

build

定义用于构建节点的函数,其中包括了: 从受信节点获取启动相关参数(位于paramfetch.go),生成内置的创世区块(位于genesis.go)等。

genesis

内置的创世区块数据

chain

实现与链的交互功能

actors

Filecoin网络内建的各种actor定义

types

定义Filecoin中的各种数据结构

store

公链存储相关,处理所有的本地链状态,包括链头、消息和状态等

state

处理Filecoin的状态树

vm

Filecoin虚拟机

cli

Lotus命令行工具的实现

cmd

内含各种不同的命令行项目,Lotus将系统分为不同的进程模块,为每个模块定义一个项目:

目录 项目 说明
lotus 守护进程 负责公链上数据的同步,与公链进行交互等,是lotus的主要进程之一
lotus-bench 基准测试工具
lotus-storage-miner 挖矿进程 打包信息到区块,存储矿工
lotus-seal-worker 密封数据进程 密封数据是挖矿过程中必不可少的一环,本进程即实现此功能

lib

实现lotus项目各模块公用的函数:

名称 功能描述
crypto 实现数据加密,公钥生成,签名与签名验证等
jsonrpc 实现了一个基于json传输数据的rpc包,包括服务端和客户端,可为其它项目提供完整的rpc功能支持
statestore 包装github.com/ipfs/go-datastore,实现状态追踪
sectorbuilder 实现扇区管理
bufstore 集成了Blockstore的读写功能
cborutil 提供操作cbor数据的简便方法
auth 实现权限认证服务HTTP接口

lotuspond

Pond项目目录,Pond是一个用于管理Lotus的UI工具,可用于建立一个独立的本地网络以方便调试。Pond会启动节点,使用指定的拓扑进行连接,启动挖矿,并持续监控节点运行状况。

miner

定义产出区块逻辑,与全节点通过API进行交互

node

定义了lotus节点相关的struct和interface等,各主要子目录如下:

  • hello:实现hello协议
  • modules:定义实现节点功能的各种函数

scripts

各种运行脚本,用于布暑节点和矿工等,也包括一些用于启动的配置文件

storage

定义存储矿工逻辑,用于实现”lotus-storage-miner”

blockstore

Blockstore 是 Lotus 使用的块存储接口。 它是基本的 go-ipfs 块存储与 Lotus 所需的其他功能的结合,例如 查看或同步。

system

操作系统的资源占用情况

resources.go

package system

import (
	"os"

	"github.com/dustin/go-humanize"
	"github.com/elastic/gosigar"
	logging "github.com/ipfs/go-log/v2"
)

var (
	logSystem = logging.Logger("system")
)

// EnvMaximumHeap is name of the environment variable with which the user can
// specify a maximum heap size to abide by. The value of the env variable should
// be in bytes, or in SI bytes (e.g. 32GiB).
const EnvMaximumHeap = "LOTUS_MAX_HEAP"

// MemoryConstraints represents resource constraints that Lotus and the go
// runtime should abide by. It is a singleton object that's populated on
// initialization, and can be used by components for size calculations
// (e.g. caches).
type MemoryConstraints struct {
	// MaxHeapMem is the maximum heap memory that has been set by the user
	// through the LOTUS_MAX_HEAP env variable. If zero, there is no max heap
	// limit set.
	MaxHeapMem uint64

	// TotalSystemMem is the total system memory as reported by go-sigar. If
	// zero, it was impossible to determine the total system memory.
	TotalSystemMem uint64

	// EffectiveMemLimit is the memory limit in effect, in bytes.
	//
	// In order of precedence:
	//  1. MaxHeapMem if non-zero.
	//  2. TotalSystemMem if non-zero.
	//  3. Zero (no known limit).
	EffectiveMemLimit uint64
}

// GetMemoryConstraints returns the memory constraints for this process.
func GetMemoryConstraints() (ret MemoryConstraints) {
	var mem gosigar.Mem
	if err := mem.Get(); err != nil {
		logSystem.Warnf("failed to acquire total system memory: %s", err)
	} else {
		ret.TotalSystemMem = mem.Total
		ret.EffectiveMemLimit = mem.Total
	}

	if v := os.Getenv(EnvMaximumHeap); v != "" {
		bytes, err := humanize.ParseBytes(v)
		if err != nil {
			logSystem.Warnf("failed to parse %s env variable with value %s: %s; ignoring max heap limit", EnvMaximumHeap, v, err)
		} else {
			ret.MaxHeapMem = bytes
			ret.EffectiveMemLimit = bytes
		}
	}
	return ret
}

testplans

一些测试相关的内容

tools

一些相关工具库