check pending verified deal proposal migrated to allocation

This commit is contained in:
Geoff Stuart 2022-10-09 11:16:25 -04:00 committed by Aayush
parent 0ab9e4359a
commit d9a43d4b8e
2 changed files with 137 additions and 40 deletions

View File

@ -12,6 +12,12 @@ 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/go-state-types/builtin"
market8 "github.com/filecoin-project/go-state-types/builtin/v8/market"
adt8 "github.com/filecoin-project/go-state-types/builtin/v8/util/adt"
market9 "github.com/filecoin-project/go-state-types/builtin/v9/market"
adt9 "github.com/filecoin-project/go-state-types/builtin/v9/util/adt"
verifreg9 "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
"github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15"
"github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/blockstore"
@ -197,7 +203,7 @@ func checkDatacaps(stateTreeV8 state.StateTree, stateTreeV9 state.StateTree, act
} }
func getVerifreg8Datacaps(stateTreeV8 state.StateTree, actorStore adt.Store) (map[address.Address]abi.StoragePower, error) { func getVerifreg8Datacaps(stateTreeV8 state.StateTree, actorStore adt.Store) (map[address.Address]abi.StoragePower, error) {
verifregStateV8, err := getVerifregV8State(stateTreeV8, actorStore) verifregStateV8, err := getVerifregActorV8(stateTreeV8, actorStore)
if err != nil { if err != nil {
return nil, xerrors.Errorf("failed to get verifreg actor state: %w", err) return nil, xerrors.Errorf("failed to get verifreg actor state: %w", err)
} }
@ -215,7 +221,7 @@ func getVerifreg8Datacaps(stateTreeV8 state.StateTree, actorStore adt.Store) (ma
} }
func getDatacap9Datacaps(stateTreeV9 state.StateTree, actorStore adt.Store) (map[address.Address]abi.StoragePower, error) { func getDatacap9Datacaps(stateTreeV9 state.StateTree, actorStore adt.Store) (map[address.Address]abi.StoragePower, error) {
datacapStateV9, err := getDatacapV9State(stateTreeV9, actorStore) datacapStateV9, err := getDatacapActorV9(stateTreeV9, actorStore)
if err != nil { if err != nil {
return nil, xerrors.Errorf("failed to get datacap actor state: %w", err) return nil, xerrors.Errorf("failed to get datacap actor state: %w", err)
} }
@ -233,57 +239,77 @@ func getDatacap9Datacaps(stateTreeV9 state.StateTree, actorStore adt.Store) (map
} }
func checkPendingVerifiedDeals(stateTreeV8 state.StateTree, stateTreeV9 state.StateTree, actorStore adt.Store) error { func checkPendingVerifiedDeals(stateTreeV8 state.StateTree, stateTreeV9 state.StateTree, actorStore adt.Store) error {
marketStateV8, err := getMarketV8State(stateTreeV8, actorStore) marketActorV9, err := getMarketActorV9(stateTreeV9, actorStore)
if err != nil { if err != nil {
return err return err
} }
marketStateV9, err := getMarketV9State(stateTreeV9, actorStore) verifregActorV9, err := getVerifregActorV9(stateTreeV9, actorStore)
if err != nil { if err != nil {
return err return err
} }
verifregStateV9, err := getVerifregV9State(stateTreeV9, actorStore) verifregStateV9, err := getVerifregStateV9(stateTreeV9, actorStore)
if err != nil { if err != nil {
return err return err
} }
v8DealStates, err := marketStateV8.States() marketStateV8, err := getMarketStateV8(stateTreeV8, actorStore)
if err != nil { if err != nil {
return err return err
} }
v8DealProposals, err := marketStateV8.Proposals() marketStateV9, err := getMarketStateV9(stateTreeV9, actorStore)
if err != nil { if err != nil {
return err return err
} }
pendingProposalsV8, err := adt8.AsSet(actorStore, marketStateV8.PendingProposals, builtin.DefaultHamtBitwidth)
if err != nil {
return xerrors.Errorf("failed to load pending proposals: %w", err)
}
dealProposalsV8, err := market8.AsDealProposalArray(actorStore, marketStateV8.Proposals)
if err != nil {
return xerrors.Errorf("failed to get proposals: %w", err)
}
var numPendingVerifiedDeals = 0 var numPendingVerifiedDeals = 0
err = v8DealStates.ForEach(func(id abi.DealID, ds market.DealState) error { var proposal market8.DealProposal
// Proposal hasn't been activated yet err = dealProposalsV8.ForEach(&proposal, func(dealID int64) error {
if ds.SectorStartEpoch == -1 { // If not verified, do nothing
proposal, _, err := v8DealProposals.Get(id) if !proposal.VerifiedDeal {
if err != nil { return nil
return err }
}
// Verified deal pcid, err := proposal.Cid()
if proposal.VerifiedDeal { if err != nil {
numPendingVerifiedDeals++ return err
// Checks if allocation ID is in market map }
allocationId, err := marketStateV9.GetAllocationIdForPendingDeal(id)
if err != nil { isPending, err := pendingProposalsV8.Has(abi.CidKey(pcid))
return err if err != nil {
} return xerrors.Errorf("failed to check pending: %w", err)
// Checks if allocation is in verifreg }
_, found, err := verifregStateV9.GetAllocation(proposal.Client, allocationId)
if !found { // Nothing to do for not-pending deals
return xerrors.Errorf("allocation %d not found for address %s", allocationId, proposal.Client) if !isPending {
} return nil
if err != nil { }
return err
} numPendingVerifiedDeals++
} // Checks if allocation ID is in market map
allocationId, err := marketActorV9.GetAllocationIdForPendingDeal(abi.DealID(dealID))
if err != nil {
return err
}
// Checks if allocation is in verifreg
_, found, err := verifregActorV9.GetAllocation(proposal.Client, allocationId)
if !found {
return xerrors.Errorf("allocation %d not found for address %s", allocationId, proposal.Client)
}
if err != nil {
return err
} }
return nil return nil
}) })
@ -291,28 +317,67 @@ func checkPendingVerifiedDeals(stateTreeV8 state.StateTree, stateTreeV9 state.St
return err return err
} }
numAllocations, err := countAllocations(verifregStateV9) fmt.Printf("Pending Verified deals in market v8: %d\n", numPendingVerifiedDeals)
numAllocationIds, err := countAllocationIds(actorStore, marketStateV9)
if err != nil { if err != nil {
return err return err
} }
fmt.Printf("Allocation IDs in market v9: %d\n", numAllocationIds)
if numAllocationIds != numPendingVerifiedDeals {
return xerrors.Errorf("number of allocation IDsf: %d did not match the number of pending verified deals: %d", numAllocationIds, numPendingVerifiedDeals)
}
numAllocations, err := countAllocations(verifregActorV9)
if err != nil {
return err
}
fmt.Printf("Allocations in verifreg v9: %d\n", numAllocations)
if numAllocations != numPendingVerifiedDeals { if numAllocations != numPendingVerifiedDeals {
return xerrors.Errorf("number of allocations: %d did not match the number of pending verified deals: %d", numAllocations, numPendingVerifiedDeals) return xerrors.Errorf("number of allocations: %d did not match the number of pending verified deals: %d", numAllocations, numPendingVerifiedDeals)
} }
nextAllocationId := int(verifregStateV9.NextAllocationId)
fmt.Printf("Next Allocation ID: %d\n", nextAllocationId)
if numAllocations+1 != nextAllocationId {
return xerrors.Errorf("number of allocations + 1: %d did not match the next allocation ID: %d", numAllocations+1, nextAllocationId)
}
return nil return nil
} }
func getMarketV8State(stateTreeV8 state.StateTree, actorStore adt.Store) (market.State, error) { func getMarketStateV8(stateTreeV8 state.StateTree, actorStore adt.Store) (market8.State, error) {
marketV9, err := stateTreeV8.GetActor(market.Address) marketV8, err := stateTreeV8.GetActor(market.Address)
if err != nil { if err != nil {
return nil, err return market8.State{}, err
} }
return market.Load(actorStore, marketV9) var marketStateV8 market8.State
if err = actorStore.Get(actorStore.Context(), marketV8.Head, &marketStateV8); err != nil {
return market8.State{}, xerrors.Errorf("failed to get market actor state: %w", err)
}
return marketStateV8, nil
} }
func getMarketV9State(stateTreeV9 state.StateTree, actorStore adt.Store) (market.State, error) { func getMarketStateV9(stateTreeV9 state.StateTree, actorStore adt.Store) (market9.State, error) {
marketV9, err := stateTreeV9.GetActor(market.Address)
if err != nil {
return market9.State{}, err
}
var marketStateV9 market9.State
if err = actorStore.Get(actorStore.Context(), marketV9.Head, &marketStateV9); err != nil {
return market9.State{}, xerrors.Errorf("failed to get market actor state: %w", err)
}
return marketStateV9, nil
}
func getMarketActorV9(stateTreeV9 state.StateTree, actorStore adt.Store) (market.State, error) {
marketV9, err := stateTreeV9.GetActor(market.Address) marketV9, err := stateTreeV9.GetActor(market.Address)
if err != nil { if err != nil {
return nil, err return nil, err
@ -321,7 +386,7 @@ func getMarketV9State(stateTreeV9 state.StateTree, actorStore adt.Store) (market
return market.Load(actorStore, marketV9) return market.Load(actorStore, marketV9)
} }
func getVerifregV8State(stateTreeV8 state.StateTree, actorStore adt.Store) (verifreg.State, error) { func getVerifregActorV8(stateTreeV8 state.StateTree, actorStore adt.Store) (verifreg.State, error) {
verifregV8, err := stateTreeV8.GetActor(verifreg.Address) verifregV8, err := stateTreeV8.GetActor(verifreg.Address)
if err != nil { if err != nil {
return nil, err return nil, err
@ -330,7 +395,7 @@ func getVerifregV8State(stateTreeV8 state.StateTree, actorStore adt.Store) (veri
return verifreg.Load(actorStore, verifregV8) return verifreg.Load(actorStore, verifregV8)
} }
func getVerifregV9State(stateTreeV9 state.StateTree, actorStore adt.Store) (verifreg.State, error) { func getVerifregActorV9(stateTreeV9 state.StateTree, actorStore adt.Store) (verifreg.State, error) {
verifregV9, err := stateTreeV9.GetActor(verifreg.Address) verifregV9, err := stateTreeV9.GetActor(verifreg.Address)
if err != nil { if err != nil {
return nil, err return nil, err
@ -339,7 +404,21 @@ func getVerifregV9State(stateTreeV9 state.StateTree, actorStore adt.Store) (veri
return verifreg.Load(actorStore, verifregV9) return verifreg.Load(actorStore, verifregV9)
} }
func getDatacapV9State(stateTreeV9 state.StateTree, actorStore adt.Store) (datacap.State, error) { func getVerifregStateV9(stateTreeV9 state.StateTree, actorStore adt.Store) (verifreg9.State, error) {
verifregV9, err := stateTreeV9.GetActor(verifreg.Address)
if err != nil {
return verifreg9.State{}, err
}
var verifregStateV9 verifreg9.State
if err = actorStore.Get(actorStore.Context(), verifregV9.Head, &verifregStateV9); err != nil {
return verifreg9.State{}, xerrors.Errorf("failed to get verifreg actor state: %w", err)
}
return verifregStateV9, nil
}
func getDatacapActorV9(stateTreeV9 state.StateTree, actorStore adt.Store) (datacap.State, error) {
datacapV9, err := stateTreeV9.GetActor(datacap.Address) datacapV9, err := stateTreeV9.GetActor(datacap.Address)
if err != nil { if err != nil {
return nil, err return nil, err
@ -363,3 +442,18 @@ func countAllocations(verifregState verifreg.State) (int, error) {
} }
return count, nil return count, nil
} }
func countAllocationIds(store adt.Store, marketState market9.State) (int, error) {
allocationIds, err := adt9.AsMap(store, marketState.PendingDealAllocationIds, builtin.DefaultHamtBitwidth)
if err != nil {
return 0, err
}
var numAllocationIds int
_ = allocationIds.ForEach(nil, func(key string) error {
numAllocationIds++
return nil
})
return numAllocationIds, nil
}

View File

@ -194,4 +194,7 @@ func TestGetAllocationForPendingDeal(t *testing.T) {
for _, alloc := range allocations { for _, alloc := range allocations {
require.Equal(t, alloc, *allocation) require.Equal(t, alloc, *allocation)
} }
marketDeal, err := api.StateMarketStorageDeal(ctx, dealIds[0], types.EmptyTSK)
require.Equal(t, marketDeal.State.SectorStartEpoch, abi.ChainEpoch(-1))
} }