Filecoin学习笔记
本文主要来自Filecoin的官方文档,时间:2023.10
<!--StartFragment-->
本文主要来自Filecoin的官方文档,时间:2023.10
1. 概述
1.1 链
tipset
FIL的链是tipset的链,而不是block的链。一个tipset里包含多个块,它们有同样的高度,并且链接到上一个同样的tipset。
存储供应商可以在一个epoch里各自创建多个block,来扩展链的吞吐量。
每个tipset都有一定重量,链会选择最重的链来延长。
Actors
Actors就是智能合约,有很多官方内置actor,也可以有用户自定义的actor。
Drand
Drand是FIL用的可验证去中心化随机数,用来做共识中的leader选举。
节点
有多种类型的节点:
- 链验证者
- 客户端节点(用户侧)
- 存储供应者节点
- 检索供应者节点(一般存储供应者也会提供检索服务)
一般来说,每个节点都会提供链验证服务,也就是它会运行链验证者节点。所以最常用的应该就是两种节点:
服务者(同时是链验证者,存储供应者,检索供应者)
客户端(用户侧,用来上传,检索,下载文件)
地址
有多种类型的地址,主网地址以f开头,测试网地址以t开头
- f0/t0:合约的人类可读的ID地址,是以类似数据库自增方式分配的,如f0123是某个合约的地址,这个合约同时还可以拥有f2开头的用hash表示的合约地址。
- f1/t1:从secp256k1的钱包的公钥派生来的钱包地址。类似EOA地址。
- f2/t2:代表actor(合约)
- f3/t3:BLS钱包地址,生成自BLS加密的Pubkey,也可以看作EOA地址,根f1类似,只不过这个是多签的。
- f4/t4:用户自定义合约(actor)的地址,这种地址可以在部署前就往里打钱。地址格式:f4<address-manager-actor-id>f<new-actor-id>。其中address-manager-actor-id当前是系统内置的address-manager的f0地址,以后支持wasm合约后可能就会放开是别的地址了;new-actor-id是随机的。如f4123fa3491xyz,f4是地址前缀,123是address-manager的f0地址编号,f是分隔符,a3491xyz是被选的随机数。
- f410/t410:内置的Ethereum Address Manager(EAM)管理的地址空间,以太坊地址与f410地址可以互换。
共识
预期共识(Expected Consensus, EC)
概率性共识,拜占庭容错,每个epoch一个块。
用存储证明选举,中奖几率正比于提供的存储能力。开奖依赖于Drand。
EC获取epoch中的所有区块,用权重函数选择权重最高的来添加区块。
特性:
- 每个epoch可能有多个leader当选,它们可能提出多个区块
- 在block producer发布它的区块前,它是匿名的。
流程:在每个epoch中,按如下流程进行共识:
- 通过生成“选举证明”, 一个SP可以检查它是否有被选中提案一个区块
- 0/1/更多个SP被选中来提案一个区块
- 备选中的SP必须在一个很短的时间内,对一个选中的Sector计算出WinningPoSt,没计算出来的就失去出块资格。
- 这些SP出的块被组织在一起,成为一个tipset
- 反映整个网络最大存储承诺(committed storage)的tipset被选中(有多个tipset??)
- 链被扩展到新的这个tipset
- 进入下一个epoch,从1开始
最终性
强制的软性最终性。在第N轮,所有矿工都会拒绝N - F轮前的分叉的所有块,F = 900。
证明
-
PoRep,复制证明,证明存储着已经存了客户端发来的副本
-
PoSt,时空证明,在存储的生命周期内,不断证明有存储数据,有两种挑战:\
-
- 证明在特定时间点有存数据
- 证明在一个时间段内,有存数据
\
Slash
有两种情况下会被slash
- 存储slash,惩罚没提供可靠存储证明的
- 共识slash,惩罚共识中破坏活性,安全性的节点。
1.2 存储模型
Providers:有两种provider:storager provider (SP)和Retrieval provider (RP)。
Deals:SP和RP通过deal向用户提供服务,deal包括价格,数据大小,服务时长,抵押品等。deal是在链下的,达成一致后被发到链上。
Sectors:Sector是衡量存储的基本单位。SP在其上存储用户数据并生成PoST,sector具有大小和声明周期,SP可以在其生命周期结束前延长它们。有32GB和64GB两种。
存储市场
存储市场是deal达成的地方,deal(交易)分为4个阶段:
- 发现(Discovery):客户寻找SP,帮询价
- 谈判(Negotiation):客户和SP对交易达成一致
- 发布(Publishing):交易被发布到链上
- 交接(Handoff):交易被包含在某个sector上,SP可以为该sector生成PoSt
Filecoin Plus
目标是最大化FIL网络上的有用存储,为经过认证的客户提供廉价甚至免费的存储服务。该服务是围绕datacap开展的,datacap是分配给经过认证的客户端的存储份额,用于存储数据,并提高对SP的激励。
经过验证的客户可以使用Datacap将数据加载到FIL中。datacap可以从经过社区选择的公证人处领取。收到datacap的SP可以获得10倍存储权重,最终提高它的获奖概率。
- DataCap,DataCap可以被发放到被认证的客户端,从而在deal(交易)里获取10倍权重叠加
1.3 检索市场
基本检索:
节点支持从最初上传数据的SP处检索,客户需提交检索请求并支付FIL作为检索费用。检索请求包括:
- SPID: SP的id
- CID:数据的cid
- 地址:创建存储交易(storage deal)时使用的地址
Saturn:
专门的检索服务市场。用于在FIL网络上检索存储的数据。有独立的检索服务商(RP)提供高性能服务。
1.2 FIl上的编程
一旦数据倍提交到fil上,不必下载数据,就能对它们进行一些计算。
1.2.1 数据计算
常见的是数据转换,数据计算是基于IPLD进行的。有些工作组在进行这方面的开发工作。
- Bacalhau:大规模并行计算,它可以让用户运行docker container或wasm image,对IPFS上存储的数据进行计算。
- Lurk:密码学可验证数据计算
1.2.2 FVM:FIL虚拟机
FVM是FIL上的合约运行环境。允许用户进行有限制的运算,例如对存储和获取数据加规则。
FVM被设计用来运行可以编译为wasm的native actor,或者EVM合约。内置的refrence FVM用rust写的。
roadmap:一开始支持EVM,后续支持所有能编译成wasm的语言。(不知道EVM当前支持的如何了)
1.2.3 数据组织
Data DAO
FIL支持创建data DAO,可以让一群人或组织管理数据权限,并将其token化,并将收益汇集到金库中。可以在peers之间交换这些token,并请求对数据进行计算服务,如验证,分析,提取等,从而支持机器学习。
永久存储
有修复和复制机器人工具,可以帮助用户永久存储其数据。这需要合约和SP配合完成。
1.2.4 针对矿工的金融服务
借贷和质押协议
用户可以根据矿工的历史业绩 ,将FIL借给矿工用作抵押。可以通过多重签名进行自动还款。
保险
可根据历史成绩投保,让SP免受机房故障,币价下跌等的损失
1.2.5 核心连基础设施
长期来看的一些基础设施,不一定与存储有关,如DEX,跨链桥等。
1.2.6 Filecoin EVM (FEVM)
在FVM上虚拟出来的EVM,兼容EVM。并且File coin节点提供了Json RPC支持,所以各种EVM开发工具,如hardhat等,也可以直接用。
详细文档:https://docs.filecoin.io/smart-contracts/fundamentals/filecoin-evm-runtime/
FEVM的性能会比FVM差,因为它是FVM上模拟出来的EVM。
FEVM可以与内置的actor交互,达成普通EVM上不能做的功能。可以调用filecoin-solidity库来实现,示例:https://github.com/lotus-web3/client-contract
2. 区块链
2.1 Actor(合约)
分为内置合约和用户合约。很多功能都是由内置合约完成的,例如验证存储证明和分发奖励,如下:
- StorageMinerActor处理来自SP的存储证明
- SP根据其存储证明的真伪,获得存储权重(storage power)
- StoragePowerActor登记存储权重
- 在区块验证期间,储存于StoragePowerActor的存储权重被读出用于验证
- 根据上一步获得的存储权重,共识算法随机将区块们奖励给权重最高的SP们,然后RewardActor向它们发放FIL
2.2 块和tipset
块包含:
-
内置数据,如块高
-
状态树指针,CID。状态树是个Merkle DAG。指向Actor数据,以及当前块中的Messages。
-
消息树指针,CID,也是Merkle DAG。一个message包括:\
-
- msg的发送actor
- msg的接收actor
- 调用的目标方法及参数
- 签名
- 发送的FIL
\
Tipset
filcoin上,是tipset的链,一个tipset里可以包含多个块。
块跟其他链的差不多,包含块头,msg列表,以及签名。
在EC共识中,在一个epoch中会选出多个block producer,也就是一个epoch中会有不止一个有效块被创建,它们有共同的高度,以及指向同一个父区块。这些块被打包在一起称为tipset。
为什么要有多个块呢?这个想法跟以太坊的叔块有点像,可以最大化有效的出块能力;但是在filecoin里,所有的块都是有效的,它们可能包含重复的msg,所以msg集是按照块的出现顺序,把重复的msg去重后的执行顺序。
2.3 Proof
PoRep
生成方法:把数据本身,SP的id,封装时间做hash即可。
WinningPoSt
SP被选中出块时要提供的证明,证明当前时间点持有数据拷贝。这个证明的提交时间非常短,所以SP没有时间来伪造。如果成功了,可以获得:
- 区块奖励:取决于该SP可以提供的存储权重,与存储的各种交易类型权重有关。
- 向其他人收交易费gas,因为块里要纳入它们的msg
WindowPoSt
所有SP均需提交,用于证明在承诺期内有存储用户的数据。一个deal的时长需在180-540天之间。
一个证明期是24h,会被分成48个dead line,每个dead line 30分钟。sector归属于partition(2349个sector,约80TB或160TB)。一个partition会被指定一个证明区间,这个partition内的所有sector需要都在这个证明区间内完成证明。
一个SP承诺封装的sector越多,它需要提供的证明就越多,它需要在每个证明期内重新封装数据,以证明自己真的有封装存储数据,虽然不合理,但没办法,这是必须的。链上会有一个WindowPoSt挑战,SP需要在30min 内生成一个zk-SNARK来证明自己有存储数据,并提交到链上,来完成这个证明,没完成挑战的话,一部分质押的FIL就会被转到f099燃烧地址烧掉,同时storage power也会减少。
\
2.4 FIL
用途:
- 存储:用户希望SP给存数据时,需要支付FIL,要按存储时长预支付
- 检索:用户想从网络检索数据时,需要支付检索费用。此费用激励SP始终保持数据可被检索。
- 区块奖励:SP铸造新区块时,获得区块奖励,同时可获得处理存储/检索交易的gas费。
- 治理:FIL持有者可对治理投票
精度:
\

