From 23147378a35a28ef2dc0a19a1b5de060d54e0332 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 22 Feb 2022 22:04:50 -0500 Subject: [PATCH] Added cli command for vrk to send RemoveVerifiedClientDataCap message --- .../actors/builtin/verifreg/actor.go.template | 8 +- chain/actors/builtin/verifreg/verifreg.go | 2 + cli/filplus.go | 6 +- cmd/lotus-shed/verifreg.go | 116 ++++++++++++++++++ 4 files changed, 127 insertions(+), 5 deletions(-) diff --git a/chain/actors/builtin/verifreg/actor.go.template b/chain/actors/builtin/verifreg/actor.go.template index 7ca133af9..adc156948 100644 --- a/chain/actors/builtin/verifreg/actor.go.template +++ b/chain/actors/builtin/verifreg/actor.go.template @@ -63,9 +63,11 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { return cid.Undef, xerrors.Errorf("unknown actor version %d", av) } -type RemoveDataCapProposal = verifreg7.RemoveDataCapProposal -type RmDcProposalID = verifreg7.RmDcProposalID -const SignatureDomainSeparation_RemoveDataCap = verifreg7.SignatureDomainSeparation_RemoveDataCap +type RemoveDataCapProposal = verifreg{{.latestVersion}}.RemoveDataCapProposal +type RemoveDataCapRequest = verifreg{{.latestVersion}}.RemoveDataCapRequest +type RemoveDataCapParams = verifreg{{.latestVersion}}.RemoveDataCapParams +type RmDcProposalID = verifreg{{.latestVersion}}.RmDcProposalID +const SignatureDomainSeparation_RemoveDataCap = verifreg{{.latestVersion}}.SignatureDomainSeparation_RemoveDataCap type State interface { cbor.Marshaler diff --git a/chain/actors/builtin/verifreg/verifreg.go b/chain/actors/builtin/verifreg/verifreg.go index b69a0f83e..cb26e324b 100644 --- a/chain/actors/builtin/verifreg/verifreg.go +++ b/chain/actors/builtin/verifreg/verifreg.go @@ -153,6 +153,8 @@ func GetActorCodeID(av actors.Version) (cid.Cid, error) { } type RemoveDataCapProposal = verifreg7.RemoveDataCapProposal +type RemoveDataCapRequest = verifreg7.RemoveDataCapRequest +type RemoveDataCapParams = verifreg7.RemoveDataCapParams type RmDcProposalID = verifreg7.RmDcProposalID const SignatureDomainSeparation_RemoveDataCap = verifreg7.SignatureDomainSeparation_RemoveDataCap diff --git a/cli/filplus.go b/cli/filplus.go index ba2fc43a0..12584b2b8 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -358,12 +358,14 @@ var filplusSignRemoveDataCapProposal = &cli.Command{ return err } - msg, err := api.WalletSign(ctx, verifier, paramBuf.Bytes()) + sig, err := api.WalletSign(ctx, verifier, paramBuf.Bytes()) if err != nil { return err } - fmt.Println(hex.EncodeToString(msg.Data)) + sigBytes := append([]byte{byte(sig.Type)}, sig.Data...) + + fmt.Println(hex.EncodeToString(sigBytes)) return nil }, diff --git a/cmd/lotus-shed/verifreg.go b/cmd/lotus-shed/verifreg.go index 03be5f916..4220d2302 100644 --- a/cmd/lotus-shed/verifreg.go +++ b/cmd/lotus-shed/verifreg.go @@ -1,8 +1,11 @@ package main import ( + "encoding/hex" "fmt" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/big" "github.com/urfave/cli/v2" @@ -35,6 +38,7 @@ var verifRegCmd = &cli.Command{ verifRegListClientsCmd, verifRegCheckClientCmd, verifRegCheckVerifierCmd, + verifRegRemoveVerifiedClientDataCapCmd, }, } @@ -409,3 +413,115 @@ var verifRegCheckVerifierCmd = &cli.Command{ return nil }, } + +var verifRegRemoveVerifiedClientDataCapCmd = &cli.Command{ + Name: "remove-verified-client-data-cap", + Usage: "Remove data cap from verified client", + ArgsUsage: " ", + Action: func(cctx *cli.Context) error { + if cctx.Args().Len() != 7 { + return fmt.Errorf("must specify seven arguments: sender, client, allowance to remove, verifier 1 ID, verifier 1 signature, verifier 2 ID, verifier 2 signature") + } + + srv, err := lcli.GetFullNodeServices(cctx) + if err != nil { + return err + } + defer srv.Close() //nolint:errcheck + + api := srv.FullNodeAPI() + ctx := lcli.ReqContext(cctx) + + sender, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return err + } + + client, err := address.NewFromString(cctx.Args().Get(1)) + if err != nil { + return err + } + + allowanceToRemove, err := types.BigFromString(cctx.Args().Get(2)) + if err != nil { + return err + } + + verifier1Addr, err := address.NewFromString(cctx.Args().Get(3)) + if err != nil { + return err + } + + verifier1Sig, err := hex.DecodeString(cctx.Args().Get(4)) + if err != nil { + return err + } + + verifier2Addr, err := address.NewFromString(cctx.Args().Get(5)) + if err != nil { + return err + } + + verifier2Sig, err := hex.DecodeString(cctx.Args().Get(6)) + if err != nil { + return err + } + + var sig1 crypto.Signature + if err := sig1.UnmarshalBinary(verifier1Sig); err != nil { + return xerrors.Errorf("couldn't unmarshal sig: %w", err) + } + + var sig2 crypto.Signature + if err := sig2.UnmarshalBinary(verifier2Sig); err != nil { + return xerrors.Errorf("couldn't unmarshal sig: %w", err) + } + + params, err := actors.SerializeParams(&verifreg.RemoveDataCapParams{ + VerifiedClientToRemove: client, + DataCapAmountToRemove: allowanceToRemove, + VerifierRequest1: verifreg.RemoveDataCapRequest{ + Verifier: verifier1Addr, + VerifierSignature: sig1, + }, + VerifierRequest2: verifreg.RemoveDataCapRequest{ + Verifier: verifier2Addr, + VerifierSignature: sig2, + }, + }) + if err != nil { + return err + } + + vrk, err := api.StateVerifiedRegistryRootKey(ctx, types.EmptyTSK) + if err != nil { + return err + } + + proto, err := api.MsigPropose(ctx, vrk, verifreg.Address, big.Zero(), sender, uint64(verifreg.Methods.RemoveVerifiedClientDataCap), params) + if err != nil { + return err + } + + sm, _, err := srv.PublishMessage(ctx, proto, false) + if err != nil { + return err + } + + msgCid := sm.Cid() + + fmt.Printf("message sent, now waiting on cid: %s\n", msgCid) + + mwait, err := api.StateWaitMsg(ctx, msgCid, uint64(cctx.Int("confidence")), build.Finality, true) + if err != nil { + return err + } + + if mwait.Receipt.ExitCode != 0 { + return fmt.Errorf("failed to removed verified data cap: %d", mwait.Receipt.ExitCode) + } + + //TODO: Internal msg might still have failed + return nil + }, +}