7e3846c669
* multiple piece per sector, DDO deals * in memory to DB * sql parser * add seal command * multi piece TreeD * redo filler pieces * remove psql exception handling * fix deal sectors porep * fix tests * ddo deals * lower SDR cpu for test * devnet cpu 0 * get params for itest * fix itest sector size * revert sdr devnet cpu * improve SectorStatus API * account for verified constraints
202 lines
4.8 KiB
Go
202 lines
4.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strconv"
|
|
|
|
"github.com/urfave/cli/v2"
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/filecoin-project/go-address"
|
|
"github.com/filecoin-project/go-state-types/abi"
|
|
|
|
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
lcli "github.com/filecoin-project/lotus/cli"
|
|
"github.com/filecoin-project/lotus/cmd/curio/deps"
|
|
"github.com/filecoin-project/lotus/curiosrc/market/lmrpc"
|
|
"github.com/filecoin-project/lotus/lib/harmony/harmonydb"
|
|
)
|
|
|
|
var marketCmd = &cli.Command{
|
|
Name: "market",
|
|
Subcommands: []*cli.Command{
|
|
marketRPCInfoCmd,
|
|
marketSealCmd,
|
|
},
|
|
}
|
|
|
|
var marketRPCInfoCmd = &cli.Command{
|
|
Flags: []cli.Flag{
|
|
&cli.StringSliceFlag{
|
|
Name: "layers",
|
|
Usage: "list of layers to be interpreted (atop defaults). Default: base",
|
|
},
|
|
},
|
|
Action: func(cctx *cli.Context) error {
|
|
db, err := deps.MakeDB(cctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
layers := cctx.StringSlice("layers")
|
|
|
|
cfg, err := deps.GetConfig(cctx.Context, layers, db)
|
|
if err != nil {
|
|
return xerrors.Errorf("get config: %w", err)
|
|
}
|
|
|
|
ts, err := lmrpc.MakeTokens(cfg)
|
|
if err != nil {
|
|
return xerrors.Errorf("make tokens: %w", err)
|
|
}
|
|
|
|
var addrTokens []struct {
|
|
Address string
|
|
Token string
|
|
}
|
|
|
|
for address, s := range ts {
|
|
addrTokens = append(addrTokens, struct {
|
|
Address string
|
|
Token string
|
|
}{
|
|
Address: address.String(),
|
|
Token: s,
|
|
})
|
|
}
|
|
|
|
sort.Slice(addrTokens, func(i, j int) bool {
|
|
return addrTokens[i].Address < addrTokens[j].Address
|
|
})
|
|
|
|
for _, at := range addrTokens {
|
|
fmt.Printf("[lotus-miner/boost compatible] %s %s\n", at.Address, at.Token)
|
|
}
|
|
|
|
return nil
|
|
},
|
|
Name: "rpc-info",
|
|
}
|
|
|
|
var marketSealCmd = &cli.Command{
|
|
Name: "seal",
|
|
Usage: "start sealing a deal sector early",
|
|
Flags: []cli.Flag{
|
|
&cli.StringFlag{
|
|
Name: "actor",
|
|
Usage: "Specify actor address to start sealing sectors for",
|
|
Required: true,
|
|
},
|
|
&cli.StringSliceFlag{
|
|
Name: "layers",
|
|
Usage: "list of layers to be interpreted (atop defaults). Default: base",
|
|
},
|
|
&cli.BoolFlag{
|
|
Name: "synthetic",
|
|
Usage: "Use synthetic PoRep",
|
|
Value: false, // todo implement synthetic
|
|
},
|
|
},
|
|
Action: func(cctx *cli.Context) error {
|
|
act, err := address.NewFromString(cctx.String("actor"))
|
|
if err != nil {
|
|
return xerrors.Errorf("parsing --actor: %w", err)
|
|
}
|
|
|
|
if cctx.Args().Len() > 1 {
|
|
return xerrors.Errorf("specify only one sector")
|
|
}
|
|
|
|
sec := cctx.Args().First()
|
|
|
|
sector, err := strconv.ParseUint(sec, 10, 64)
|
|
if err != nil {
|
|
return xerrors.Errorf("failed to parse the sector number: %w", err)
|
|
}
|
|
|
|
ctx := lcli.ReqContext(cctx)
|
|
dep, err := deps.GetDepsCLI(ctx, cctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
mid, err := address.IDFromAddress(act)
|
|
if err != nil {
|
|
return xerrors.Errorf("getting miner id: %w", err)
|
|
}
|
|
|
|
mi, err := dep.Full.StateMinerInfo(ctx, act, types.EmptyTSK)
|
|
if err != nil {
|
|
return xerrors.Errorf("getting miner info: %w", err)
|
|
}
|
|
|
|
nv, err := dep.Full.StateNetworkVersion(ctx, types.EmptyTSK)
|
|
if err != nil {
|
|
return xerrors.Errorf("getting network version: %w", err)
|
|
}
|
|
|
|
wpt := mi.WindowPoStProofType
|
|
spt, err := miner.PreferredSealProofTypeFromWindowPoStType(nv, wpt, cctx.Bool("synthetic"))
|
|
if err != nil {
|
|
return xerrors.Errorf("getting seal proof type: %w", err)
|
|
}
|
|
|
|
comm, err := dep.DB.BeginTransaction(ctx, func(tx *harmonydb.Tx) (commit bool, err error) {
|
|
// Get current open sector pieces from DB
|
|
var pieces []struct {
|
|
Sector abi.SectorNumber `db:"sector_number"`
|
|
Size abi.PaddedPieceSize `db:"piece_size"`
|
|
Index uint64 `db:"piece_index"`
|
|
}
|
|
err = tx.Select(&pieces, `
|
|
SELECT
|
|
sector_number,
|
|
piece_size,
|
|
piece_index,
|
|
FROM
|
|
open_sector_pieces
|
|
WHERE
|
|
sp_id = $1 AND sector_number = $2
|
|
ORDER BY
|
|
piece_index DESC;`, mid, sector)
|
|
if err != nil {
|
|
return false, xerrors.Errorf("getting open sectors from DB")
|
|
}
|
|
|
|
if len(pieces) < 1 {
|
|
return false, xerrors.Errorf("sector %d is not waiting to be sealed", sector)
|
|
}
|
|
|
|
cn, err := tx.Exec(`INSERT INTO sectors_sdr_pipeline (sp_id, sector_number, reg_seal_proof) VALUES ($1, $2, $3);`, mid, sector, spt)
|
|
|
|
if err != nil {
|
|
return false, xerrors.Errorf("adding sector to pipeline: %w", err)
|
|
}
|
|
|
|
if cn != 1 {
|
|
return false, xerrors.Errorf("incorrect number of rows returned")
|
|
}
|
|
|
|
_, err = tx.Exec("SELECT transfer_and_delete_open_piece($1, $2)", mid, sector)
|
|
if err != nil {
|
|
return false, xerrors.Errorf("adding sector to pipeline: %w", err)
|
|
}
|
|
|
|
return true, nil
|
|
|
|
}, harmonydb.OptionRetry())
|
|
|
|
if err != nil {
|
|
return xerrors.Errorf("start sealing sector: %w", err)
|
|
}
|
|
|
|
if !comm {
|
|
return xerrors.Errorf("start sealing sector: commit failed")
|
|
}
|
|
|
|
return nil
|
|
},
|
|
}
|