package itests import ( "bytes" "context" "crypto/rand" "testing" "time" "github.com/ipfs/go-cid" "github.com/stretchr/testify/require" cborutil "github.com/filecoin-project/go-cbor-util" "github.com/filecoin-project/go-commp-utils/nonffi" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" market2 "github.com/filecoin-project/go-state-types/builtin/v9/market" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/chain/actors/builtin/market" minertypes "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/lib/must" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/storage/pipeline/piece" ) func TestActors13Migration(t *testing.T) { var ( blocktime = 2 * time.Millisecond ctx = context.Background() ) client, _, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.UpgradeSchedule(stmgr.Upgrade{ Network: network.Version21, Height: -1, }, stmgr.Upgrade{ Network: network.Version22, Height: 10, Migration: filcns.UpgradeActorsV13, })) ens.InterconnectAll().BeginMiningMustPost(blocktime) // mine until 15 client.WaitTillChain(ctx, kit.HeightAtLeast(15)) } func TestOnboardRawPiece(t *testing.T) { kit.QuietMiningLogs() var ( blocktime = 2 * time.Millisecond ctx = context.Background() ) client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC()) ens.InterconnectAll().BeginMiningMustPost(blocktime) pieceSize := abi.PaddedPieceSize(2048).Unpadded() pieceData := make([]byte, pieceSize) _, _ = rand.Read(pieceData) dc, err := miner.ComputeDataCid(ctx, pieceSize, bytes.NewReader(pieceData)) require.NoError(t, err) head, err := client.ChainHead(ctx) require.NoError(t, err) so, err := miner.SectorAddPieceToAny(ctx, pieceSize, bytes.NewReader(pieceData), piece.PieceDealInfo{ PublishCid: nil, DealID: 0, DealProposal: nil, DealSchedule: piece.DealSchedule{ StartEpoch: head.Height() + 2880*2, EndEpoch: head.Height() + 2880*400, }, KeepUnsealed: true, PieceActivationManifest: &minertypes.PieceActivationManifest{ CID: dc.PieceCID, Size: dc.Size, VerifiedAllocationKey: nil, Notify: nil, }, }) require.NoError(t, err) // wait for sector to commit // wait for sector to commit and enter proving state toCheck := map[abi.SectorNumber]struct{}{ so.Sector: {}, } miner.WaitSectorsProving(ctx, toCheck) si, err := miner.SectorsStatus(ctx, so.Sector, false) require.NoError(t, err) require.Equal(t, dc.PieceCID, *si.CommD) } func makeMarketDealProposal(t *testing.T, client *kit.TestFullNode, miner *kit.TestMiner, data cid.Cid, ps abi.PaddedPieceSize, start, end abi.ChainEpoch) market2.ClientDealProposal { ca, err := client.WalletDefaultAddress(context.Background()) require.NoError(t, err) ma, err := miner.ActorAddress(context.Background()) require.NoError(t, err) dp := market2.DealProposal{ PieceCID: data, PieceSize: ps, VerifiedDeal: false, Client: ca, Provider: ma, Label: must.One(market2.NewLabelFromString("wat")), StartEpoch: start, EndEpoch: end, StoragePricePerEpoch: big.Zero(), ProviderCollateral: abi.TokenAmount{}, // below ClientCollateral: big.Zero(), } cb, err := client.StateDealProviderCollateralBounds(context.Background(), dp.PieceSize, dp.VerifiedDeal, types.EmptyTSK) require.NoError(t, err) dp.ProviderCollateral = big.Div(big.Mul(cb.Min, big.NewInt(2)), big.NewInt(2)) buf, err := cborutil.Dump(&dp) require.NoError(t, err) sig, err := client.WalletSign(context.Background(), ca, buf) require.NoError(t, err) return market2.ClientDealProposal{ Proposal: dp, ClientSignature: *sig, } } func TestOnboardMixedMarketDDO(t *testing.T) { kit.QuietMiningLogs() var ( blocktime = 2 * time.Millisecond ctx = context.Background() ) client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.MutateSealingConfig(func(sc *config.SealingConfig) { sc.RequireActivationSuccess = true sc.RequireNotificationSuccess = true })) ens.InterconnectAll().BeginMiningMustPost(blocktime) maddr, err := miner.ActorAddress(ctx) require.NoError(t, err) mi, err := client.StateMinerInfo(ctx, maddr, types.EmptyTSK) require.NoError(t, err) var pieces []abi.PieceInfo var dealID abi.DealID { // market piece pieceSize := abi.PaddedPieceSize(2048 / 2).Unpadded() pieceData := make([]byte, pieceSize) _, _ = rand.Read(pieceData) dc, err := miner.ComputeDataCid(ctx, pieceSize, bytes.NewReader(pieceData)) require.NoError(t, err) pieces = append(pieces, dc) head, err := client.ChainHead(ctx) require.NoError(t, err) // PSD psdParams := market2.PublishStorageDealsParams{ Deals: []market2.ClientDealProposal{ makeMarketDealProposal(t, client, miner, dc.PieceCID, pieceSize.Padded(), head.Height()+2880*2, head.Height()+2880*400), }, } psdMsg := &types.Message{ To: market.Address, From: mi.Worker, Method: market.Methods.PublishStorageDeals, Params: must.One(cborutil.Dump(&psdParams)), } smsg, err := client.MpoolPushMessage(ctx, psdMsg, nil) require.NoError(t, err) r, err := client.StateWaitMsg(ctx, smsg.Cid(), 1, stmgr.LookbackNoLimit, true) require.NoError(t, err) require.Equal(t, exitcode.Ok, r.Receipt.ExitCode) nv, err := client.StateNetworkVersion(ctx, types.EmptyTSK) require.NoError(t, err) res, err := market.DecodePublishStorageDealsReturn(r.Receipt.Return, nv) require.NoError(t, err) dealID = must.One(res.DealIDs())[0] mcid := smsg.Cid() so, err := miner.SectorAddPieceToAny(ctx, pieceSize, bytes.NewReader(pieceData), piece.PieceDealInfo{ PublishCid: &mcid, DealID: dealID, DealProposal: &psdParams.Deals[0].Proposal, DealSchedule: piece.DealSchedule{ StartEpoch: head.Height() + 2880*2, EndEpoch: head.Height() + 2880*400, }, PieceActivationManifest: nil, KeepUnsealed: true, }) require.NoError(t, err) require.Equal(t, abi.PaddedPieceSize(0), so.Offset) require.Equal(t, abi.SectorNumber(2), so.Sector) } { // raw ddo piece pieceSize := abi.PaddedPieceSize(2048 / 2).Unpadded() pieceData := make([]byte, pieceSize) _, _ = rand.Read(pieceData) dc, err := miner.ComputeDataCid(ctx, pieceSize, bytes.NewReader(pieceData)) require.NoError(t, err) pieces = append(pieces, dc) head, err := client.ChainHead(ctx) require.NoError(t, err) so, err := miner.SectorAddPieceToAny(ctx, pieceSize, bytes.NewReader(pieceData), piece.PieceDealInfo{ PublishCid: nil, DealID: 0, DealProposal: nil, DealSchedule: piece.DealSchedule{ StartEpoch: head.Height() + 2880*2, EndEpoch: head.Height() + 2880*400, }, KeepUnsealed: false, PieceActivationManifest: &minertypes.PieceActivationManifest{ CID: dc.PieceCID, Size: dc.Size, VerifiedAllocationKey: nil, Notify: nil, }, }) require.NoError(t, err) require.Equal(t, abi.PaddedPieceSize(1024), so.Offset) require.Equal(t, abi.SectorNumber(2), so.Sector) } toCheck := map[abi.SectorNumber]struct{}{ 2: {}, } miner.WaitSectorsProving(ctx, toCheck) expectCommD, err := nonffi.GenerateUnsealedCID(abi.RegisteredSealProof_StackedDrg2KiBV1_1, pieces) require.NoError(t, err) si, err := miner.SectorsStatus(ctx, 2, false) require.NoError(t, err) require.Equal(t, expectCommD, *si.CommD) ds, err := client.StateMarketStorageDeal(ctx, dealID, types.EmptyTSK) require.NoError(t, err) require.NotEqual(t, -1, ds.State.SectorStartEpoch) } func TestOnboardRawPieceSnap(t *testing.T) { kit.QuietMiningLogs() var ( blocktime = 2 * time.Millisecond ctx = context.Background() ) client, miner, ens := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.MutateSealingConfig(func(sc *config.SealingConfig) { sc.PreferNewSectorsForDeals = false sc.MakeNewSectorForDeals = false sc.MakeCCSectorsAvailable = true sc.AggregateCommits = false })) ens.InterconnectAll().BeginMiningMustPost(blocktime) miner.PledgeSectors(ctx, 1, 0, nil) sl, err := miner.SectorsListNonGenesis(ctx) require.NoError(t, err) require.Len(t, sl, 1, "expected 1 sector") snum := sl[0] maddr, err := miner.ActorAddress(ctx) require.NoError(t, err) client.WaitForSectorActive(ctx, t, snum, maddr) pieceSize := abi.PaddedPieceSize(2048).Unpadded() pieceData := make([]byte, pieceSize) _, _ = rand.Read(pieceData) dc, err := miner.ComputeDataCid(ctx, pieceSize, bytes.NewReader(pieceData)) require.NoError(t, err) head, err := client.ChainHead(ctx) require.NoError(t, err) so, err := miner.SectorAddPieceToAny(ctx, pieceSize, bytes.NewReader(pieceData), piece.PieceDealInfo{ PublishCid: nil, DealID: 0, DealProposal: nil, DealSchedule: piece.DealSchedule{ StartEpoch: head.Height() + 2880*2, EndEpoch: head.Height() + 2880*400, // todo set so that it works with the sector }, KeepUnsealed: false, PieceActivationManifest: &minertypes.PieceActivationManifest{ CID: dc.PieceCID, Size: dc.Size, VerifiedAllocationKey: nil, Notify: nil, }, }) require.NoError(t, err) // wait for sector to commit // wait for sector to commit and enter proving state toCheck := map[abi.SectorNumber]struct{}{ so.Sector: {}, } miner.WaitSectorsProving(ctx, toCheck) }