141 lines
2.7 KiB
Go
141 lines
2.7 KiB
Go
|
package cli
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"math/big"
|
||
|
|
||
|
"gopkg.in/urfave/cli.v2"
|
||
|
|
||
|
"github.com/filecoin-project/go-lotus/chain/actors"
|
||
|
"github.com/filecoin-project/go-lotus/chain/address"
|
||
|
types "github.com/filecoin-project/go-lotus/chain/types"
|
||
|
)
|
||
|
|
||
|
var stateCmd = &cli.Command{
|
||
|
Name: "state",
|
||
|
Usage: "Interact with and query filecoin chain state",
|
||
|
Subcommands: []*cli.Command{
|
||
|
statePowerCmd,
|
||
|
stateSectorsCmd,
|
||
|
stateProvingSetCmd,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
var statePowerCmd = &cli.Command{
|
||
|
Name: "power",
|
||
|
Usage: "Query network or miner power",
|
||
|
Action: func(cctx *cli.Context) error {
|
||
|
api, err := GetAPI(cctx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
ctx := ReqContext(cctx)
|
||
|
|
||
|
var msg *types.Message
|
||
|
if cctx.Args().Present() {
|
||
|
maddr, err := address.NewFromString(cctx.Args().First())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
enc, err := actors.SerializeParams(&actors.PowerLookupParams{
|
||
|
Miner: maddr,
|
||
|
})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
msg = &types.Message{
|
||
|
To: actors.StorageMarketAddress,
|
||
|
From: actors.StorageMarketAddress,
|
||
|
Method: actors.SMAMethods.PowerLookup,
|
||
|
Params: enc,
|
||
|
}
|
||
|
} else {
|
||
|
msg = &types.Message{
|
||
|
To: actors.StorageMarketAddress,
|
||
|
From: actors.StorageMarketAddress,
|
||
|
Method: actors.SMAMethods.GetTotalStorage,
|
||
|
}
|
||
|
}
|
||
|
ret, err := api.ChainCall(ctx, msg, nil)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if ret.ExitCode != 0 {
|
||
|
return fmt.Errorf("call to get power failed: %d", ret.ExitCode)
|
||
|
}
|
||
|
|
||
|
v := big.NewInt(0).SetBytes(ret.Return)
|
||
|
fmt.Println(v.String())
|
||
|
return nil
|
||
|
},
|
||
|
}
|
||
|
|
||
|
var stateSectorsCmd = &cli.Command{
|
||
|
Name: "sectors",
|
||
|
Usage: "Query the sector set of a miner",
|
||
|
Action: func(cctx *cli.Context) error {
|
||
|
api, err := GetAPI(cctx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
ctx := ReqContext(cctx)
|
||
|
|
||
|
if !cctx.Args().Present() {
|
||
|
return fmt.Errorf("must specify miner to list sectors for")
|
||
|
}
|
||
|
|
||
|
maddr, err := address.NewFromString(cctx.Args().First())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
sectors, err := api.StateMinerSectors(ctx, maddr)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for _, s := range sectors {
|
||
|
fmt.Printf("%d: %x %x\n", s.SectorID, s.CommR, s.CommD)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
},
|
||
|
}
|
||
|
|
||
|
var stateProvingSetCmd = &cli.Command{
|
||
|
Name: "proving",
|
||
|
Usage: "Query the proving set of a miner",
|
||
|
Action: func(cctx *cli.Context) error {
|
||
|
api, err := GetAPI(cctx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
ctx := ReqContext(cctx)
|
||
|
|
||
|
if !cctx.Args().Present() {
|
||
|
return fmt.Errorf("must specify miner to list sectors for")
|
||
|
}
|
||
|
|
||
|
maddr, err := address.NewFromString(cctx.Args().First())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
sectors, err := api.StateMinerProvingSet(ctx, maddr)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for _, s := range sectors {
|
||
|
fmt.Printf("%d: %x %x\n", s.SectorID, s.CommR, s.CommD)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
},
|
||
|
}
|