2019独角兽企业重金招聘Python工程师标准>>>

Filecoin的源代码可以从Github下载:https://github.com/filecoin-project/go-filecoin。

在阅读源代码之前,强烈建议看两份对阅读代码有益的文档:

  • Filecoin的设计文档

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

    设计文档,从设计的角度,分别介绍数据结构,挖矿机制,共识机制,支付方式,虚拟机执行,状态机,存储角色等等。

  • CODEWALK.md

    https://github.com/filecoin-project/go-filecoin/blob/master/CODEWALK.md

    CODEWALK也是高屋建瓴的讲述了Filecoin的代码历史,框架,以及各个模块的功能。

总的来说,这两份文档篇幅都不长,对理解Filecoin的项目以及代码很有帮助。建议大家有空看看。注意的是,这些文档也不是实时更新,和代码有些出入的。闲话不多说,我整理了一下Filecoin源代码的一些理解,方便对Filecoin代码感兴趣的小伙伴,可以更快的理解Filecoin的设计以及现状。文章比较长,请耐心阅读 :)

在该导读中使用的Filecoin代码的最后一个commit信息如下:

commit c293e9032505fce2f89575846dcf5491b7b0fe92 (HEAD -> master, origin/master, origin/HEAD)

Author: Richard Littauer richard.littauer@gmail.com

Date:   Mon Feb 18 19:22:47 2019 +0200

docs: Add dual license

Missing it in the manifest. Not sure if this is how GX reads it (cc @whyrusleeping), but I'm going off of this example from @kemitchell.

01

Filecoin的几个基本概念

Filecoin State Machine (Filecoin状态机):

Filecoin的状态机,主要是维护如下一些状态信息:支付情况,存储市场情况,各个节点的Power(算力)等等。

Actor:

Filecoin网络中的Actor可以类比以太坊网络中的账户(一般账户或者智能合约账户)。每个Actor有自己的地址,余额,也可以维护自己的状态,同时Actor提供一些函数调用(也正是这些函数调用触发Actor的状态变化)。Filecoin的状态机,包括所有Actor的状态。

Actor的状态,包括:账户信息(Balance),类型(Code),以及序号(Nonce)。Actor的定义在actor/actor.go中。

Message:

Filecoin网络中的区块是由一个个的Message组成。你可以把Message想象成以太坊的交易。一个Message由发起地址,目标地址,金额,调用的函数以及参数组成。所有Message的执行的结果就是状态机的全局状态。Filecoin网络的全局状态就是映射表:Actor的地址和Actor的状态/信息。以太坊的全局信息是通过leveldb数据库存储。Filecoin的全局状态是使用IPLD HAMT(Hash-Array Mapped Trie) 存储。

Message的定义在types/message.go中。

FIL & AttoFIL:

FIL是Filecoin项目的代币。AttoFIL是FIL代币的最小单位,1 AttoFIL = 10^(-18) FIL。

Gas费用:

和以太坊网络类似,执行Actor的函数需要消耗Gas。Actor的函数调用有两种方式:1/ 用户发起签名后的Message(指定调用某个Actor的某个函数),并支付矿工Gas费用(类似以太坊的Gas费用)。2/ Actor之间调用。Actor之间调用也必须是用户发起。

区块(Block & TipSet):

Block是一个区块,定义在types/block.go文件中:

一个区块的信息主要包括:

  • 打包者的地址信息

  • 区块的高度/权重信息

  • 区块中包括的交易信息/更新后新的Root信息

  • Ticket信息以及Ticket的PoSt的证明信息

一个Tip,就是一个区块。一个TipSet,就是多个区块信息的集合,这些区块拥有同一个父亲区块。所谓的TipSet,就是一个区块的多个子区块,定义在types/tipset.go文件中:

目前Filecoin的代码中,每个区块的生成时间设置为30秒。

02

Filecoin地址生成逻辑

在深入其他逻辑之前,先介绍一下Filecoin网络中的地址生成逻辑。Filecoin的地址总共为41个字节,比如fcqphnea72vq5yynshuur33pfnnksjsn5sle75rxc。fc代表是主网,tf代表是测试网络。

详细的代码在address/address.go,核心逻辑在encode函数。 在address/constants.go文件中定义了一些参数,并预制了一些固定地址:Filecoin的铸币地址,存储市场地址,支付通道地址等等。

03

Filecoin的整体框架

Filecoin区块链相关的整体框架如下图所示:

所有的交易在节点间同步到每个节点的“Message Pool”中。经过“Expected Consensus”共识机制,当选为Leader的一个或者多个节点从“Message Pool”中挑选Message,并打包。被打包的区块,会同步给其他节点。打包的区块中的交易(Message)会被Filecoin虚拟机执行,更新各个Actor的状态。所有的区块数据,Actor的状态是通过IPFS/IPLD进行存储。

