Filecoin学习笔记

  • maodaishan
  • 更新于 2024-03-12 10:19
  • 阅读 1832

本文主要来自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中,按如下流程进行共识:

  1. 通过生成“选举证明”, 一个SP可以检查它是否有被选中提案一个区块
  2. 0/1/更多个SP被选中来提案一个区块
  3. 备选中的SP必须在一个很短的时间内,对一个选中的Sector计算出WinningPoSt,没计算出来的就失去出块资格。
  4. 这些SP出的块被组织在一起,成为一个tipset
  5. 反映整个网络最大存储承诺(committed storage)的tipset被选中(有多个tipset??)
  6. 链被扩展到新的这个tipset
  7. 进入下一个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个阶段:

  1. 发现(Discovery):客户寻找SP,帮询价
  2. 谈判(Negotiation):客户和SP对交易达成一致
  3. 发布(Publishing):交易被发布到链上
  4. 交接(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(合约)

分为内置合约和用户合约。很多功能都是由内置合约完成的,例如验证存储证明和分发奖励,如下:

  1. StorageMinerActor处理来自SP的存储证明
  2. SP根据其存储证明的真伪,获得存储权重(storage power)
  3. StoragePowerActor登记存储权重
  4. 在区块验证期间,储存于StoragePowerActor的存储权重被读出用于验证
  5. 根据上一步获得的存储权重,共识算法随机将区块们奖励给权重最高的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天没用过自动审核的,就可以直接申请。

对于存储数据量比较大,要商用的,有两个方法:

  1. 直接向公证人申请,这种适合<100TB的
  2. 申请专用于特定项目的大型数据集公证人 - 最适合 > 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端。

  1. 对文件生成IPLD-DAG,文件DAG根的hash,即IPFS的CID,称为payload-CID
  2. 为了能生成filecoin piece,将把IPLD-DAG序列化为“Content-Addressable aRchive” (.car) file,它是一些原始的bytes。转换前和后的payload-CID是通用的。这能方便后续的数据传输和转换。
  3. 为了方便.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里的是否一致。
  4. client和SP针对padding的.car文件,生成merkle tree以及计算出根,这个根是PieceCID(CommP, Piece Commitment)。这个CommP需要跟在deal里的一样。(SP是在收到文件后自己展开tree,计算)
  5. 多个Piece (多个deal里的Piece)被SP放在一个Sector里,SP计算这个sector里所有Piece的merkle根,称为CommD (Commitment Data, or UnSealedSectorCID)
  6. SP封装这个sector,封装完的merkle根叫做CommRLast
  7. 复制证明(PoRep),特别是SDR,会生成一个叫CommC的merkle根,作为承诺的数据(CommD)已经被正确存储的证明。
  8. 生成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:

  1. 为client服务,存储数据,赚取服务费
  2. 参加共识,出块,赚取出块费和gas费。

因为参加共识必须是以storage power为依据,所以共识矿工一定是存储矿工,但反之不一定。共识矿工需要多一些证明,所以多一些计算开销,但是这些开销并不大。

Power衡量

Quality-adjusted power (QAP)是针对每个sector的存储质量的函数,由如下内容确定:

  1. Sector时空(Sector spacetime),是sector的大小,和承诺存储时间的乘积。
  2. 交易占比-Deal Weight,把被deal占用的时空在sector中的占比,转换为共识power。
  3. 交易质量乘数-Deal Quality Multiplier,根据sector上的交易类型,获得的一个乘数。如CC(Committed Capacity,实际没存数据),普通交易(普通的,client和SP约定的deal),认证client交易(被认证的client的交易,见DataCap)等。咱们要用的DataCap就影响这个参数。
  4. 扇区质量乘数-Sector Quality Multiplier(SQM),根据sector上的各种deal类型占据的时空计算出来的加权平均乘数。

QAP是矿工在leader选举中所占有的选票,随着承诺的有用存储增加而线性增长。

QAP = 原始存储大小 * SQM (见上面的4).

随机性

略,见https://spec.filecoin.io/systems/filecoin_blockchain/storage_power_consensus/#section-systems.filecoin_blockchain.storage_power_consensus.beacon-entries

最小算力

要参与共识挖矿,拥有的算力必须大于最小算力要求: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种类型抵押品

  1. 初始质押抵押品(Initial pledge collateral,),矿工对每个sector初始时必须质押的FIL
  2. 区块奖励抵押品(Block rewards as collateral),矿工可以把区块奖励拿来做质押品
  3. 交易抵押品(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-->

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
maodaishan
maodaishan
0xee37...1912
江湖只有他的大名,没有他的介绍。