Lotus的PoSt算法,分成两个场景:Winning PoSt和Window PoSt。Winning PoSt是在出块时,对已经提交的Sector数据进行证明。Window PoSt,每隔一段时间对提交的Sector的数据进行证明,证明Sector数据依然正确保存。Winning PoSt的逻辑,可以查看之前文章:
https://blog.csdn.net/StarLi2020/article/details/108816235?spm=1001.2014.3001.5502
本文详细介绍Window PoSt的逻辑。要理解Window PoSt的逻辑,需要从Sector在智能合约中的管理讲起。本文涉及的智能合约代码(specs-actors)的最后一个提交信息如下:
commit 382017dd33e9e818a51503893433628fab643dd3
Author: Alex North <445306+anorth@users.noreply.github.com>
Date: Wed May 6 10:08:31 2020 +1000
Set ConsensusMinerMinPower to 10TiB (#344)
###Miner’s State (矿工状态)
矿工的状态中存储了矿工信息,矿工的抵押信息以及Sector的各种状态。挑选和WindowPoSt相关的字段:
type State struct {
...
ProvingPeriodStart abi.ChainEpoch
NewSectors *abi.BitField
Deadlines cid.Cid
...
}
ProvingPeriodStart - 每次证明的起始区块时间
NewSectors - 新区块信息
Deadlines - 每个挑战时间,分割成多个"window",每个window又称为一个Deadline。WindowPoSt名称中的Window就是得名于此。
1.1 Proving Period(证明间隔)
WindowPoSt相关的配置定义在specs-actors/actors/builtin/miner/policy.go文件中:
const EpochDurationSeconds = 25
const SecondsInYear = 31556925
const SecondsInDay = 86400
const WPoStProvingPeriod = abi.ChainEpoch(SecondsInDay / EpochDurationSeconds)
const WPoStChallengeWindow = abi.ChainEpoch(1800 / EpochDurationSeconds) // Half an hour (=48 per day)
const WPoStPeriodDeadlines = uint64(WPoStProvingPeriod / WPoStChallengeWindow)
const WPoStChallengeLookback = abi.ChainEpoch(20)
WPoStProvingPeriod - 证明周期,每天需要证明一次。
WPoStChallengeWindow - 每半个小时是一个ChallengeWindow。每个证明周期,分为48个ChallengeWindow。
WPoStPeriodDeadlines - 每个ChallengeWindow,都是一个挑战窗口期,每个ChallengeWindow的结束时间都是Deadline。
WPoStChallengeLookback - 每个ChallengeWindow,从链上获取随机数信息,向前推算的区块时间。
简单的说,WindowPoSt的周期是一天,分成48个Window。在不同的Window时间段中的Sector的信息不同。每个Window都需要提交WindowPoSt的证明,Window中分配的Sector的个数决定了WindowPoSt证明的个数。具体的逻辑后面会介绍。
1.2 Deadline
Deadline的具体定义在specs-actors/actors/builtin/miner/deadlines.go中:
type DeadlineInfo struct {
CurrentEpoch abi.ChainEpoch // Epoch at which this info was calculated.
PeriodStart abi.ChainEpoch // First epoch of the proving period (<= CurrentEpoch).
Index uint64 // Current deadline index, in [0..WPoStProvingPeriodDeadlines), or WPoStProvingPeriodDeadlines if period elapsed.
Open abi.ChainEpoch // First epoch from which a proof may be submitted, inclusive (>= CurrentEpoch).
Close abi.ChainEpoch // First epoch from which a proof may no longer be submitted,