diff --git a/chain/actors/actor_miner.go b/chain/actors/actor_miner.go index 72ce55785..5462f33a4 100644 --- a/chain/actors/actor_miner.go +++ b/chain/actors/actor_miner.go @@ -26,22 +26,8 @@ const POST_SECTORS_COUNT = 8192 type StorageMinerActor struct{} type StorageMinerActorState struct { - // Account that owns this miner. - // - Income and returned collateral are paid to this address. - // - This address is also allowed to change the worker address for the miner. - Owner address.Address - - // Worker account for this miner. - // This will be the key that is used to sign blocks created by this miner, and - // sign messages sent on behalf of this miner to commit sectors, submit PoSts, and - // other day to day miner activities. - Worker address.Address - - // Libp2p identity that should be used when connecting to this miner. - PeerID peer.ID - - // Amount of space in each sector committed to the network by this miner. - SectorSize types.BigInt + // Contains mostly static info about this miner + Info cid.Cid // Collateral that is waiting to be withdrawn. DePledgedCollateral types.BigInt @@ -70,8 +56,6 @@ type StorageMinerActorState struct { // Amount of power this miner has. Power types.BigInt - ProvingPeriodEnd uint64 - // List of sectors that this miner was slashed for. //SlashedSet SectorSet @@ -80,6 +64,27 @@ type StorageMinerActorState struct { // The amount of storage collateral that is owed to clients, and cannot be used for collateral anymore. OwedStorageCollateral types.BigInt + + ProvingPeriodEnd uint64 +} + +type MinerInfo struct { + // Account that owns this miner. + // - Income and returned collateral are paid to this address. + // - This address is also allowed to change the worker address for the miner. + Owner address.Address + + // Worker account for this miner. + // This will be the key that is used to sign blocks created by this miner, and + // sign messages sent on behalf of this miner to commit sectors, submit PoSts, and + // other day to day miner activities. + Worker address.Address + + // Libp2p identity that should be used when connecting to this miner. + PeerID peer.ID + + // Amount of space in each sector committed to the network by this miner. + SectorSize types.BigInt } type StorageMinerConstructorParams struct { @@ -112,9 +117,9 @@ func (sma StorageMinerActor) Exports() []interface{} { return []interface{}{ 1: sma.StorageMinerConstructor, 2: sma.CommitSector, - //3: sma.SubmitPost, + 3: sma.SubmitPoSt, //4: sma.SlashStorageFault, - //5: sma.GetCurrentProvingSet, + //5: sma.GetCurrentProvingSet, //6: sma.ArbitrateDeal, //7: sma.DePledge, 8: sma.GetOwner, @@ -137,13 +142,29 @@ func loadState(vmctx types.VMContext) (cid.Cid, *StorageMinerActorState, ActorEr return oldstate, &self, nil } -func (sma StorageMinerActor) StorageMinerConstructor(act *types.Actor, vmctx types.VMContext, params *StorageMinerConstructorParams) ([]byte, ActorError) { - var self StorageMinerActorState - self.Owner = params.Owner - self.Worker = params.Worker - self.PeerID = params.PeerID - self.SectorSize = params.SectorSize +func loadMinerInfo(vmctx types.VMContext, m *StorageMinerActorState) (*MinerInfo, ActorError) { + var mi MinerInfo + if err := vmctx.Storage().Get(m.Info, &mi); err != nil { + return nil, err + } + return &mi, nil +} + +func (sma StorageMinerActor) StorageMinerConstructor(act *types.Actor, vmctx types.VMContext, params *StorageMinerConstructorParams) ([]byte, ActorError) { + minerInfo := &MinerInfo{ + Owner: params.Owner, + Worker: params.Worker, + PeerID: params.PeerID, + SectorSize: params.SectorSize, + } + + minfocid, err := vmctx.Storage().Put(minerInfo) + if err != nil { + return nil, err + } + + var self StorageMinerActorState nd := hamt.NewNode(vmctx.Ipld()) sectors, nerr := vmctx.Ipld().Put(context.TODO(), nd) if nerr != nil { @@ -179,7 +200,12 @@ func (sma StorageMinerActor) CommitSector(act *types.Actor, vmctx types.VMContex return nil, err } - if !ValidatePoRep(self.SectorSize, params) { + mi, err := loadMinerInfo(vmctx, self) + if err != nil { + return nil, err + } + + if !ValidatePoRep(mi.SectorSize, params) { return nil, aerrors.New(1, "bad proof!") } @@ -193,7 +219,7 @@ func (sma StorageMinerActor) CommitSector(act *types.Actor, vmctx types.VMContex } // Power of the miner after adding this sector - futurePower := types.BigAdd(self.Power, self.SectorSize) + futurePower := types.BigAdd(self.Power, mi.SectorSize) collateralRequired := CollateralForPower(futurePower) if types.BigCmp(collateralRequired, act.Balance) < 0 { @@ -239,6 +265,36 @@ func (sma StorageMinerActor) CommitSector(act *types.Actor, vmctx types.VMContex return nil, nil } +type SubmitPoStParams struct { + // TODO: once the spec changes finish, we have more work to do here... +} + +func (sma StorageMinerActor) SubmitPoSt(act *types.Actor, vmctx types.VMContext, params *SubmitPoStParams) ([]byte, ActorError) { + oldstate, self, err := loadState(vmctx) + if err != nil { + return nil, err + } + + mi, err := loadMinerInfo(vmctx, self) + if err != nil { + return nil, err + } + + if vmctx.Message().From != mi.Worker { + return nil, aerrors.New(1, "not authorized to submit post for miner") + } + + oldProvingSetSize := self.ProvingSetSize + + self.ProvingSet = self.Sectors + self.ProvingSetSize = self.SectorSetSize + + oldPower := self.Power + self.Power = (oldProvingSetSize * mi.SectorSize) + + // TODO: call update power +} + func (sma StorageMinerActor) GetPower(act *types.Actor, vmctx types.VMContext, params *struct{}) ([]byte, ActorError) { _, self, err := loadState(vmctx) if err != nil {