阅读本文需要的前置知识:
1、开发者需要掌握一门编程语言(如Java:基础、面向对象、maven等)
golang大佬、投资人和非程序员的从业人员可略过第三章。
2、 区块链(炒过币,挖过矿,或懂区块链数据结构、加密算法、钱包相关、节点、比特币挖矿等)
没接触过区块链的可以看下面这篇,大佬请略过:
区块链快速入门
Filecoin白皮书中文版
Filecoin白皮书英文原版.pdf
Filecoin经济模型解读.pdf(中文社区官方)
Filecoin经济模型解读(CSDN转载)
filecoin官方文档中文版
filecoin官方文档英文版
filecoin Github仓库及中文社区
filecoin中文社区旧版资源大全
节点API文档:filecoin官方文档-参考-Lotus-JSON-RPC-Method-API(link to the go documentation)
Lotus设计规范文档(英文原版)
Lotus使用指南文档(英文原版)
飞狐浏览器
飞驰浏览器
雅典娜收益计算器
翻译:filecoin挖矿机制解析
官方文档的摘要,主要解释了存储、检索两种矿工,复制证明、时空证明。并简要介绍了挖矿的四个阶段及其特点,及官方给出的关于硬件配置的建议。
Lotus项目源代码导读(Lotus项目概况、简介)
本文给出了项目相关的链接、资料,并对Lotus项目概况进行了介绍,里面的重点是:
1、代码基本情况
上层代码开发语言为 Golang,版本是 1.13 或以上。底层涉及到零知识证明等算法相关的逻辑采用 Rust 语言,toolchain 版本为 nightly-2020-03-19。底层库先是编译成静态库,上层 Golang 通过 cgo 调用底层静态库。底层的代码仓库叫 filecoin-ffi,URL:https://github.com/filecoin-project/filecoin-ffi.git,在主仓库的路径 extern/filecoin-ffi 之下。
2、二进制文件
代码编译后产生三个可执行程序:lotus 和 lotus-miner,lotus-worker。lotus 为全节点,lotus-miner 为矿工软件,lotus-worker为独立的密封软件。这些软件均是命令行方式运行。
封装是什么意思?_IPFS中的P1,P2,C1,C2是什么意思,封装过程需要多久呢
P1、P2、C1、C2 其实就是打包封装数据的四个过程。这四个单词就是 precommit1,precommit2,commit1,commit2.
P1阶段,分割装箱。在 IPFS 网络里,文件都要进行切片,最大不能超过 256K。把文件分割的这个阶段就叫做 P1。分割装箱的阶段需要大量的耗费 CPU,这个事AMD 比较擅长,所以就目前来说,市面上Filecoin 的矿机都是 AMD 的 CPU。
P2阶段,给数据碎片做好文件名和信息记录。即动态哈希列表 DHT 的形成过程,DHT用于寻找文件。这个生成动态哈希列表的过程就叫 P2。因为这个过程需要生成默克尔树,所以需要使用 显卡GPU。密封机里面会加一个显卡来干这个活。至此我们已把数据分割装进“小箱子”之中,然后又生成了文件的信息表。
C1 阶段,给这些小箱子贴标签,C1 阶段很省时间。一般几十秒就弄完了。
C2阶段,要做零知识证明,就是为了将来提交时空证明而准备的,零知识证明就是在我不知道存储的内容的情况下,也能证明我已经保存了这个文件。 C2 阶段需要大量的并行计算,所有算力机是一个必备工具。
总结:封装数据的过程就是 P1、P2、C1、C2,P1 就是分割装箱,需要 AMD CPU 耗时几个小时。P2 就是生成文件的信息表也叫动态哈希列表 DHT 一般需要显卡,几十分钟干完活。C1 就是贴标签几十秒就够,C2 就是做零知识证明。一般需要算力机(主要也是靠CPU)运作 30-40 分钟左右。
Filecoin挖矿与奖励分配、早期募集成本及解锁机制
从宏观的角度,介绍Filecoin的募资历史、成本、解锁,分配比例等。
经济白皮书3.4节
初始质押分为:
存储质押——目前通过使用与大约足以支付7天的扇区故障费和1个扇区故障检测费的金额相应的初始存储质押来达到平衡。这通常用扇区的未来期望收益天数(约20天)来计算。
共识质押——防止投机和损害存储用户权益。取决于该扇区加权字节算力(QAP)和网络流通供应量,当网络达到或高于基准线时,目标是约有30%的网络流通供应量被锁定在初始共识质押中。
IPFS/Filecoin的通证分发与惩罚机制
扇区故障费:相当于2.14天估计的区块奖励。
扇区故障检测费:相当于5.00天的估计区块奖励。
扇区终止费:扇区已获得区块奖励的天数估计,最多90天。
网络交易费:基于网络拥堵动态费用结构。
对Filecoin180天线性释放的分析解读
假设每天都是100fil的收益,锁仓20天,从第21天开始,每天收益的25%立即释放,75%分180天线性释放。
释放的第一天:25+1/180×75
第二天: 25+2/180×75
第三天: 25+3/180×75
……
第180天: 25+180/180×75
第181天: 25+(180-1+1)/180×75
第182天: 25+(180-1+1)/180×75
……
Filecoin挖矿过程中的爆块规则
Filecoin经济白皮书解读
Filecoin-lotus钱包
在Filecoin地址规则中,t代表测试网,f代表即将上线的正式网,1代表钱包地址,2是合约地址,3则是矿工地址。
Filecoin中Lotus节点操作及常见问题
lotus环境搭建:需要rust、go
除了lotus项目代码本身,还需要filecoin-ffi代码,放在项目的extern文件夹。
go语言依赖管理:go.mod文件,go mod相关命令。
golang自动下载所有依赖(包括goland怎么设置)
golang自动下载所有依赖最好用的一个命令
go get -d -v ./… (下载全部依赖,经测试好用。)
Go语言中import后面的最后一个元素是包名还是目录名?真相-------目录名
Go 编程语言规范【译】
Go语言规范英文版:The Go Programming Language Specification
golang语言规范
go语言与Java相比,在语法上的一些特性:
声明变量时,先写变量名,再写类型;
可以声明变量的同时进行类型推导;
——语法为 —— 变量名:=值(可以是数值,也可某个方法的返回值)
在if语句中可以进行赋值操作;
——参考:带赋值操作的if语句
golang中的结构体就是java中的类。
接收器是golang写结构体成员方法的常用语法。
函数除了函数名、参数、返回值,还有接收器的概念,接收器只能有一个,接收器的概念类似于面向对象概念中的this或self,传入的接收器对象(一般要加星以便可对其修改),在函数中可以对其进行修改。
go语言方法和接收器
go函数声明语法:函数名前的括号内的东西
func (接收器)函数名(参数)(返回值){
函数体
}
函数可以有多个返回值,函数可以写在类的外面;
一个文件中可以有多个类、接口和函数。
go语言中并没有像C++,Java语言中这类的Class,它只含有像C语言中的结构体,用结构体和指针等特性,完成一个类的作用,很巧妙的使用了指针和结构体,不仅是go的面向对象,包括go语言中的map等操作都是借助了结构体。其实,说白了,C++、Java等面向对象的语言中,类的底层实现就是结构体,对象的引用就是指针,只是语言把他们封装起来了而已。然而这使得很多人刚接触面向对象的时候很不理解这些东西。
参考转载:GO语言面向对象
golang 访问权限控制:
1.类(结构体)、方法首字母小写:仅仅同一个包访问
2.反之,大写:全项目访问
go 基础 结构体 接口 访问权限
匿名字段实现类似继承的效果:
//问:此处为何只有类名,没有变量名?
//struct中只写一个类型不写字段名定义的字段叫做匿名字段。
//golang把这个类型的所有成员到装到了当前struct中。
//直接当前struct.XXX就能访问这个类型的子成员了。
type Manager struct {
ls stores.LocalStorage
storage *stores.Remote
localStore *stores.Local
remoteHnd *stores.FetchHandler
index stores.SectorIndex
sched *scheduler
storage.Prover//问:此处为何只有类名,没有变量名?
//struct中只写一个类型不写字段名定义的字段叫做匿名字段。
//golang把这个类型的所有成员到装到了当前struct中。
//直接当前struct.XXX就能访问这个类型的子成员了。
workLk sync.Mutex
work *statestore.StateStore
callToWork map[storiface.CallID]WorkID//此处:map关键字实现的是类似Java中Hashmap的数据结构
//方括号内是key,后面的value。
//https://blog.csdn.net/weixin_39689870/article/details/112327967
// used when we get an early return and there's no callToWork mapping
callRes map[storiface.CallID]chan result
results map[WorkID]result
waitRes map[WorkID]chan struct{
}
}
对接口的实现不靠implements关键字,而是这样子写:
var _ SectorManager = &Manager{}//下划线的妙用:我们要接一下返回值,但又不会使用这个返回值,就用下划线占个位。长这样的一句代码的作用是——判断Manager类是否实现了Sectormanager接口。
local := []*cli.Command{
//:=类型推导,[]数组,*引用类型
initCmd,
runCmd,
//todo...
}
for _, cmd := range local {
//此处下划线处是下标index,用不到就可以占位略过
cmd :=cmd
//todo...
}
go语言协程的理解
go的协程
深入浅出golang的chan
GO的协程调度和GMP模型
golang main() init()方法的调用
Golang的内存逃逸分析(深入浅出)
【golang】逃逸分析(与C++比较)
go指针详解
Go全栈面试题(1) -Go基础语法面试题
Golang精编100题-搞定golang面试