migrate precommit deposit function

This commit is contained in:
Steven Allen 2020-09-15 16:47:58 -07:00
parent 02bc5fab26
commit 92471d41d6
8 changed files with 81 additions and 63 deletions

View File

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/network"
v0smoothing "github.com/filecoin-project/specs-actors/actors/util/smoothing"
) )
type Version int type Version int
@ -21,3 +23,6 @@ func VersionForNetwork(version network.Version) Version {
panic(fmt.Sprintf("unsupported network version %d", version)) panic(fmt.Sprintf("unsupported network version %d", version))
} }
} }
// TODO: find some way to abstract over this.
type FilterEstimate = v0smoothing.FilterEstimate

View File

@ -12,6 +12,8 @@ import (
"github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types"
) )
var Address = v0builtin.StorageMarketActorAddr
func Load(store adt.Store, act *types.Actor) (st State, err error) { func Load(store adt.Store, act *types.Actor) (st State, err error) {
switch act.Code { switch act.Code {
case v0builtin.StorageMarketActorCodeID: case v0builtin.StorageMarketActorCodeID:
@ -30,6 +32,9 @@ type State interface {
EscrowTable() (BalanceTable, error) EscrowTable() (BalanceTable, error)
LockedTable() (BalanceTable, error) LockedTable() (BalanceTable, error)
TotalLocked() (abi.TokenAmount, error) TotalLocked() (abi.TokenAmount, error)
VerifyDealsForActivation(
minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch,
) (weight, verifiedWeight abi.DealWeight, err error)
} }
type BalanceTable interface { type BalanceTable interface {

View File

@ -1,6 +1,7 @@
package market package market
import ( import (
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/specs-actors/actors/builtin/market" "github.com/filecoin-project/specs-actors/actors/builtin/market"
@ -25,3 +26,9 @@ func (s *v0State) EscrowTable() (BalanceTable, error) {
func (s *v0State) LockedTable() (BalanceTable, error) { func (s *v0State) LockedTable() (BalanceTable, error) {
return adt.AsBalanceTable(s.store, s.State.LockedTable) return adt.AsBalanceTable(s.store, s.State.LockedTable)
} }
func (s *v0State) VerifyDealsForActivation(
minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch,
) (weight, verifiedWeight abi.DealWeight, err error) {
return market.ValidateDealsForActivation(&s.State, s.store, deals, minerAddr, sectorExpiry, currEpoch)
}

View File

@ -9,6 +9,7 @@ import (
v0builtin "github.com/filecoin-project/specs-actors/actors/builtin" v0builtin "github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types"
) )
@ -32,6 +33,8 @@ type State interface {
TotalLocked() (abi.TokenAmount, error) TotalLocked() (abi.TokenAmount, error)
TotalPower() (Claim, error) TotalPower() (Claim, error)
TotalPowerSmoothed() (builtin.FilterEstimate, error)
MinerPower(address.Address) (Claim, bool, error) MinerPower(address.Address) (Claim, bool, error)
MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error) MinerNominalPowerMeetsConsensusMinimum(address.Address) (bool, error)
} }

View File

@ -3,6 +3,7 @@ package power
import ( import (
"github.com/filecoin-project/go-address" "github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/power" "github.com/filecoin-project/specs-actors/actors/builtin/power"
"github.com/filecoin-project/specs-actors/actors/util/adt" "github.com/filecoin-project/specs-actors/actors/util/adt"
) )
@ -42,3 +43,7 @@ func (s *v0State) MinerPower(addr address.Address) (Claim, bool, error) {
func (s *v0State) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) { func (s *v0State) MinerNominalPowerMeetsConsensusMinimum(a address.Address) (bool, error) {
return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a) return s.State.MinerNominalPowerMeetsConsensusMinimum(s.store, a)
} }
func (s *v0State) TotalPowerSmoothed() (builtin.FilterEstimate, error) {
return *s.State.ThisEpochQAPowerSmoothed, nil
}

View File

@ -7,6 +7,7 @@ import (
v0builtin "github.com/filecoin-project/specs-actors/actors/builtin" v0builtin "github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types"
) )
@ -27,4 +28,6 @@ func Load(store adt.Store, act *types.Actor) (st State, err error) {
type State interface { type State interface {
cbor.Marshaler cbor.Marshaler
RewardSmoothed() (builtin.FilterEstimate, error)
} }

View File

@ -1,6 +1,7 @@
package reward package reward
import ( import (
"github.com/filecoin-project/lotus/chain/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/reward" "github.com/filecoin-project/specs-actors/actors/builtin/reward"
"github.com/filecoin-project/specs-actors/actors/util/adt" "github.com/filecoin-project/specs-actors/actors/util/adt"
) )
@ -9,3 +10,7 @@ type v0State struct {
reward.State reward.State
store adt.Store store adt.Store
} }
func (s *v0State) RewardSmoothed() (builtin.FilterEstimate, error) {
return *s.State.ThisEpochRewardSmoothed, nil
}

View File

@ -21,16 +21,17 @@ import (
"github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper"
"github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/market" v0miner "github.com/filecoin-project/specs-actors/actors/builtin/miner"
"github.com/filecoin-project/specs-actors/actors/builtin/power"
"github.com/filecoin-project/specs-actors/actors/builtin/reward"
"github.com/filecoin-project/specs-actors/actors/builtin/verifreg" "github.com/filecoin-project/specs-actors/actors/builtin/verifreg"
"github.com/filecoin-project/specs-actors/actors/util/adt" "github.com/filecoin-project/specs-actors/actors/util/adt"
"github.com/filecoin-project/specs-actors/actors/util/smoothing"
"github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/miner"
"github.com/filecoin-project/lotus/chain/actors/builtin/multisig" "github.com/filecoin-project/lotus/chain/actors/builtin/multisig"
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
"github.com/filecoin-project/lotus/chain/actors/builtin/reward"
"github.com/filecoin-project/lotus/chain/beacon" "github.com/filecoin-project/lotus/chain/beacon"
"github.com/filecoin-project/lotus/chain/gen" "github.com/filecoin-project/lotus/chain/gen"
"github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/state"
@ -41,6 +42,7 @@ import (
"github.com/filecoin-project/lotus/chain/wallet" "github.com/filecoin-project/lotus/chain/wallet"
"github.com/filecoin-project/lotus/lib/bufbstore" "github.com/filecoin-project/lotus/lib/bufbstore"
"github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/dtypes"
"github.com/filecoin-project/lotus/chain/actors/builtin/market"
) )
var errBreakForeach = errors.New("break") var errBreakForeach = errors.New("break")
@ -854,74 +856,57 @@ func (a *StateAPI) StateMinerPreCommitDepositForPower(ctx context.Context, maddr
return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err) return types.EmptyInt, xerrors.Errorf("loading tipset %s: %w", tsk, err)
} }
var minerState miner.State state, err := a.StateManager.ParentState(ts)
var powerState power.State
var rewardState reward.State
err = a.StateManager.WithParentStateTsk(tsk, func(state *state.StateTree) error {
if err := a.StateManager.WithActor(maddr, a.StateManager.WithActorState(ctx, &minerState))(state); err != nil {
return xerrors.Errorf("getting miner state: %w", err)
}
if err := a.StateManager.WithActor(builtin.StoragePowerActorAddr, a.StateManager.WithActorState(ctx, &powerState))(state); err != nil {
return xerrors.Errorf("getting power state: %w", err)
}
if err := a.StateManager.WithActor(builtin.RewardActorAddr, a.StateManager.WithActorState(ctx, &rewardState))(state); err != nil {
return xerrors.Errorf("getting reward state: %w", err)
}
return nil
})
if err != nil { if err != nil {
return types.EmptyInt, err return types.EmptyInt, xerrors.Errorf("loading state %s: %w", tsk, err)
} }
dealWeights := market.VerifyDealsForActivationReturn{ ssize, err := pci.SealProof.SectorSize()
DealWeight: big.Zero(),
VerifiedDealWeight: big.Zero(),
}
if len(pci.DealIDs) != 0 {
var err error
params, err := actors.SerializeParams(&market.VerifyDealsForActivationParams{
DealIDs: pci.DealIDs,
SectorExpiry: pci.Expiration,
})
if err != nil { if err != nil {
return types.EmptyInt, err return types.EmptyInt, xerrors.Errorf("failed to get resolve size: %w", err)
} }
ret, err := a.StateManager.Call(ctx, &types.Message{ store := a.Chain.Store(ctx)
From: maddr,
To: builtin.StorageMarketActorAddr, var sectorWeight abi.StoragePower
Method: builtin.MethodsMarket.VerifyDealsForActivation, if act, err := state.GetActor(market.Address); err != nil {
Params: params, return types.EmptyInt, xerrors.Errorf("loading miner actor %s: %w", maddr, err)
}, ts) } else s, err := market.Load(store, act); err != nil {
if err != nil { return types.EmptyInt, xerrors.Errorf("loading market actor state %s: %w", maddr, err)
return types.EmptyInt, err } else if w, vw, err := s.VerifyDealsForActivation(maddr, pci.DealIDs, ts.Height(), pci.Expiration); err != nil {
return types.EmptyInt, xerrors.Errorf("verifying deals for activation: %w", err)
} else {
// NB: not exactly accurate, but should always lead us to *over* estimate, not under
duration := pci.Expiration - ts.Height()
// TODO: handle changes to this function across actor upgrades.
sectorWeight = v0miner.QAPowerForWeight(ssize, duration, w, vw)
} }
if err := dealWeights.UnmarshalCBOR(bytes.NewReader(ret.MsgRct.Return)); err != nil { var powerSmoothed smoothing.FilterEstimate
return types.BigInt{}, err if act, err := state.GetActor(power.Address); err != nil {
} return types.EmptyInt, xerrors.Errorf("loading miner actor: %w", err)
} else s, err := power.Load(store, act); err != nil {
return types.EmptyInt, xerrors.Errorf("loading power actor state: %w", err)
} else p, err := s.TotalPowerSmoothed(); err != nil {
return types.EmptyInt, xerrors.Errorf("failed to determine total power: %w", err)
} else {
powerSmoothed = p
} }
mi, err := a.StateMinerInfo(ctx, maddr, tsk) var rewardSmoothed smoothing.FilterEstimate
if err != nil { if act, err := state.GetActor(reward.Address); err != nil {
return types.EmptyInt, err return types.EmptyInt, xerrors.Errorf("loading miner actor: %w", err)
} else s, err := reward.Load(store, act); err != nil {
return types.EmptyInt, xerrors.Errorf("loading reward actor state: %w", err)
} else r, err := s.RewardSmoothed(); err != nil {
return types.EmptyInt, xerrors.Errorf("failed to determine total reward: %w", err)
} else {
rewardSmoothed = r
} }
ssize := mi.SectorSize // TODO: abstract over network upgrades.
deposit := v0miner.PreCommitDepositForPower(rewardSmoothed, powerSmoothed, sectorWeight)
duration := pci.Expiration - ts.Height() // NB: not exactly accurate, but should always lead us to *over* estimate, not under
sectorWeight := miner.QAPowerForWeight(ssize, duration, dealWeights.DealWeight, dealWeights.VerifiedDealWeight)
deposit := miner.PreCommitDepositForPower(
rewardState.ThisEpochRewardSmoothed,
powerState.ThisEpochQAPowerSmoothed,
sectorWeight,
)
return types.BigDiv(types.BigMul(deposit, initialPledgeNum), initialPledgeDen), nil return types.BigDiv(types.BigMul(deposit, initialPledgeNum), initialPledgeDen), nil
} }