合约解读--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作为参数调用PreCommitSector或PreCommitSectorBatch,并抵押PreCommit押金。如果PreCommit押金超过初始质押,多余的押金会返还给Miner。当PreCommit消息过期时其押金会被销毁,所有的扇区都会在PreCommit中明确过期时间。对于带有交易的扇区,所有的交易必须在扇区过期之前过期。PreCommit完成后,预提交扇区的相关信息、押金和交易权重等会被提交到链上。
- END-
星际联盟官网:
https://www.ipfsunion.cn
飞驰浏览器:
https://www.filscout.com
微博:IPFS星际联盟
推特:@IPFSUnion_CN
抖音:IPFS星际联盟
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材