\
3. 存储
3.1 File Coin Plus
介绍
公证人,用户,SP通过发放和花费DataCap来配合,来增加网络效应。
基于FIP 0003的指导原则,提高 Filecoin 的有效性,使其成为人类最重要信息的去中心化存储网络。
公证人获取并分配DataCap给可信的用户,用户可以用DataCap来赞助它的存储交易。收到DataCap的SP,在它收到这个deal的存储区内,可以获得10倍quality-adjusted-power,这将增大它的区块奖励。这激励SP存储有用信息。
智能合约也可以像client一样获得和使用DataCap。可以直接通过一个verify程序获取32GB的DataCap。DataCap在合约间不能转让,是一次性授予的。
使用DataCap
需要有一个能接收DataCap的file coin 地址。DataCap是一次性授予的,如果需要更多DataCap,需要重新申请,可以多次授予。
client可以向公证人申请获得DataCap。对于第一个32GB的DataCap,可以直接用自动审核。例如如果关联的github账号有注册超过180天,且近30天没用过自动审核的,就可以直接申请。
对于存储数据量比较大,要商用的,有两个方法:
- 直接向公证人申请,这种适合<100TB的
- 申请专用于特定项目的大型数据集公证人 - 最适合 > 100TiB DataCap 的客户(通常在 500TiB-5PiB 范围内)
申请流程可见https://docs.filecoin.io/basics/how-storage-works/filecoin-plus/
花费时也要注意设定参数,参考:https://docs.filecoin.io/basics/how-storage-works/filecoin-plus/#spend-datacap
3.2 文件存储
Piece
piece是client和SP协商存储文件的单位,即在deal中使用的单位。一个piece没有特定的大小,但它不得大于sector的大小,如果大于sector,则需要拆分为多个piece。
piece的数据结构设计是为了方便生成各种证明。它的结构如下:
\

