合约解读--ProveCommitSector/Aggregate
发布于 2021-10-08 19:51
引言 ·
扇区是协议实验室官方存储的基本单元,目前协议支持封装32GiB和64GiB扇区。存储提供者获取订单数据后,会把数据分成一个个扇区,需要经过PreCommit1,PreCommit2,Commit1,Commit2四个阶段对扇区进行密封,才能形成有效算力。
我们将详细解读合约ProveCommitSector、ProveCommitSectorBatch。这是扇区预提交成功后,提交扇区证明信息生成算力,对应状态机中的状态如下:
1. ProveCommitSector
//1.1 入参
type ProveCommitSectorParams struct {
SectorNumber abi.SectorNumber
Proof []byte
}
SectorNumber为一个扇区的ID,以int64形式表示,Proof为扇区的零知识证明。
// 1.2 参数检查
· 扇区号必须小于int64最大值
· 扇区PreCommit证明的大小必须小于指定类型的大小,如32GiB V1_1扇区证明大小为1920
· PreCommit到当前时间的间距超过ProveCommit最大时延则跳过,其中ProveCommit最大时延V1扇区为1天+150Epoch,V1.1扇区为30天+150Epoch
//1.3 链上状态更新
·getVerifyInfo获取验证信息
·调用合约Power.SubmitPoRepForBulkVerify方法·提交证明,更新链上状态
·如果st.ProofValidationBatch不为空,则加载证明的批量集合,否则创建一个空的验证集合
·获取存储提供者的密封验证信息,在一个Epoch中每个存储提供者PreCommit的数量不能超过200
·将证明插入到批次中并刷新批次
·支付Gas费,OnSubmitVerifySeal的Gas数量为34721069
2. ProveCommitAggregate
//2.1 入参
type ProveCommitAggregateParams struct {
SectorNumbers bitfield.BitField
AggregateProof []byte
}
SectorNumbers使用bitfield表示,并通过RLE+编码压缩,减少了占用链上数据空间。
AggregateProof聚合了证明需要的信息,包括每个扇区的扇区号、随机数信息、CommR、CommD、密封类型、聚合类型和C2生成的零知识证明。
//2.2 参数检查
·聚合扇区数量大小必须位于[4,819]
·扇区聚合证明大小<=81960
·PreCommit到当前时间的间距超过ProveCommit最大时延则跳过,其中ProveCommit最大时延V1扇区为1天+150Epoch,V1.1扇区为30天+150Epoch
·确保每个扇区的sealProof相同
·请求市场合约,来从扇区交易中计算未密封扇区CommD作为扇区CID
·验证聚合密封的每个扇区CommR和CommD与PreCommit提交的信息是一致的
·验证扇区proof是有效的,对于每个precommit,如果交易ID存在,则激活市场合约激活交易,并记录需要替换数据的扇区。
//2.3 链上状态更新
将被替换扇区的到期时间设置为它的下一个deadline。
对于每个有效的PreCommit,确认扇区的过期时间超过180天,计算其对应的算力,存储质押和初始质押,以及替换数据扇区对应的质押和奖励,最后构建所有新的的扇区信息并提交到链上。
修改链上状态信息,放入新的扇区,删除PreCommited扇区,分配新的扇区deadlines,释放PreCommit的押金,增加初始质押,确认余额足以支付押金。
//2.4 密封扇区对应的算力
为了量化扇区中不同部分对网络共识的贡献,设置了如下几个参数:
交易权重(Deal Weight): 交易占用时空转换的算力,已验证客户交易的权重称为已验证交易权重,将大于常规交易权重
交易质量乘数(Sector Quality Multiplier):分别给承诺容量、常规交易和已验证交易乘数分别为10,10,100
根据代码可知,扇区质量(Sector Quality)=1 + 9*验证交易时空/扇区时空,常见的扇区质量大小如下:
最后提供的算力=扇区质量*扇区大小,经过PreCommitSector和PreCommitSectorBatch后,扇区质量会被计算出并存储在扇区信息中提交到链上。
//2.5 聚合证明费用
其中BatchBalancer为2nanoFIL,EstimatedSingleProofGasUsage为65733297,BatchDiscount为1/20。
当BaseFee<batchbalancer*batchdiscount时,提交单个证明比较划算,反之批量提交证明较划算。
算力与存储提供者的奖励息息相关,算力越高相同时间内获得的奖励便越多,所以密封算力是存储提供者服务过程中的关键任务之一。
在密封流程中,首先调用合约方法PreCommitSector/Batch将要密封的扇区信息提交到链上。
第二步便是调用合约方法ProveCommitSector/Aggregate,检查相应PreCommit扇区的状态,并验证这些扇区的复制证明是否有效,如果有效就会激活扇区交易,扇区被放入deadline,移除扇区的precommit状态,并生成算力。
- END-
星际联盟官网:
https://www.ipfsunion.cn
飞驰浏览器:
https://www.filscout.com
微博:IPFS星际联盟
推特:@IPFSUnion_CN
抖音:IPFS星际联盟
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材