github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/test/power_scenario_test.go (about)

     1  package test_test
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/filecoin-project/go-state-types/abi"
     8  	"github.com/filecoin-project/go-state-types/big"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/filecoin-project/specs-actors/v4/actors/builtin"
    12  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/miner"
    13  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/power"
    14  	"github.com/filecoin-project/specs-actors/v4/support/ipld"
    15  	tutil "github.com/filecoin-project/specs-actors/v4/support/testing"
    16  	vm "github.com/filecoin-project/specs-actors/v4/support/vm"
    17  )
    18  
    19  func TestCreateMiner(t *testing.T) {
    20  	ctx := context.Background()
    21  	v := vm.NewVMWithSingletons(ctx, t, ipld.NewBlockStoreInMemory())
    22  	addrs := vm.CreateAccounts(ctx, t, v, 1, big.Mul(big.NewInt(10_000), big.NewInt(1e18)), 93837778)
    23  
    24  	params := power.CreateMinerParams{
    25  		Owner:               addrs[0],
    26  		Worker:              addrs[0],
    27  		WindowPoStProofType: abi.RegisteredPoStProof_StackedDrgWindow32GiBV1,
    28  		Peer:                abi.PeerID("not really a peer id"),
    29  	}
    30  	ret := vm.ApplyOk(t, v, addrs[0], builtin.StoragePowerActorAddr, big.NewInt(1e10), builtin.MethodsPower.CreateMiner, &params)
    31  
    32  	minerAddrs, ok := ret.(*power.CreateMinerReturn)
    33  	require.True(t, ok)
    34  
    35  	// all expectations implicitly expected to be Ok
    36  	vm.ExpectInvocation{
    37  		// Original send to storage power actor
    38  		To:     builtin.StoragePowerActorAddr,
    39  		Method: builtin.MethodsPower.CreateMiner,
    40  		Params: vm.ExpectObject(&params),
    41  		Ret:    vm.ExpectObject(ret),
    42  		SubInvocations: []vm.ExpectInvocation{{
    43  
    44  			// Storage power requests init actor construct a miner
    45  			To:     builtin.InitActorAddr,
    46  			Method: builtin.MethodsInit.Exec,
    47  			SubInvocations: []vm.ExpectInvocation{{
    48  
    49  				// Miner constructor gets params from original call
    50  				To:     minerAddrs.IDAddress,
    51  				Method: builtin.MethodConstructor,
    52  				Params: vm.ExpectObject(&miner.ConstructorParams{
    53  					OwnerAddr:           params.Owner,
    54  					WorkerAddr:          params.Worker,
    55  					WindowPoStProofType: params.WindowPoStProofType,
    56  					PeerId:              params.Peer,
    57  				}),
    58  				SubInvocations: []vm.ExpectInvocation{},
    59  			}},
    60  		}},
    61  	}.Matches(t, v.Invocations()[0])
    62  }
    63  
    64  func TestOnEpochTickEnd(t *testing.T) {
    65  	ctx := context.Background()
    66  	v := vm.NewVMWithSingletons(ctx, t, ipld.NewBlockStoreInMemory())
    67  	addrs := vm.CreateAccounts(ctx, t, v, 1, big.Mul(big.NewInt(10_000), big.NewInt(1e18)), 93837778)
    68  
    69  	// create a miner
    70  	minerBalance := big.Mul(big.NewInt(10_000), vm.FIL)
    71  	params := power.CreateMinerParams{Owner: addrs[0], Worker: addrs[0],
    72  		WindowPoStProofType: abi.RegisteredPoStProof_StackedDrgWindow32GiBV1,
    73  		Peer:                abi.PeerID("pid")}
    74  	ret := vm.ApplyOk(t, v, addrs[0], builtin.StoragePowerActorAddr, minerBalance, builtin.MethodsPower.CreateMiner, &params)
    75  
    76  	ret, ok := ret.(*power.CreateMinerReturn)
    77  	require.True(t, ok)
    78  
    79  	minerAddrs, ok := ret.(*power.CreateMinerReturn)
    80  	require.True(t, ok)
    81  
    82  	// create precommit to schedule cron
    83  	sealProof := abi.RegisteredSealProof_StackedDrg32GiBV1_1
    84  	sectorNumber := abi.SectorNumber(100)
    85  	sealedCid := tutil.MakeCID("100", &miner.SealedCIDPrefix)
    86  	preCommitParams := miner.PreCommitSectorParams{
    87  		SealProof:     sealProof,
    88  		SectorNumber:  sectorNumber,
    89  		SealedCID:     sealedCid,
    90  		SealRandEpoch: v.GetEpoch() - 1,
    91  		DealIDs:       nil,
    92  		Expiration:    v.GetEpoch() + miner.MinSectorExpiration + miner.MaxProveCommitDuration[sealProof] + 100,
    93  	}
    94  	vm.ApplyOk(t, v, addrs[0], minerAddrs.RobustAddress, big.Zero(), builtin.MethodsMiner.PreCommitSector, &preCommitParams)
    95  
    96  	// find epoch of miner's next cron task (precommit:1, enrollCron:2)
    97  	cronParams := vm.ParamsForInvocation(t, v, 1, 2)
    98  	cronConfig, ok := cronParams.(*power.EnrollCronEventParams)
    99  	require.True(t, ok)
   100  
   101  	// create new vm at epoch 1 less than epoch requested by miner
   102  	v, err := v.WithEpoch(cronConfig.EventEpoch - 1)
   103  	require.NoError(t, err)
   104  
   105  	// run cron and expect a call to miner and a call to update reward actor parameters
   106  	vm.ApplyOk(t, v, builtin.CronActorAddr, builtin.StoragePowerActorAddr, big.Zero(), builtin.MethodsPower.OnEpochTickEnd, abi.Empty)
   107  
   108  	// expect miner call to be missing
   109  	vm.ExpectInvocation{
   110  		// Original send to storage power actor
   111  		To:     builtin.StoragePowerActorAddr,
   112  		Method: builtin.MethodsPower.OnEpochTickEnd,
   113  		SubInvocations: []vm.ExpectInvocation{{
   114  			// expect call to reward to update kpi
   115  			To:     builtin.RewardActorAddr,
   116  			Method: builtin.MethodsReward.UpdateNetworkKPI,
   117  			From:   builtin.StoragePowerActorAddr,
   118  		}},
   119  	}.Matches(t, v.Invocations()[0])
   120  
   121  	// create new vm at cron epoch with existing state
   122  	v, err = v.WithEpoch(cronConfig.EventEpoch)
   123  	require.NoError(t, err)
   124  
   125  	// run cron and expect a call to miner and a call to update reward actor parameters
   126  	vm.ApplyOk(t, v, builtin.CronActorAddr, builtin.StoragePowerActorAddr, big.Zero(), builtin.MethodsPower.OnEpochTickEnd, abi.Empty)
   127  
   128  	// expect call to miner
   129  	vm.ExpectInvocation{
   130  		// Original send to storage power actor
   131  		To:     builtin.StoragePowerActorAddr,
   132  		Method: builtin.MethodsPower.OnEpochTickEnd,
   133  		SubInvocations: []vm.ExpectInvocation{{
   134  
   135  			// expect call back to miner that was set up in create miner
   136  			To:     minerAddrs.IDAddress,
   137  			Method: builtin.MethodsMiner.OnDeferredCronEvent,
   138  			From:   builtin.StoragePowerActorAddr,
   139  			Value:  vm.ExpectAttoFil(big.Zero()),
   140  			Params: vm.ExpectBytes(cronConfig.Payload),
   141  		}, {
   142  
   143  			// expect call to reward to update kpi
   144  			To:     builtin.RewardActorAddr,
   145  			Method: builtin.MethodsReward.UpdateNetworkKPI,
   146  			From:   builtin.StoragePowerActorAddr,
   147  		}},
   148  	}.Matches(t, v.Invocations()[0])
   149  }