\
从用户的文件,到SP存储到sector中的内容,中间经历了很多处理。
流程如下:
1-3在client端处理,4同时在client和SP端处理,剩下的都在SP端。
- 对文件生成IPLD-DAG,文件DAG根的hash,即IPFS的CID,称为payload-CID
- 为了能生成filecoin piece,将把IPLD-DAG序列化为“Content-Addressable aRchive” (.car) file,它是一些原始的bytes。转换前和后的payload-CID是通用的。这能方便后续的数据传输和转换。
- 为了方便.car文件能生成binary merkle tree,car 文件用额外的零填充。.car 文件大小必须为 2 的幂 (^2) 大小。填充过程称为Fr32 padding,该过程将向每 254 bit添加两bit 0。
要理解为什么1-3是这样做,需要了解deal的过程。deal是client和SP之间达成的存储协议,在deal里,要放入PieceCID (CommP),deal达成后要发到链上成为共识,所以两边必须对PieceCID达成一致,不能deal里放的和实际文件的不一致。SP从client收到.car后,要自己算出PieceCID,检查和deal里的是否一致。 - client和SP针对padding的.car文件,生成merkle tree以及计算出根,这个根是PieceCID(CommP, Piece Commitment)。这个CommP需要跟在deal里的一样。(SP是在收到文件后自己展开tree,计算)
- 多个Piece (多个deal里的Piece)被SP放在一个Sector里,SP计算这个sector里所有Piece的merkle根,称为CommD (Commitment Data, or UnSealedSectorCID)
- SP封装这个sector,封装完的merkle根叫做CommRLast
- 复制证明(PoRep),特别是SDR,会生成一个叫CommC的merkle根,作为承诺的数据(CommD)已经被正确存储的证明。
- 生成CommR (Commitment of Replication),它是hash(CommC || CommRLast).
在1-3中,Fr32的具体实现可以有偏差,它的关键在于让client和SP能够对deal里的CommP达成一致。
3.3 数据传输
详见https://spec.filecoin.io/systems/filecoin_files/data_transfer/
4. 区块链
4.1 存储能力共识(Storage Power Consensus)
Storage Power Consensus (SPC) ,每个存储矿工的有效存储能力都被记录在一个表里,并达成共识。实际执行的共识流程是EC(预期共识),SPC是描述存储矿工挖矿能力的。
SPC的功能:
- 通过读取Power table,获取每个矿工的power以及整个链的power
- 配合EC,完成EC里的很多具体共识相关工作
在Filecoin里有两种方式赚FIL:
- 为client服务,存储数据,赚取服务费
- 参加共识,出块,赚取出块费和gas费。
因为参加共识必须是以storage power为依据,所以共识矿工一定是存储矿工,但反之不一定。共识矿工需要多一些证明,所以多一些计算开销,但是这些开销并不大。
Power衡量
Quality-adjusted power (QAP)是针对每个sector的存储质量的函数,由如下内容确定:
- Sector时空(Sector spacetime),是sector的大小,和承诺存储时间的乘积。
- 交易占比-Deal Weight,把被deal占用的时空在sector中的占比,转换为共识power。
- 交易质量乘数-Deal Quality Multiplier,根据sector上的交易类型,获得的一个乘数。如CC(Committed Capacity,实际没存数据),普通交易(普通的,client和SP约定的deal),认证client交易(被认证的client的交易,见DataCap)等。咱们要用的DataCap就影响这个参数。
- 扇区质量乘数-Sector Quality Multiplier(SQM),根据sector上的各种deal类型占据的时空计算出来的加权平均乘数。
QAP是矿工在leader选举中所占有的选票,随着承诺的有用存储增加而线性增长。
QAP = 原始存储大小 * SQM (见上面的4).
随机性
最小算力
要参与共识挖矿,拥有的算力必须大于最小算力要求:MIN_MINER_SIZE_STOR,我看源码里是100TB,不知道现实中有没有改过。
5. 挖矿
5.1 币的模型
不能单纯像比特币那样指数递减,因为这会导致大量的币在早期挖出,然后矿工们可能就不存用户数据了,就退出了,这不利于长期发展。因此filecoin的挖矿奖励分为两部分:简单奖励和基线奖励。简单奖励就像比特币,按指数递减,占总挖矿奖励的30% (3.3亿枚);基线奖励是指网络达到一定的存储量(占世界存储总量的比例),就释放一部分代币。基线从1EB(不到当今世界存储的 0.01%)开始,以每年 200% 的速度增长(高于通常世界存储 40% 的年增长率)。当网络提供全球 1-10% 的存储空间时,社区可以齐心协力减缓增长速度。
矿工们的收入来源不只是挖矿,还有服务。在网络不同的发展阶段,网络会有不同的目标,矿工们的收入来源会有很大变化。
\

