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  }