合约解读--PreCommitSector

发布于 2021-09-26 15:22

 引言 ·


Filecoin中的Actor类似于以太坊中的智能合约。Actor是一个拥有状态和方法集合的链上对象,所有的Actor都有一个对应的地址。Actor的方法是通过生成消息并由存储提供者打包进区块来调用的。Filecoin系统总共包含11个内置的Actors,对Filecoin区块链上状态的任何修改都是调用合约来触发的。

这次我们将详细解读合约PreCommitSector、PreCommitSectorBatch。这是扇区密封过程中首先调用的合约,进行扇区预提交,对应状态机中的状态如下:

源码剖析


PreCommitSector称为预提交扇区,将封装扇区的具体信息提交到链上,网络版本V13之后,可以通过在配置文件中将BatchPreCommits置为true,启用批量预提交。PreCommitSector方法将被逐渐弃用,下文主要介绍批量预提交。

//1 入参

type SectorPreCommitInfo struct {

   SealProof         

   SectorNumber    //扇区号

   SealedCID      //密封扇区数据的CID

   SealRandEpoch   //密封的随机epoch

   DealIDs         //包含扇区数据的存储交易ID

   Expiration    

   ReplaceCapacity //是否要替换扇区数据

   ReplaceSectorDeadline

   ReplaceSectorPartition

   ReplaceSectorNumber   

}

SealProof是与证明库对应的id,值为8代表32GiB扇区,9代表64GiB扇区,目前32GiB扇区调用PreCommitSectors的金额为0.02FIL左右。

Sector中的信息在之前状态中给出,GetTicket阶段给出TicketEpoch作为SealRandEpoch,P2阶段给出CommR作为SealedCID。

Expiration过期时间取所有pieces终止时间的最大值,加上一个windowpost证明时间24小时,并按天数取整后减1。

对于尝试替换扇区,如果需要替换,则将ReplaceCapacity置为true,并获取该扇区的链上信息,将对应信息分别写入ReplaceSectorDeadline和PeplaceSectorPartition,并更新扇区的过期时间,返回扇区的初始质押。

根据params计算出指定miner扇区PreCommit的押金,并与上面的初始质押比较取较大值作为最终的押金。

调用合约之前会检测钱包密钥是否可用,余额是否充足,足以支付押金和Gas费。

// 2 参数检查

· 预提交的扇区数量必须位于[1,256]之间

· 预提交的所有扇区号不能重复

· SealProof指定的密封类型必须为32GiB或64GiB

· 扇区号大小必须满足[0,2^63-1]

· 密封数据的CID必须存在,且前缀符合要求

· 密封挑战的Epoch必须在当前Epoch之前,并在前3780Epoch之后

· 扇区的过期时间必须大于最大激活时间,v1扇区的最大激活时间为1天+150Epoch,v1.1扇区的最大激活时间为30天+150Epoch

· 扇区的过期时间必须大于最大激活时间+最小扇区过期时间180天

· 扇区的过期时间必须小于当前Epoch+最大扇区过期时间540天

· 扇区的过期时间必须小于最大激活时间+密封的扇区最大寿命,其中V1扇区540天,V1.1为5年

· 如果要替换扇区数据,则必须有交易ID

· 替换扇区的Deadline数量必须小于WindowPoST阶段的Deadline数量48

· 替换扇区的数量必须小于Int64所能表示的最大值

//3 链上状态更新

检查存储提供者的余额是否足以支付欠款和质押

扇区的密封类型必须与注册的windowpost证明类型相同

交易的数量必须小于最大交易数量,扇区可以拥有的最大交易数目为扇区大小/2^27和256中的较大值

交易占用的空间必须小于扇区大小

上述条件检查完之后根据使用当前Epoch作为激活时间,来估算每个扇区的权重,并使用该权重计算PreCommit押金,并统计所有扇区的总押金,以确保钱包余额足以支付押金。扇区的算力将在被证明后重新计算

构建上链信息ChainInfo

type SectorPreCommitOnChainInfo struct {

    Info SectorPreCommitInfo

    PreCommitDeposit abi.TokenAmount

    PreCommitEpoch abi.ChainEpoch

    DealWeight abi.DealWeight 

    VerifiedDealWeight abi.DealWeight

}

添加PreCommit到期时的清理事件

修改链上状态,包括添加PreCommit押金,标记扇区号为已分配,存储PreCommit扇区信息,添加PreCommit过期处理事件

激活定时任务,加入到deadline的处理事件中

总结

Miner在完成扇区打包后,会生成SectorPreCommitInfo作为参数调用PreCommitSectorPreCommitSectorBatch,并抵押PreCommit押金。如果PreCommit押金超过初始质押,多余的押金会返还给Miner。当PreCommit消息过期时其押金会被销毁,所有的扇区都会在PreCommit中明确过期时间。对于带有交易的扇区,所有的交易必须在扇区过期之前过期。PreCommit完成后,预提交扇区的相关信息、押金和交易权重等会被提交到链上。

- END-

星际联盟官网:

https://www.ipfsunion.cn

飞驰浏览器:

https://www.filscout.com

微博:IPFS星际联盟

推特:@IPFSUnion_CN

 

抖音:IPFS星际联盟

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材