\
币的释放规则
详见https://spec.filecoin.io/systems/filecoin_token/block_reward_minting/,还是挺复杂的
简单奖励
简单奖励释放所有挖矿奖励的30%,即3.3亿枚。每6年减半。
基线奖励
基线奖励是指网络达到一定规模,就释放一定奖励。它受很多因素影响:
- R(t),某时刻网络瞬时原始字节率(network raw-byte power),即在时间t,全网所有活动sector的bytes总数。

,是网络封顶字节率,

= min(R(t), b(t) ),其中b(t)是基线公式。

,即在某个时候,基线应该是多少。其中b0是初始基线,g是基线增长率
- ...一大堆参数,挺复杂,详见文档。
奖励分配
上面定义了每个epoch能铸造多少币,现在看这些币怎么分配。
铸币是增量发生的,而且也是离散增量的。定期形成由多个获胜者组成的“tipsets”,每个获胜者都会获得相等的、有限数量的奖励。单个矿工可能多次获胜,但可能只提交一个区块,但仍可能获得奖励,就好像他们提交了多个获胜区块一样。多次获胜奖励的机制是乘以一个名为 的变量WinCount,因此我们将每次获胜铸造和奖励的有限数量称为“每次奖励WinCount”或“每次获胜奖励”。
有一堆复杂的公式可以计算出一个矿工在一次铸造中能获得多少币。
代币分配
\