04

Filecoin 虚拟机以及Gas计算

Filecoin虚拟机比较简单,在Filecoin虚拟机执行具体某个Message的时候(Actor的某个Method),会准备VMContext,提供Actor的执行环境:

Filecoin虚拟机相关的代码在vm的目录下。所有的区块数据以及Actor状态数据存储是通过IPFS/IPLD实现。

  • Message()函数提供了当前交易Message的信息

  • BlockHeight()函数提供了当前区块高度信息

  • Stoage/ReadStorage/WriteStorage提供对当前目标地址的存储访问信息

  • Charge()函数提供油费耗费的调用

  • CreateNewActor/AddressForNewActor/IsFromAcccountActor函数提供了对Actor地址的创建以及基本查询功能

  • Rand函数提供了随机数能力

  • Send函数提供了调用其他Actor函数的能力

05

Expected Consensus - EC共识机制

Filecoin的共识算法叫Expected Consensus,简称EC共识机制。Expected Consensus实现的相关代码在consensus目录。除了区块链数据外,Expected Consensus每一轮会生成一个Ticket,每个节点通过一定的计算,确定是否是该轮的Leader。如果选为Leader,节点可以打包区块。也就是说,每一轮可能没有Leader(所有节点都不符合Leader的条件),或者多个Leader(有多个节点符合Leader)。Filecoin使用TipSet的概念,表明一轮中多个Leader产生的指向同一个父亲区块的区块集合。

Ticket的生成:

下一轮的Ticket是通过前一轮的区块的Proof以及节点的地址的Hash计算的结果,具体看consensus/expected.go中的CreateTicket函数。

Leader的选择:

在每个Ticket生成的基础上,进行Leader的选择,具体查看consensus/expected.go中的IsWinningTicket函数。也就是说,如果Ticket的数值小于当前节点的有效存储的比例的话,该节点在该轮就是Leader。

Weight的计算:

当多个Leader打包,形成多个TipSet时,通过计算TipSet的Weight的计算确定“主链”。具体查看consensus/expected.go中的Weight函数。如下图,在高度n+1,存在两个合法的TipSet,如何选择TipSet作为主链:计算Weight。

每个区块的Weight的计算公式如下:

Weight = ParentWeight + ECV + ECPrM * ratio

目前,ECV设置为10, ECPrM设置为100,Ratio是当前节点的存储有效率(节点存储的容量/所有节点的存储容量)。在目前的算法下,也就是说,节点的ratio高,Weight就高。

一个TipSet的Weight等于TipSet中所有区块的Weight的总和。Weight大的TipSet认为是主链。当两个TipSet的Weight一样大的时候,取Ticket较小者。

06

Filecoin协议层

在区块链的基础上,Filecoin设计了几个协议:hello协议,storage协议以及retrieval协议。协议层在区块链数据之上,通过Message驱动区块链状态转移。Hello协议负责TipSet的区块同步,storage协议负责存储需求双方的撮合,retrieval协议负责文件的检索以及读取服务。协议层的代码在protocol目录中。

以storage协议为例,讲解一些协议层的主要逻辑:

Miner(紫红色)就是平时所说的存储矿工,通过createMiner创建Miner Actor。使用Miner Actor的addAsk提供存储服务。存储需求方,也就是Client,通过getAsks获取所有Miner Actor的存储服务,并在这些服务中确定相应的存储矿工。在确定存储矿工的基础上,使用createChannel创建支付通道,并和存储矿工进行数据的传输。存储矿工在存储数据后,定期向Miner Actor报告存储证明(submitPoSt)。存储矿工通过FPS(Filecon Proving Subsystem)实现数据的存储以及存储证明:SectorBase提供存储接口,Storage Proof提供PoRep以及PoSt的存储证明。PoRep以及PoSt的存储证明逻辑可以查看:IPFS & FileCoin - PoRep和PoSt算法。其他协议逻辑类似,感兴趣的小伙伴可以自行查看源代码。

总结:Filecoin是由区块链以及上层协议构成的存储系统。Filecoin有自己的一套术语:Message,Block,TipSet,Actor,Ticket,GAS。Filecoin的状态由多个Actor的状态组成。Filecoin区块链的区块数据以及Actor的状态数据通过IPFS/IPLD进行存储。Filecoin采用EC共识机制,通过TipSet的Weight确定主链。Filecoin目前实现三个上层协议:Hello,Storage(存储协议)以及Retrieval(检索协议)。目前的代码还在迭代中,代码中有很多TODO,也有一些和设计文档不一致的地方。

转载于:https://my.oschina.net/gavinzheng731/blog/3032201

