77 lines
1.7 KiB
Go
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
|
|
},
|
|
}
|