diff --git a/checks.go b/checks.go new file mode 100644 index 000000000..05647de6c --- /dev/null +++ b/checks.go @@ -0,0 +1,73 @@ +package sealing + +import ( + "context" + + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/types" +) + +func checkPieces(ctx context.Context, si *SectorInfo, api sealingApi) error { + for i, piece := range si.Pieces { + deal, err := api.StateMarketStorageDeal(ctx, piece.DealID, nil) + if err != nil { + return xerrors.Errorf("getting deal %d for piece %d: %w", piece.DealID, i, err) + } + + if string(deal.PieceRef) != string(piece.CommP) { + return xerrors.Errorf("piece %d of sector %d refers deal %d with wrong CommP: %x != %x", i, si.SectorID, piece.DealID, piece.CommP, deal.PieceRef) + } + + if piece.Size != deal.PieceSize { + return xerrors.Errorf("piece %d of sector %d refers deal %d with different size: %d != %d", i, si.SectorID, piece.DealID, piece.Size, deal.PieceSize) + } + } + + return nil +} + +func checkSeal(ctx context.Context, maddr address.Address, si *SectorInfo, api sealingApi) (err error) { + ssize, err := api.StateMinerSectorSize(ctx, maddr, nil) + if err != nil { + return err + } + + ccparams, err := actors.SerializeParams(&actors.ComputeDataCommitmentParams{ + DealIDs: si.deals(), + SectorSize: ssize, + }) + if err != nil { + return xerrors.Errorf("computing params for ComputeDataCommitment: %w", err) + } + + ccmt := &types.Message{ + To: actors.StorageMarketAddress, + From: actors.StorageMarketAddress, + Value: types.NewInt(0), + GasPrice: types.NewInt(0), + GasLimit: types.NewInt(9999999999), + Method: actors.SMAMethods.ComputeDataCommitment, + Params: ccparams, + } + r, err := api.StateCall(ctx, ccmt, nil) + if err != nil { + return xerrors.Errorf("calling ComputeDataCommitment: %w", err) + } + if r.ExitCode != 0 { + return xerrors.Errorf("receipt for ComputeDataCommitment han exit code %d", r.ExitCode) + } + if string(r.Return) != string(si.CommD) { + return xerrors.Errorf("on chain CommD differs from sector: %x != %x", r.Return, si.CommD) + } + + + // TODO: Validate ticket + // TODO: Verify commp / commr / proof + // TODO: (StateCall PreCommit) + return nil + + +}