code: func install(msg proto.Message, cf *ChaincodeCmdFactory) error {
  	creator, err := cf.Signer.Serialize()
  	if err != nil {
  		return fmt.Errorf("Error serializing identity for %s: %s", cf.Signer.GetIdentifier(), err)
  	}
  
  	prop, _, err := utils.CreateInstallProposalFromCDS(msg, creator)
  	if err != nil {
  		return fmt.Errorf("Error creating proposal  %s: %s", chainFuncName, err)
  	}
  
  	var signedProp *pb.SignedProposal
  	signedProp, err = utils.GetSignedProposal(prop, cf.Signer)
  	if err != nil {
  		return fmt.Errorf("Error creating signed proposal  %s: %s", chainFuncName, err)
  	}
  
  	// install is currently only supported for one peer
  	proposalResponse, err := cf.EndorserClients[0].ProcessProposal(context.Background(), signedProp)
  	if err != nil {
  		return fmt.Errorf("Error endorsing %s: %s", chainFuncName, err)
  	}
  
  	if proposalResponse != nil {
  		if proposalResponse.Response.Status != int32(pcommon.Status_SUCCESS) {
  			return errors.Errorf("Bad response: %d - %s", proposalResponse.Response.Status, proposalResponse.Response.Message)
  		}
  		logger.Infof("Installed remotely %v", proposalResponse)
  	} else {
  		return errors.New("Error during install: received nil proposal response")
  	}
  
  	return nil
  }
docs: //install the depspec to "peer.address"