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, ¶ms) 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(¶ms), 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, ¶ms) 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 }