Filecoin逻辑梳理及源代码导读相关推荐

  1. Vue源码中compiler部分逻辑梳理(内有彩蛋)

    [摘要] Vue compiler部分逻辑梳理 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 简述 compiler模块Vue框架中用于模板编译 ...

  2. PPT技术干货1(下)——数据图表分析、逻辑梳理、高效办公

    数据分析 让数据指导决策,帮你获得业绩增长 数据展示是PPT必备的基础技能, 有些人是简单粗暴的将数据直接堆在页面上: 这样的汇报缺乏重点,不具有针对性. 图表该如何设计呢? 1.数据可视化,内容交互 ...

  3. 数学物理方程逻辑梳理和有关思考

    数学物理方程逻辑梳理和有关思考 数理方程在做什么? 解方程,分为三类,以及齐次与不齐次的情况 振动时的位移:utt=a2Δu热传导的温度:ut=a2Δu稳定温度场,电场电位,浓度分布等:Δu=0振动时 ...

  4. OA办公自动化系统--业务逻辑梳理

    OA办公自动化系统--业务逻辑梳理 前言 说明 目录结构 用户登陆 前台登陆 基础要求 衍生需求一:表单数据有效性校验 衍生需求二:体验感升华 衍生需求三:退出登陆 核心业务:登陆 后台登陆 基础要求 ...

  5. 独辟蹊径品内核:linux内核源代码导读,独辟蹊径品内核:Linux内核源代码导读(china-pub首发)...

    独辟蹊径品内核:Linux内核源代码导读(china-pub首发) 市场价 :¥65.00 ¥48.75(75折) 本书样章试读: [作 者]李云华 [同作者作品] [出 版 社] 电子工业出版社   ...

  6. games103,作业1(逻辑梳理)

    理论相关部分可以参照刚体动力学 作业框架已知条件 兔子模型的顶点集 每个墙体的上的点P及法线N: 兔子初始速度(角速度w&线速度v) 全局速度衰减系数(linear_decay,angular ...

  7. 汇正财经靠谱吗?中国银行行业 China Banks银行上涨的逻辑梳理

    ▍事件:中国人民银行发布的2023年4月金融统计和社会融资数据显示,4月新增人民币贷款规模.社会融资规模增量受季节性因素等影响较上月明显下滑,保持同比多增势头.当月我国人民币贷款增加7188亿元,同比 ...

  8. orb-slam2 代码逻辑梳理

    1.开发大型C++系统,可以首先从头文件开始:先把头文件的各种接口定义好:含义定义好:实现的时候只管内部实现就行,不需要管理外部的逻辑交互 2.定义在类中的变量,可以在前面加个小标志,mcamerMa ...

  9. 我为虎嗅设计APP(一)-逻辑梳理

    前段时间粗略分析了一下虎嗅APP逻辑架构里面的一些不足之处,今天就个人对虎嗅APP的理解重新梳理了一下虎嗅APP的逻辑架构. 此处着重说明一下为啥要将搜索功能拿出来.搜索,顾名思义,利用用户提供的关键 ...

最新文章

  1. 阿里OceanBase GitHub点赞送礼引争议,CTO道歉,贾扬清、李沐讨论开源刷Star
  2. LOJ6079「2017 山东一轮集训 Day7」养猫
  3. html的marquee滚动标签
  4. Logica实战与剖析(1)
  5. DBA查询命令积累——不断更新
  6. 项目学生:Web服务集成
  7. 网上找工作秘籍(3)
  8. 局域网聊天2011记住
  9. 查看进程中占cpu高的线程方法
  10. Git:撤销回滚操作
  11. 电脑版QQ更换透明背景教程(真的透明)
  12. gis怎么提取水系_ArcGIS水文分析实战教程(7)细说流域提取
  13. 交通流预测爬坑记(三):使用pytorch实现LSTM预测交通流
  14. Tp5设置参数全局过滤方法
  15. sql server数据库错误数据恢复(数据库连接失效,无法附加查询)
  16. 达人评测 R7 PRO 6850HS 核显相当于什么显卡
  17. 程序员必读书籍一览表
  18. ai不同形状的拼版插件_ai自动拼版脚本插件下载 Illustrator相同形状的ai文档阵列方式拼版...
  19. hihocoder 1246 王胖浩与环
  20. Eclipse为什么要先安装Tomcat

热门文章

  1. [POJ 2503] Babelfish【二分查找】
  2. 表记录的检索(数据查询)
  3. SSM框架使用遇到的问题
  4. CSS3制作动画的三个属性
  5. css权威指南 note2
  6. java与freemarker中map的遍历
  7. UDP --02--UDP广播数据
  8. 通过mysqlnow()函数校正本地(windows)时间与服务器(linux)时间
  9. python下载_安装_配置_以及第一行python程序---python工作笔记009
  10. ...is public, should be declared in a file named “ScresourcesApplic.java“---springcloud工作笔记164