54 lines
1.0 KiB
Go
54 lines
1.0 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
lcli "github.com/filecoin-project/lotus/cli"
|
||
|
"github.com/urfave/cli/v2"
|
||
|
)
|
||
|
|
||
|
var mismatchesCmd = &cli.Command{
|
||
|
Name: "mismatches",
|
||
|
Description: "Walk up the chain, recomputing state, and reporting any mismatches",
|
||
|
Action: func(cctx *cli.Context) error {
|
||
|
srv, err := lcli.GetFullNodeServices(cctx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer srv.Close() //nolint:errcheck
|
||
|
|
||
|
api := srv.FullNodeAPI()
|
||
|
ctx := lcli.ReqContext(cctx)
|
||
|
|
||
|
checkTs, err := api.ChainHead(ctx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for checkTs.Height() != 0 {
|
||
|
if checkTs.Height()%10000 == 0 {
|
||
|
fmt.Println("Reached height ", checkTs.Height())
|
||
|
}
|
||
|
|
||
|
execTsk := checkTs.Parents()
|
||
|
execTs, err := api.ChainGetTipSet(ctx, execTsk)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
st, err := api.StateCompute(ctx, execTs.Height(), nil, execTsk)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if st.Root != checkTs.ParentState() {
|
||
|
fmt.Println("consensus mismatch found at height ", execTs.Height())
|
||
|
}
|
||
|
|
||
|
checkTs = execTs
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
},
|
||
|
}
|