github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/internal/peer/snapshot/snapshot.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package snapshot 8 9 import ( 10 "github.com/golang/protobuf/proto" 11 "github.com/hechain20/hechain/bccsp" 12 "github.com/hechain20/hechain/common/flogging" 13 "github.com/hechain20/hechain/internal/peer/common" 14 "github.com/hechain20/hechain/protoutil" 15 cb "github.com/hyperledger/fabric-protos-go/common" 16 pb "github.com/hyperledger/fabric-protos-go/peer" 17 "github.com/spf13/cobra" 18 "github.com/spf13/pflag" 19 ) 20 21 var logger = flogging.MustGetLogger("cli.snapshot") 22 23 // Cmd returns the cobra command for Chaincode 24 func Cmd(cryptoProvider bccsp.BCCSP) *cobra.Command { 25 snapshotCmd.AddCommand(submitRequestCmd(nil, cryptoProvider)) 26 snapshotCmd.AddCommand(cancelRequestCmd(nil, cryptoProvider)) 27 snapshotCmd.AddCommand(listPendingCmd(nil, cryptoProvider)) 28 29 return snapshotCmd 30 } 31 32 // snapshot request related variables. 33 var ( 34 channelID string 35 blockNumber uint64 36 peerAddress string 37 tlsRootCertFile string 38 ) 39 40 var snapshotCmd = &cobra.Command{ 41 Use: "snapshot", 42 Short: "Manage snapshot requests: submitrequest|cancelrequest|listpending", 43 Long: "Manage snapshot requests: submitrequest|cancelrequest|listpending", 44 PersistentPreRun: func(cmd *cobra.Command, args []string) { 45 common.InitCmd(cmd, args) 46 }, 47 } 48 49 var flags *pflag.FlagSet 50 51 func init() { 52 resetFlags() 53 } 54 55 // ResetFlags resets the values of these flags 56 func resetFlags() { 57 flags = &pflag.FlagSet{} 58 59 flags.StringVarP(&channelID, "channelID", "c", "", "The channel on which this command should be executed") 60 flags.Uint64VarP(&blockNumber, "blockNumber", "b", 0, "The block number for which a snapshot will be generated") 61 flags.StringVarP(&peerAddress, "peerAddress", "", "", "The address of the peer to connect to") 62 flags.StringVarP(&tlsRootCertFile, "tlsRootCertFile", "", "", 63 "The path to the TLS root cert file of the peer to connect to, required if TLS is enabled and ignored if TLS is disabled.") 64 } 65 66 func attachFlags(cmd *cobra.Command, names []string) { 67 cmdFlags := cmd.Flags() 68 for _, name := range names { 69 if flag := flags.Lookup(name); flag != nil { 70 cmdFlags.AddFlag(flag) 71 } else { 72 logger.Fatalf("Could not find flag '%s' to attach to command '%s'", name, cmd.Name()) 73 } 74 } 75 } 76 77 func signSnapshotRequest(signer common.Signer, request proto.Message) (*pb.SignedSnapshotRequest, error) { 78 requestBytes := protoutil.MarshalOrPanic(request) 79 signature, err := signer.Sign(requestBytes) 80 if err != nil { 81 return nil, err 82 } 83 return &pb.SignedSnapshotRequest{ 84 Request: requestBytes, 85 Signature: signature, 86 }, nil 87 } 88 89 func createSignatureHeader(signer common.Signer) (*cb.SignatureHeader, error) { 90 creator, err := signer.Serialize() 91 if err != nil { 92 return nil, err 93 } 94 95 nonce, err := protoutil.CreateNonce() 96 if err != nil { 97 return nil, err 98 } 99 100 return &cb.SignatureHeader{ 101 Creator: creator, 102 Nonce: nonce, 103 }, nil 104 }