github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/test/committed_capacity_scenario_test.go (about) 1 package test_test 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/filecoin-project/go-bitfield" 8 "github.com/filecoin-project/go-state-types/abi" 9 "github.com/filecoin-project/go-state-types/big" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 "github.com/filecoin-project/specs-actors/v4/actors/builtin" 14 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market" 15 "github.com/filecoin-project/specs-actors/v4/actors/builtin/miner" 16 "github.com/filecoin-project/specs-actors/v4/actors/builtin/power" 17 "github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg" 18 "github.com/filecoin-project/specs-actors/v4/actors/runtime/proof" 19 "github.com/filecoin-project/specs-actors/v4/support/ipld" 20 tutil "github.com/filecoin-project/specs-actors/v4/support/testing" 21 vm "github.com/filecoin-project/specs-actors/v4/support/vm" 22 ) 23 24 func TestReplaceCommittedCapacitySectorWithDealLadenSector(t *testing.T) { 25 ctx := context.Background() 26 v := vm.NewVMWithSingletons(ctx, t, ipld.NewBlockStoreInMemory()) 27 addrs := vm.CreateAccounts(ctx, t, v, 4, big.Mul(big.NewInt(10_000), vm.FIL), 93837778) 28 worker, verifier, unverifiedClient, verifiedClient := addrs[0], addrs[1], addrs[2], addrs[3] 29 30 minerBalance := big.Mul(big.NewInt(1_000), vm.FIL) 31 sectorNumber := abi.SectorNumber(100) 32 sealedCid := tutil.MakeCID("100", &miner.SealedCIDPrefix) 33 sealProof := abi.RegisteredSealProof_StackedDrg32GiBV1_1 34 35 // create miner 36 params := power.CreateMinerParams{ 37 Owner: worker, 38 Worker: worker, 39 WindowPoStProofType: abi.RegisteredPoStProof_StackedDrgWindow32GiBV1, 40 Peer: abi.PeerID("not really a peer id"), 41 } 42 ret := vm.ApplyOk(t, v, addrs[0], builtin.StoragePowerActorAddr, minerBalance, builtin.MethodsPower.CreateMiner, ¶ms) 43 44 minerAddrs, ok := ret.(*power.CreateMinerReturn) 45 require.True(t, ok) 46 47 // 48 // Precommit, prove and PoSt empty sector (more fully tested in TestCommitPoStFlow) 49 // 50 51 // precommit sector 52 preCommitParams := miner.PreCommitSectorParams{ 53 SealProof: sealProof, 54 SectorNumber: sectorNumber, 55 SealedCID: sealedCid, 56 SealRandEpoch: v.GetEpoch() - 1, 57 DealIDs: nil, 58 Expiration: v.GetEpoch() + 200*builtin.EpochsInDay, 59 } 60 vm.ApplyOk(t, v, addrs[0], minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.PreCommitSector, &preCommitParams) 61 62 // advance time to max seal duration 63 proveTime := v.GetEpoch() + miner.MaxProveCommitDuration[sealProof] 64 v, _ = vm.AdvanceByDeadlineTillEpoch(t, v, minerAddrs.IDAddress, proveTime) 65 66 // Prove commit sector after max seal duration 67 v, err := v.WithEpoch(proveTime) 68 require.NoError(t, err) 69 proveCommitParams := miner.ProveCommitSectorParams{ 70 SectorNumber: sectorNumber, 71 } 72 vm.ApplyOk(t, v, worker, minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.ProveCommitSector, &proveCommitParams) 73 74 // In the same epoch, trigger cron to validate prove commit 75 vm.ApplyOk(t, v, builtin.SystemActorAddr, builtin.CronActorAddr, big.Zero(), builtin.MethodsCron.EpochTick, nil) 76 77 // advance to proving period and submit post 78 dlInfo, pIdx, v := vm.AdvanceTillProvingDeadline(t, v, minerAddrs.IDAddress, sectorNumber) 79 80 submitParams := miner.SubmitWindowedPoStParams{ 81 Deadline: dlInfo.Index, 82 Partitions: []miner.PoStPartition{{ 83 Index: pIdx, 84 Skipped: bitfield.New(), 85 }}, 86 Proofs: []proof.PoStProof{{ 87 PoStProof: abi.RegisteredPoStProof_StackedDrgWindow32GiBV1, 88 }}, 89 ChainCommitEpoch: dlInfo.Challenge, 90 ChainCommitRand: []byte("not really random"), 91 } 92 93 vm.ApplyOk(t, v, addrs[0], minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.SubmitWindowedPoSt, &submitParams) 94 95 // check power table 96 sectorPower := vm.PowerForMinerSector(t, v, minerAddrs.IDAddress, sectorNumber) 97 minerPower := vm.MinerPower(t, v, minerAddrs.IDAddress) 98 networkStats := vm.GetNetworkStats(t, v) 99 assert.Equal(t, sectorPower.Raw, minerPower.Raw) 100 assert.Equal(t, sectorPower.QA, minerPower.Raw) 101 assert.Equal(t, sectorPower.Raw, networkStats.TotalBytesCommitted) 102 assert.Equal(t, sectorPower.QA, networkStats.TotalQABytesCommitted) 103 // miner does not meet consensus minimum so actual power is not added 104 assert.Equal(t, big.Zero(), networkStats.TotalRawBytePower) 105 assert.Equal(t, big.Zero(), networkStats.TotalQualityAdjPower) 106 107 // 108 // publish verified and unverified deals 109 // 110 111 // register verifier then verified client 112 addVerifierParams := verifreg.AddVerifierParams{ 113 Address: verifier, 114 Allowance: abi.NewStoragePower(32 << 40), 115 } 116 vm.ApplyOk(t, v, vm.VerifregRoot, builtin.VerifiedRegistryActorAddr, big.Zero(), builtin.MethodsVerifiedRegistry.AddVerifier, &addVerifierParams) 117 118 addClientParams := verifreg.AddVerifiedClientParams{ 119 Address: verifiedClient, 120 Allowance: abi.NewStoragePower(32 << 40), 121 } 122 vm.ApplyOk(t, v, verifier, builtin.VerifiedRegistryActorAddr, big.Zero(), builtin.MethodsVerifiedRegistry.AddVerifiedClient, &addClientParams) 123 124 // add market collateral for clients and miner 125 collateral := big.Mul(big.NewInt(3), vm.FIL) 126 vm.ApplyOk(t, v, unverifiedClient, builtin.StorageMarketActorAddr, collateral, builtin.MethodsMarket.AddBalance, &unverifiedClient) 127 vm.ApplyOk(t, v, verifiedClient, builtin.StorageMarketActorAddr, collateral, builtin.MethodsMarket.AddBalance, &verifiedClient) 128 collateral = big.Mul(big.NewInt(64), vm.FIL) 129 vm.ApplyOk(t, v, worker, builtin.StorageMarketActorAddr, collateral, builtin.MethodsMarket.AddBalance, &minerAddrs.IDAddress) 130 131 // create 3 deals, some verified and some not 132 dealIDs := []abi.DealID{} 133 dealStart := v.GetEpoch() + miner.MaxProveCommitDuration[sealProof] 134 deals := publishDeal(t, v, worker, verifiedClient, minerAddrs.IDAddress, "deal1", 1<<30, true, dealStart, 181*builtin.EpochsInDay) 135 dealIDs = append(dealIDs, deals.IDs...) 136 deals = publishDeal(t, v, worker, verifiedClient, minerAddrs.IDAddress, "deal2", 1<<32, true, dealStart, 200*builtin.EpochsInDay) 137 dealIDs = append(dealIDs, deals.IDs...) 138 deals = publishDeal(t, v, worker, unverifiedClient, minerAddrs.IDAddress, "deal3", 1<<34, false, dealStart, 210*builtin.EpochsInDay) 139 dealIDs = append(dealIDs, deals.IDs...) 140 141 // 142 // Precommit, Prove, Verify and PoSt committed capacity sector 143 // 144 145 // precommit capacity upgrade sector with deals 146 upgradeSectorNumber := abi.SectorNumber(101) 147 upgradeSealedCid := tutil.MakeCID("101", &miner.SealedCIDPrefix) 148 preCommitParams = miner.PreCommitSectorParams{ 149 SealProof: sealProof, 150 SectorNumber: upgradeSectorNumber, 151 SealedCID: upgradeSealedCid, 152 SealRandEpoch: v.GetEpoch() - 1, 153 DealIDs: dealIDs, 154 Expiration: v.GetEpoch() + 220*builtin.EpochsInDay, 155 ReplaceCapacity: true, 156 ReplaceSectorDeadline: dlInfo.Index, 157 ReplaceSectorPartition: pIdx, 158 ReplaceSectorNumber: sectorNumber, 159 } 160 vm.ApplyOk(t, v, addrs[0], minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.PreCommitSector, &preCommitParams) 161 162 // assert successful precommit invocation 163 none := []vm.ExpectInvocation{} 164 vm.ExpectInvocation{ 165 To: minerAddrs.IDAddress, 166 Method: builtin.MethodsMiner.PreCommitSector, 167 Params: vm.ExpectObject(&preCommitParams), 168 SubInvocations: []vm.ExpectInvocation{ 169 {To: builtin.RewardActorAddr, Method: builtin.MethodsReward.ThisEpochReward, SubInvocations: none}, 170 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.CurrentTotalPower, SubInvocations: none}, 171 // addtion of deal ids prompts call to verify deals for activation 172 {To: builtin.StorageMarketActorAddr, Method: builtin.MethodsMarket.VerifyDealsForActivation, SubInvocations: none}, 173 }, 174 }.Matches(t, v.LastInvocation()) 175 176 t.Run("verified registry bytes are restored when verified deals are not proven", func(t *testing.T) { 177 tv, err := v.WithEpoch(dealStart + market.DealUpdatesInterval) 178 require.NoError(t, err) 179 180 // run cron and check for deal expiry in market actor 181 vm.ApplyOk(t, tv, builtin.SystemActorAddr, builtin.CronActorAddr, big.Zero(), builtin.MethodsCron.EpochTick, nil) 182 183 vm.ExpectInvocation{ 184 To: builtin.CronActorAddr, 185 Method: builtin.MethodsCron.EpochTick, 186 SubInvocations: []vm.ExpectInvocation{ 187 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.OnEpochTickEnd, SubInvocations: []vm.ExpectInvocation{ 188 {To: minerAddrs.IDAddress, Method: builtin.MethodsMiner.OnDeferredCronEvent, SubInvocations: []vm.ExpectInvocation{ 189 {To: builtin.RewardActorAddr, Method: builtin.MethodsReward.ThisEpochReward}, 190 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.CurrentTotalPower}, 191 // pre-commit deposit is burnt 192 {To: builtin.BurntFundsActorAddr, Method: builtin.MethodSend}, 193 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.EnrollCronEvent}, 194 }}, 195 {To: builtin.RewardActorAddr, Method: builtin.MethodsReward.UpdateNetworkKPI}, 196 }}, 197 {To: builtin.StorageMarketActorAddr, Method: builtin.MethodsMarket.CronTick, SubInvocations: []vm.ExpectInvocation{ 198 // notify verified registry that used bytes are released 199 {To: builtin.VerifiedRegistryActorAddr, Method: builtin.MethodsVerifiedRegistry.RestoreBytes}, 200 {To: builtin.VerifiedRegistryActorAddr, Method: builtin.MethodsVerifiedRegistry.RestoreBytes}, 201 // slash funds 202 {To: builtin.BurntFundsActorAddr, Method: builtin.MethodSend}, 203 }}, 204 }, 205 }.Matches(t, tv.LastInvocation()) 206 }) 207 208 // advance time to min seal duration 209 proveTime = v.GetEpoch() + miner.PreCommitChallengeDelay + 1 210 v, _ = vm.AdvanceByDeadlineTillEpoch(t, v, minerAddrs.IDAddress, proveTime) 211 212 // Prove commit sector after max seal duration 213 v, err = v.WithEpoch(proveTime) 214 require.NoError(t, err) 215 proveCommitParams = miner.ProveCommitSectorParams{ 216 SectorNumber: upgradeSectorNumber, 217 } 218 vm.ApplyOk(t, v, worker, minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.ProveCommitSector, &proveCommitParams) 219 220 vm.ExpectInvocation{ 221 To: minerAddrs.IDAddress, 222 Method: builtin.MethodsMiner.ProveCommitSector, 223 Params: vm.ExpectObject(&proveCommitParams), 224 SubInvocations: []vm.ExpectInvocation{ 225 {To: builtin.StorageMarketActorAddr, Method: builtin.MethodsMarket.ComputeDataCommitment, SubInvocations: none}, 226 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.SubmitPoRepForBulkVerify, SubInvocations: none}, 227 }, 228 }.Matches(t, v.LastInvocation()) 229 230 // In the same epoch, trigger cron to validate prove commit 231 vm.ApplyOk(t, v, builtin.SystemActorAddr, builtin.CronActorAddr, big.Zero(), builtin.MethodsCron.EpochTick, nil) 232 233 vm.ExpectInvocation{ 234 To: builtin.CronActorAddr, 235 Method: builtin.MethodsCron.EpochTick, 236 SubInvocations: []vm.ExpectInvocation{ 237 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.OnEpochTickEnd, SubInvocations: []vm.ExpectInvocation{ 238 {To: minerAddrs.IDAddress, Method: builtin.MethodsMiner.ConfirmSectorProofsValid, SubInvocations: []vm.ExpectInvocation{ 239 {To: builtin.RewardActorAddr, Method: builtin.MethodsReward.ThisEpochReward}, 240 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.CurrentTotalPower}, 241 // deals are now activated 242 {To: builtin.StorageMarketActorAddr, Method: builtin.MethodsMarket.ActivateDeals}, 243 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.UpdatePledgeTotal}, 244 }}, 245 {To: builtin.RewardActorAddr, Method: builtin.MethodsReward.UpdateNetworkKPI}, 246 }}, 247 {To: builtin.StorageMarketActorAddr, Method: builtin.MethodsMarket.CronTick}, 248 }, 249 }.Matches(t, v.LastInvocation()) 250 251 // miner still has power for old sector 252 minerPower = vm.MinerPower(t, v, minerAddrs.IDAddress) 253 networkStats = vm.GetNetworkStats(t, v) 254 assert.Equal(t, sectorPower.Raw, minerPower.Raw) 255 assert.Equal(t, sectorPower.QA, minerPower.Raw) 256 assert.Equal(t, sectorPower.Raw, networkStats.TotalBytesCommitted) 257 assert.Equal(t, sectorPower.QA, networkStats.TotalQABytesCommitted) 258 259 // Assert that old sector and new sector have the same deadline. 260 // This is not generally true, but the current deadline assigment will always put these together when 261 // no other sectors have been assigned in-between. The following tests assume this fact, and must be 262 // modified if this no longer holds. 263 oldDlIdx, _ := vm.SectorDeadline(t, v, minerAddrs.IDAddress, sectorNumber) 264 newDlIdx, _ := vm.SectorDeadline(t, v, minerAddrs.IDAddress, upgradeSectorNumber) 265 require.Equal(t, oldDlIdx, newDlIdx) 266 267 t.Run("miner misses first PoSt of replacement sector", func(t *testing.T) { 268 // advance to proving period end of new sector 269 dlInfo, _, tv := vm.AdvanceTillProvingDeadline(t, v, minerAddrs.IDAddress, sectorNumber) 270 tv, err = tv.WithEpoch(dlInfo.Last()) 271 require.NoError(t, err) 272 273 // run cron to penalize missing PoSt 274 vm.ApplyOk(t, tv, builtin.SystemActorAddr, builtin.CronActorAddr, big.Zero(), builtin.MethodsCron.EpochTick, nil) 275 276 vm.ExpectInvocation{ 277 To: builtin.CronActorAddr, 278 Method: builtin.MethodsCron.EpochTick, 279 SubInvocations: []vm.ExpectInvocation{ 280 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.OnEpochTickEnd, SubInvocations: []vm.ExpectInvocation{ 281 {To: minerAddrs.IDAddress, Method: builtin.MethodsMiner.OnDeferredCronEvent, SubInvocations: []vm.ExpectInvocation{ 282 {To: builtin.RewardActorAddr, Method: builtin.MethodsReward.ThisEpochReward}, 283 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.CurrentTotalPower}, 284 // power is removed for old sector and pledge is burnt 285 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.UpdateClaimedPower}, 286 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.UpdatePledgeTotal}, 287 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.EnrollCronEvent}, 288 }}, 289 {To: builtin.RewardActorAddr, Method: builtin.MethodsReward.UpdateNetworkKPI}, 290 }}, 291 {To: builtin.StorageMarketActorAddr, Method: builtin.MethodsMarket.CronTick, SubInvocations: []vm.ExpectInvocation{}}, 292 }, 293 }.Matches(t, tv.LastInvocation()) 294 295 // miner's power is removed for old sector because it faulted and not added for the new sector. 296 minerPower = vm.MinerPower(t, tv, minerAddrs.IDAddress) 297 networkStats = vm.GetNetworkStats(t, tv) 298 assert.Equal(t, big.Zero(), minerPower.Raw) 299 assert.Equal(t, big.Zero(), minerPower.Raw) 300 assert.Equal(t, big.Zero(), networkStats.TotalBytesCommitted) 301 assert.Equal(t, big.Zero(), networkStats.TotalQABytesCommitted) 302 }) 303 304 // advance to proving period and submit post 305 dlInfo, pIdx, v = vm.AdvanceTillProvingDeadline(t, v, minerAddrs.IDAddress, upgradeSectorNumber) 306 307 t.Run("miner skips replacing sector in first PoSt", func(t *testing.T) { 308 tv, err := v.WithEpoch(v.GetEpoch()) // create vm copy 309 require.NoError(t, err) 310 311 submitParams = miner.SubmitWindowedPoStParams{ 312 Deadline: dlInfo.Index, 313 Partitions: []miner.PoStPartition{{ 314 Index: pIdx, 315 // skip cc upgrade 316 Skipped: bitfield.NewFromSet([]uint64{uint64(upgradeSectorNumber)}), 317 }}, 318 Proofs: []proof.PoStProof{{ 319 PoStProof: abi.RegisteredPoStProof_StackedDrgWindow32GiBV1, 320 }}, 321 ChainCommitEpoch: dlInfo.Challenge, 322 ChainCommitRand: []byte("not really random"), 323 } 324 vm.ApplyOk(t, tv, worker, minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.SubmitWindowedPoSt, &submitParams) 325 326 vm.ExpectInvocation{ 327 To: minerAddrs.IDAddress, 328 Method: builtin.MethodsMiner.SubmitWindowedPoSt, 329 Params: vm.ExpectObject(&submitParams), 330 }.Matches(t, tv.LastInvocation()) 331 332 // old sector power remains (until its proving deadline) 333 minerPower = vm.MinerPower(t, tv, minerAddrs.IDAddress) 334 networkStats = vm.GetNetworkStats(t, tv) 335 assert.Equal(t, sectorPower.Raw, minerPower.Raw) 336 assert.Equal(t, sectorPower.QA, minerPower.QA) 337 assert.Equal(t, sectorPower.Raw, networkStats.TotalBytesCommitted) 338 assert.Equal(t, sectorPower.QA, networkStats.TotalQABytesCommitted) 339 }) 340 341 t.Run("miner skips replaced sector in its last PoSt", func(t *testing.T) { 342 tv, err := v.WithEpoch(v.GetEpoch()) // create vm copy 343 require.NoError(t, err) 344 345 submitParams = miner.SubmitWindowedPoStParams{ 346 Deadline: dlInfo.Index, 347 Partitions: []miner.PoStPartition{{ 348 Index: pIdx, 349 // skip cc upgrade 350 Skipped: bitfield.NewFromSet([]uint64{uint64(sectorNumber)}), 351 }}, 352 Proofs: []proof.PoStProof{{ 353 PoStProof: abi.RegisteredPoStProof_StackedDrgWindow32GiBV1, 354 }}, 355 ChainCommitEpoch: dlInfo.Challenge, 356 ChainCommitRand: []byte("not really random"), 357 } 358 vm.ApplyOk(t, tv, worker, minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.SubmitWindowedPoSt, &submitParams) 359 360 vm.ExpectInvocation{ 361 To: minerAddrs.IDAddress, 362 Method: builtin.MethodsMiner.SubmitWindowedPoSt, 363 Params: vm.ExpectObject(&submitParams), 364 }.Matches(t, tv.LastInvocation()) 365 366 // old sector power is immediately removed 367 upgradeSectorPower := vm.PowerForMinerSector(t, v, minerAddrs.IDAddress, upgradeSectorNumber) 368 minerPower = vm.MinerPower(t, tv, minerAddrs.IDAddress) 369 networkStats = vm.GetNetworkStats(t, tv) 370 assert.Equal(t, upgradeSectorPower.Raw, minerPower.Raw) 371 assert.Equal(t, upgradeSectorPower.QA, minerPower.QA) 372 assert.Equal(t, upgradeSectorPower.Raw, networkStats.TotalBytesCommitted) 373 assert.Equal(t, upgradeSectorPower.QA, networkStats.TotalQABytesCommitted) 374 }) 375 376 submitParams = miner.SubmitWindowedPoStParams{ 377 Deadline: dlInfo.Index, 378 Partitions: []miner.PoStPartition{{ 379 Index: pIdx, 380 Skipped: bitfield.New(), 381 }}, 382 Proofs: []proof.PoStProof{{ 383 PoStProof: abi.RegisteredPoStProof_StackedDrgWindow32GiBV1, 384 }}, 385 ChainCommitEpoch: dlInfo.Challenge, 386 ChainCommitRand: []byte("not really random"), 387 } 388 vm.ApplyOk(t, v, worker, minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.SubmitWindowedPoSt, &submitParams) 389 390 vm.ExpectInvocation{ 391 To: minerAddrs.IDAddress, 392 Method: builtin.MethodsMiner.SubmitWindowedPoSt, 393 Params: vm.ExpectObject(&submitParams), 394 SubInvocations: []vm.ExpectInvocation{ 395 // This call to the power actor indicates power has been added for the replaced sector 396 {To: builtin.StoragePowerActorAddr, Method: builtin.MethodsPower.UpdateClaimedPower}, 397 }, 398 }.Matches(t, v.LastInvocation()) 399 400 // power is upgraded for new sector 401 // Until the old sector is terminated at its proving period, miner gets combined power for new and old sectors 402 upgradeSectorPower := vm.PowerForMinerSector(t, v, minerAddrs.IDAddress, upgradeSectorNumber) 403 combinedPower := upgradeSectorPower.Add(sectorPower) 404 minerPower = vm.MinerPower(t, v, minerAddrs.IDAddress) 405 networkStats = vm.GetNetworkStats(t, v) 406 assert.Equal(t, combinedPower.Raw, minerPower.Raw) 407 assert.Equal(t, combinedPower.QA, minerPower.QA) 408 assert.Equal(t, combinedPower.Raw, networkStats.TotalBytesCommitted) 409 assert.Equal(t, combinedPower.QA, networkStats.TotalQABytesCommitted) 410 411 // proving period cron removes sector reducing the miner's power to that of the new sector 412 v, err = v.WithEpoch(dlInfo.Last()) 413 require.NoError(t, err) 414 vm.ApplyOk(t, v, builtin.SystemActorAddr, builtin.CronActorAddr, big.Zero(), builtin.MethodsCron.EpochTick, nil) 415 416 // power is removed 417 // Until the old sector is terminated at its proving period, miner gets combined power for new and old sectors 418 minerPower = vm.MinerPower(t, v, minerAddrs.IDAddress) 419 networkStats = vm.GetNetworkStats(t, v) 420 assert.Equal(t, upgradeSectorPower.Raw, minerPower.Raw) 421 assert.Equal(t, upgradeSectorPower.QA, minerPower.QA) 422 assert.Equal(t, upgradeSectorPower.Raw, networkStats.TotalBytesCommitted) 423 assert.Equal(t, upgradeSectorPower.QA, networkStats.TotalQABytesCommitted) 424 }