\
FIL总量20亿。
-
矿工:55%,即11亿枚。
矿工挖到的矿,25%立刻拿到,75%在后续的180天里线性发放。\ -
- 基线铸造(Baseline minting):7.7亿,为防止矿工提前离网,延迟部分区块奖励的释放,以保护网络。因此,网络要求全网算力在20年内达到1YB才会完全释放。1YB = 1024 ZB, 1ZB = 1024 EB。当前全网封装算力在21.7 EB,离目标还很远。
- 简单铸造(Simple minting):3.3亿,每6年减半,挖出剩余币的一半。
- 矿工储备:15%,3 亿,给未来其他类型矿工预留的;
\
- 协议实验室:10.5%,作为协议实验室团队的研发及运营费用,按6年线性释放;
- PL团队贡献者 :4.5%,主要是指协议实验室团队和其他主要贡献者;
- 投资人:10%,分配给参与私募与公募的投资者,按6-36个月线性释放;
- 基金会:5%,作为长期社区建设,网络管理等费用,按6年线性释放;
5.2 存储
5.2.1 扇区(Sector)
sector是存储的基本单位,有32GB和64GB两种大小,承诺服务时间也是重要参数,最长时间18个月,也就是sector的生命周期,周期结束时可以延长生命。
如果一个sector只有部分装了deal,剩下的部分就叫承诺容量(committed capacity);没有装deal的sector叫做承诺容量扇区(committed capacity sector)。
有的矿工会为了追求承诺容量而仅仅扩大sector,而不去存用户数据,因为它可能更看重区块奖励,而不是用户的服务费。这对网络是不利的。因此网络设计了DataCap,来验证矿工是否存储了有效数据,存储有效数据的矿工可以获得更高的capacity。验证并不意味着稀缺——任何拥有存储在 Filecoin 上的真实数据的人都可以很容易地获得验证。
一旦扇区已满(无论是包含客户端数据还是作为承诺容量),未密封的扇区将由证明树组合成单个根UnsealedSectorCID。然后,密封过程将未密封扇区编码(使用 CBOR)为密封扇区,根为SealedSectorCID。
\

