diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index d04dcce3f..ebe4f014a 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -53,6 +53,7 @@ func main() { rpcCmd, cidCmd, blockmsgidCmd, + signaturesCmd, } app := &cli.App{ diff --git a/cmd/lotus-shed/signatures.go b/cmd/lotus-shed/signatures.go new file mode 100644 index 000000000..76a4b3bdf --- /dev/null +++ b/cmd/lotus-shed/signatures.go @@ -0,0 +1,74 @@ +package main + +import ( + "encoding/hex" + "fmt" + "strconv" + + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/lotus/lib/sigs" + + "github.com/filecoin-project/go-address" + "github.com/urfave/cli/v2" + "golang.org/x/xerrors" +) + +var signaturesCmd = &cli.Command{ + Name: "signatures", + Usage: "tools involving signatures", + Subcommands: []*cli.Command{ + sigsVerifyVoteCmd, + }, +} + +var sigsVerifyVoteCmd = &cli.Command{ + Name: "verify-vote", + Description: "can be used to verify signed votes being submitted for FILPolls", + Usage: " ", + Action: func(cctx *cli.Context) error { + + if cctx.Args().Len() != 3 { + return xerrors.Errorf("usage: verify-vote ") + } + + fip, err := strconv.ParseInt(cctx.Args().First(), 10, 64) + if err != nil { + return xerrors.Errorf("couldn't parse FIP number: %w", err) + } + + addr, err := address.NewFromString(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("couldn't parse signing address: %w", err) + } + + sigBytes, err := hex.DecodeString(cctx.Args().Get(2)) + if err != nil { + return xerrors.Errorf("couldn't parse sig: %w", err) + } + + var sig crypto.Signature + if err := sig.UnmarshalBinary(sigBytes); err != nil { + return xerrors.Errorf("couldn't unmarshal sig: %w", err) + } + + switch fip { + case 14: + approve := []byte("7 - Approve") + + if sigs.Verify(&sig, addr, approve) == nil { + fmt.Println("valid vote for approving FIP-0014") + return nil + } + + reject := []byte("7 - Reject") + if sigs.Verify(&sig, addr, reject) == nil { + fmt.Println("valid vote for rejecting FIP-0014") + return nil + } + + return xerrors.Errorf("invalid vote for FIP-0014!") + default: + return xerrors.Errorf("unrecognized FIP number") + } + }, +}