lotus/cmd/lotus-shed/postfind.go
2020-10-12 23:00:29 -04:00

77 lines
1.7 KiB
Go

package main
import (
"fmt"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/lotus/chain/types"
lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/specs-actors/v2/actors/builtin"
"github.com/urfave/cli/v2"
)
var postFindCmd = &cli.Command{
Name: "post-find",
Description: "return addresses of all miners who have posted in the last day",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "tipset",
Usage: "specify tipset state to search on",
},
},
Action: func(c *cli.Context) error {
api, acloser, err := lcli.GetFullNodeAPI(c)
if err != nil {
return err
}
defer acloser()
ctx := lcli.ReqContext(c)
ts, err := lcli.LoadTipSet(ctx, c, api)
if err != nil {
return err
}
if ts == nil {
ts, err = api.ChainHead(ctx)
if err != nil {
return err
}
}
oneDayAgo := ts.Height() - abi.ChainEpoch(2880)
mAddrs, err := api.StateListMiners(ctx, ts.Key())
if err != nil {
return err
}
for _, mAddr := range mAddrs {
// if they have no power ignore. This filters out 14k inactive miners
// so we can do 100x fewer expensive message queries
power, err := api.StateMinerPower(ctx, mAddr, ts.Key())
if err != nil {
return err
}
if !power.HasMinPower {
continue
}
query := &types.Message{To: mAddr}
mCids, err := api.StateListMessages(ctx, query, ts.Key(), oneDayAgo)
if err != nil {
return err
}
for _, mCid := range mCids {
msg, err := api.ChainGetMessage(ctx, mCid)
if err != nil {
return err
}
if msg.Method == builtin.MethodsMiner.SubmitWindowedPoSt {
fmt.Printf("%s\n", mAddr)
break // go to next mAddr
}
}
}
return nil
},
}