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, &params)
    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  }