\
sector的密封和证明(使用了随机性):https://spec.filecoin.io/systems/filecoin_mining/sector/sealing/
5.2.2 存储挖矿详细流程
https://spec.filecoin.io/systems/filecoin_mining/storage_mining/mining_cycle/
\
5.3 抵押
有3种类型抵押品
- 初始质押抵押品(Initial pledge collateral,),矿工对每个sector初始时必须质押的FIL
- 区块奖励抵押品(Block rewards as collateral),矿工可以把区块奖励拿来做质押品
- 交易抵押品(Storage deal provider collateral),Deal的奖励作为抵押品。
初始质押
文档:https://spec.filecoin.io/systems/filecoin_mining/miner_collaterals/
初始质押是保证网络安全所需要的,就像PoS里的S一样。它分为两部分:存储质押和共识质押
初始质押 = 存储质押 + 共识质押
SectorInitialPledge=SectorInitialStoragePledge+SectorInitialConsensusPledge
通过一开始就提供存储质押,可以向用户保障服务质量,因为没有服务质量就会被slash。存储质押需要足够小,以便矿工可以进入网络;存储质押也需要足够大,从而为故障,罚款,交易费等提供抵押。使用区块奖励和未归属奖励作为额外的存储抵押,可以减少初始存储抵押,而不会对网络激励一致性产生影响。使用能够覆盖未来7天的sector fault fee和sector fault detect fee的初始存储抵押,是一个平衡点,这是用预计sector未来的奖励来衡量的。
SectorInitialStoragePledge=Estimated20DaysSectorBlockReward
初始存储质押 = 预计20天区块奖励
由于每sector的存储质押是未来该sector可能的存储奖励,所以存储质押与网络总存储量无关。全网总存储质押取决于未来区块奖励。存储质押提供了一种方法来决定是否有必要增加sector,但它无法向网络提供长期安全保障,随着区块奖励降低,这会让针对共识攻击的成本降低。所以初始质押的第二部分:共识质押,取决于两部分:由sector带来的QAT(quality-adjusted power)数量;以及网络流通供应量(network circulating supply)
区块奖励质押
矿工可能会与client达成deal,但是后续因为成本等原因放弃deal,不存储客户数据。如果这样的话,网络信用会变得很差。因此为了防止这种情况,引入区块奖励质押。对于未能履行deal承诺的矿工,会进行惩罚。另外使用区块奖励质押可以降低初始质押的量,让网络得到发展。
经过各种权衡后,区块奖励的发放被设计成次线性的。
存储交易抵押
该类型抵押是用于存储交易的。
<!--EndFragment-->