注册
关闭
区块链智慧谷

区块链智慧谷

发布于 3周前 阅读数 8310

IPFS合约解读–ProveCommitSector/Aggregate

扇区是协议实验室官方存储的基本单元,目前协议支持封装32GiB和64GiB扇区。存储提供者获取订单数据后,会把数据分成一个个扇区,需要经过PreCommit1,PreCommit2,Commit1,Commit2四个阶段对扇区进行密封,才能形成有效算力。

我们将详细解读合约ProveCommitSector、ProveCommitSectorBatch。这是扇区预提交成功后,提交扇区证明信息生成算力,对应状态机中的状态如下:

IPFS合约解读--ProveCommitSector/Aggregate

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

IPFS合约解读--ProveCommitSector/Aggregate

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 密封扇区对应的算力

IPFS合约解读--ProveCommitSector/Aggregate

为了量化扇区中不同部分对网络共识的贡献,设置了如下几个参数:

扇区时空(SectorSpaceTime): 扇区的大小×承诺时长

交易权重(Deal Weight): 交易占用时空转换的算力,已验证客户交易的权重称为已验证交易权重,将大于常规交易权重

交易质量乘数(Sector Quality Multiplier):分别给承诺容量、常规交易和已验证交易乘数分别为10,10,100

根据代码可知,扇区质量(Sector Quality)=1 + 9*验证交易时空/扇区时空,常见的扇区质量大小如下:

IPFS合约解读--ProveCommitSector/Aggregate

最后提供的算力=扇区质量*扇区大小,经过PreCommitSector和PreCommitSectorBatch后,扇区质量会被计算出并存储在扇区信息中提交到链上。

2.5 聚合证明费用

IPFS合约解读--ProveCommitSector/Aggregate

其中BatchBalancer为2nanoFIL,EstimatedSingleProofGasUsage为65733297,BatchDiscount为1/20。

当BaseFee<batchbalancer*batchdiscount时,提交单个证明比较划算,反之批量提交证明较划算。

总结

算力与存储提供者的奖励息息相关,算力越高相同时间内获得的奖励便越多,所以密封算力是存储提供者服务过程中的关键任务之一。

在密封流程中,首先调用合约方法PreCommitSector/Batch将要密封的扇区信息提交到链上。

第二步便是调用合约方法ProveCommitSector/Aggregate,检查相应PreCommit扇区的状态,并验证这些扇区的复制证明是否有效,如果有效就会激活扇区交易,扇区被放入deadline,移除扇区的precommit状态,并生成算力。

  • 0
区块链智慧谷
区块链智慧谷

0 条评论