@@ -61,6 +61,11 @@ type InstantiateCCRequest struct {
6161 CollConfig []* common.CollectionConfig
6262}
6363
64+ // InstantiateCCResponse contains response parameters for Instantiate
65+ type InstantiateCCResponse struct {
66+ TransactionID fab.TransactionID
67+ }
68+
6469// UpgradeCCRequest contains upgrade chaincode request parameters
6570type UpgradeCCRequest struct {
6671 Name string
@@ -71,6 +76,11 @@ type UpgradeCCRequest struct {
7176 CollConfig []* common.CollectionConfig
7277}
7378
79+ // UpgradeCCResponse contains response parameters for Upgrade
80+ type UpgradeCCResponse struct {
81+ TransactionID fab.TransactionID
82+ }
83+
7484//requestOptions contains options for operations performed by ResourceMgmtClient
7585type requestOptions struct {
7686 Targets []fab.Peer // target peers
@@ -399,31 +409,33 @@ func checkRequiredInstallCCParams(req InstallCCRequest) error {
399409}
400410
401411// InstantiateCC instantiates chaincode using default settings
402- func (rc * Client ) InstantiateCC (channelID string , req InstantiateCCRequest , options ... RequestOption ) error {
412+ func (rc * Client ) InstantiateCC (channelID string , req InstantiateCCRequest , options ... RequestOption ) ( InstantiateCCResponse , error ) {
403413
404414 opts , err := rc .prepareRequestOpts (options ... )
405415 if err != nil {
406- return errors .WithMessage (err , "failed to get opts for InstantiateCC" )
416+ return InstantiateCCResponse {}, errors .WithMessage (err , "failed to get opts for InstantiateCC" )
407417 }
408418
409419 reqCtx , cancel := rc .createRequestContext (opts , core .ResMgmt )
410420 defer cancel ()
411421
412- return rc .sendCCProposal (reqCtx , InstantiateChaincode , channelID , req , opts )
422+ txID , err := rc .sendCCProposal (reqCtx , InstantiateChaincode , channelID , req , opts )
423+ return InstantiateCCResponse {TransactionID : txID }, err
413424}
414425
415426// UpgradeCC upgrades chaincode with optional custom options (specific peers, filtered peers, timeout)
416- func (rc * Client ) UpgradeCC (channelID string , req UpgradeCCRequest , options ... RequestOption ) error {
427+ func (rc * Client ) UpgradeCC (channelID string , req UpgradeCCRequest , options ... RequestOption ) ( UpgradeCCResponse , error ) {
417428
418429 opts , err := rc .prepareRequestOpts (options ... )
419430 if err != nil {
420- return errors .WithMessage (err , "failed to get opts for UpgradeCC" )
431+ return UpgradeCCResponse {}, errors .WithMessage (err , "failed to get opts for UpgradeCC" )
421432 }
422433
423434 reqCtx , cancel := rc .createRequestContext (opts , core .ResMgmt )
424435 defer cancel ()
425436
426- return rc .sendCCProposal (reqCtx , UpgradeChaincode , channelID , InstantiateCCRequest (req ), opts )
437+ txID , err := rc .sendCCProposal (reqCtx , UpgradeChaincode , channelID , InstantiateCCRequest (req ), opts )
438+ return UpgradeCCResponse {TransactionID : txID }, err
427439}
428440
429441// QueryInstalledChaincodes queries the installed chaincodes on a peer.
@@ -522,91 +534,92 @@ func (rc *Client) QueryChannels(options ...RequestOption) (*pb.ChannelQueryRespo
522534}
523535
524536// sendCCProposal sends proposal for type Instantiate, Upgrade
525- func (rc * Client ) sendCCProposal (reqCtx reqContext.Context , ccProposalType chaincodeProposalType , channelID string , req InstantiateCCRequest , opts requestOptions ) error {
537+ func (rc * Client ) sendCCProposal (reqCtx reqContext.Context , ccProposalType chaincodeProposalType , channelID string , req InstantiateCCRequest , opts requestOptions ) (fab. TransactionID , error ) {
526538
527539 if err := checkRequiredCCProposalParams (channelID , req ); err != nil {
528- return err
540+ return fab . EmptyTransactionID , err
529541 }
530542
531543 // per channel discovery service
532544 discovery , err := rc .ctx .DiscoveryProvider ().CreateDiscoveryService (channelID )
533545 if err != nil {
534- return errors .WithMessage (err , "failed to create channel discovery service" )
546+ return fab . EmptyTransactionID , errors .WithMessage (err , "failed to create channel discovery service" )
535547 }
536548
537549 //Default targets when targets are not provided in options
538550 if len (opts .Targets ) == 0 {
539551 opts .Targets , err = rc .getDefaultTargets (discovery )
540552 if err != nil {
541- return errors .WithMessage (err , "failed to get default targets for cc proposal" )
553+ return fab . EmptyTransactionID , errors .WithMessage (err , "failed to get default targets for cc proposal" )
542554 }
543555 }
544556
545557 targets , err := rc .calculateTargets (discovery , opts .Targets , opts .TargetFilter )
546558 if err != nil {
547- return errors .WithMessage (err , "failed to determine target peers for cc proposal" )
559+ return fab . EmptyTransactionID , errors .WithMessage (err , "failed to determine target peers for cc proposal" )
548560 }
549561
550562 if len (targets ) == 0 {
551- return errors .WithStack (status .New (status .ClientStatus , status .NoPeersFound .ToInt32 (), "no targets available" , nil ))
563+ return fab . EmptyTransactionID , errors .WithStack (status .New (status .ClientStatus , status .NoPeersFound .ToInt32 (), "no targets available" , nil ))
552564 }
553565
554566 // Get transactor on the channel to create and send the deploy proposal
555567 channelService , err := rc .ctx .ChannelProvider ().ChannelService (rc .ctx , channelID )
556568 if err != nil {
557- return errors .WithMessage (err , "Unable to get channel service" )
569+ return fab . EmptyTransactionID , errors .WithMessage (err , "Unable to get channel service" )
558570 }
559571
560572 chConfig , err := channelService .ChannelConfig ()
561573 if err != nil {
562- return errors .WithMessage (err , "get channel config failed" )
574+ return fab . EmptyTransactionID , errors .WithMessage (err , "get channel config failed" )
563575 }
564576 transactor , err := rc .ctx .InfraProvider ().CreateChannelTransactor (reqCtx , chConfig )
565577 if err != nil {
566- return errors .WithMessage (err , "get channel transactor failed" )
578+ return fab . EmptyTransactionID , errors .WithMessage (err , "get channel transactor failed" )
567579 }
568580
569581 // create a transaction proposal for chaincode deployment
570582 deployProposal := chaincodeDeployRequest (req )
571583
572- txid , err := txn .NewHeader (rc .ctx , channelID )
584+ txID , err := txn .NewHeader (rc .ctx , channelID )
573585 if err != nil {
574- return errors .WithMessage (err , "create transaction ID failed" )
586+ return fab . EmptyTransactionID , errors .WithMessage (err , "create transaction ID failed" )
575587 }
576- tp , err := createChaincodeDeployProposal (txid , ccProposalType , channelID , deployProposal )
588+
589+ tp , err := createChaincodeDeployProposal (txID , ccProposalType , channelID , deployProposal )
577590 if err != nil {
578- return errors .WithMessage (err , "creating chaincode deploy transaction proposal failed" )
591+ return txID . TransactionID (), errors .WithMessage (err , "creating chaincode deploy transaction proposal failed" )
579592 }
580593
581594 // Process and send transaction proposal
582595 txProposalResponse , err := transactor .SendTransactionProposal (tp , peersToTxnProcessors (targets ))
583596 if err != nil {
584- return errors .WithMessage (err , "sending deploy transaction proposal failed" )
597+ return tp . TxnID , errors .WithMessage (err , "sending deploy transaction proposal failed" )
585598 }
586599
587600 // Membership is required to verify signature
588601 membership , err := channelService .Membership ()
589602 if err != nil {
590- return errors .WithMessage (err , "membership creation failed" )
603+ return tp . TxnID , errors .WithMessage (err , "membership creation failed" )
591604 }
592605
593606 // Verify signature(s)
594607 sv := & verifier.Signature {Membership : membership }
595608 for _ , r := range txProposalResponse {
596609 if err := sv .Verify (r ); err != nil {
597- return errors .WithMessage (err , "Failed to verify signature" )
610+ return tp . TxnID , errors .WithMessage (err , "Failed to verify signature" )
598611 }
599612 }
600613
601614 eventService , err := channelService .EventService ()
602615 if err != nil {
603- return errors .WithMessage (err , "unable to get event service" )
616+ return tp . TxnID , errors .WithMessage (err , "unable to get event service" )
604617 }
605618
606619 // Register for commit event
607620 reg , statusNotifier , err := eventService .RegisterTxStatusEvent (string (tp .TxnID ))
608621 if err != nil {
609- return errors .WithMessage (err , "error registering for TxStatus event" )
622+ return tp . TxnID , errors .WithMessage (err , "error registering for TxStatus event" )
610623 }
611624 defer eventService .Unregister (reg )
612625
@@ -615,17 +628,17 @@ func (rc *Client) sendCCProposal(reqCtx reqContext.Context, ccProposalType chain
615628 ProposalResponses : txProposalResponse ,
616629 }
617630 if _ , err = createAndSendTransaction (transactor , transactionRequest ); err != nil {
618- return errors .WithMessage (err , "CreateAndSendTransaction failed" )
631+ return tp . TxnID , errors .WithMessage (err , "CreateAndSendTransaction failed" )
619632 }
620633
621634 select {
622635 case txStatus := <- statusNotifier :
623636 if txStatus .TxValidationCode == pb .TxValidationCode_VALID {
624- return nil
637+ return fab . TransactionID ( txStatus . TxID ), nil
625638 }
626- return status .New (status .EventServerStatus , int32 (txStatus .TxValidationCode ), "instantiateOrUpgradeCC failed" , nil )
639+ return fab . TransactionID ( txStatus . TxID ), status .New (status .EventServerStatus , int32 (txStatus .TxValidationCode ), "instantiateOrUpgradeCC failed" , nil )
627640 case <- reqCtx .Done ():
628- return errors .New ("instantiateOrUpgradeCC timed out or cancelled" )
641+ return tp . TxnID , errors .New ("instantiateOrUpgradeCC timed out or cancelled" )
629642 }
630643
631644}
@@ -669,24 +682,24 @@ func peersToTxnProcessors(peers []fab.Peer) []fab.ProposalProcessor {
669682}
670683
671684// SaveChannel creates or updates channel
672- func (rc * Client ) SaveChannel (req SaveChannelRequest , options ... RequestOption ) error {
685+ func (rc * Client ) SaveChannel (req SaveChannelRequest , options ... RequestOption ) (fab. TransactionID , error ) {
673686
674687 opts , err := rc .prepareRequestOpts (options ... )
675688 if err != nil {
676- return err
689+ return fab . EmptyTransactionID , err
677690 }
678691
679692 if req .ChannelConfigPath != "" {
680693 configReader , err := os .Open (req .ChannelConfigPath )
681694 if err != nil {
682- return errors .Wrapf (err , "opening channel config file failed" )
695+ return fab . EmptyTransactionID , errors .Wrapf (err , "opening channel config file failed" )
683696 }
684697 defer loggedClose (configReader )
685698 req .ChannelConfig = configReader
686699 }
687700
688701 if req .ChannelID == "" || req .ChannelConfig == nil {
689- return errors .New ("must provide channel ID and channel config" )
702+ return fab . EmptyTransactionID , errors .New ("must provide channel ID and channel config" )
690703 }
691704
692705 logger .Debugf ("saving channel: %s" , req .ChannelID )
@@ -704,17 +717,17 @@ func (rc *Client) SaveChannel(req SaveChannelRequest, options ...RequestOption)
704717 } else if rc .ctx != nil {
705718 signers = append (signers , rc .ctx )
706719 } else {
707- return errors .New ("must provide signing user" )
720+ return fab . EmptyTransactionID , errors .New ("must provide signing user" )
708721 }
709722
710723 configTx , err := ioutil .ReadAll (req .ChannelConfig )
711724 if err != nil {
712- return errors .WithMessage (err , "reading channel config file failed" )
725+ return fab . EmptyTransactionID , errors .WithMessage (err , "reading channel config file failed" )
713726 }
714727
715728 chConfig , err := resource .ExtractChannelConfig (configTx )
716729 if err != nil {
717- return errors .WithMessage (err , "extracting channel config failed" )
730+ return fab . EmptyTransactionID , errors .WithMessage (err , "extracting channel config failed" )
718731 }
719732
720733 var configSignatures []* common.ConfigSignature
@@ -727,14 +740,14 @@ func (rc *Client) SaveChannel(req SaveChannelRequest, options ...RequestOption)
727740
728741 configSignature , err := resource .CreateConfigSignature (& sigCtx , chConfig )
729742 if err != nil {
730- return errors .WithMessage (err , "signing configuration failed" )
743+ return fab . EmptyTransactionID , errors .WithMessage (err , "signing configuration failed" )
731744 }
732745 configSignatures = append (configSignatures , configSignature )
733746 }
734747
735748 orderer , err := rc .requestOrderer (& opts , req .ChannelID )
736749 if err != nil {
737- return errors .WithMessage (err , "failed to find orderer for request" )
750+ return fab . EmptyTransactionID , errors .WithMessage (err , "failed to find orderer for request" )
738751 }
739752
740753 request := api.CreateChannelRequest {
@@ -747,12 +760,12 @@ func (rc *Client) SaveChannel(req SaveChannelRequest, options ...RequestOption)
747760 reqCtx , cancel := rc .createRequestContext (opts , core .OrdererResponse )
748761 defer cancel ()
749762
750- _ , err = resource .CreateChannel (reqCtx , request )
763+ txID , err : = resource .CreateChannel (reqCtx , request )
751764 if err != nil {
752- return errors .WithMessage (err , "create channel failed" )
765+ return fab . EmptyTransactionID , errors .WithMessage (err , "create channel failed" )
753766 }
754767
755- return nil
768+ return txID , nil
756769}
757770
758771func loggedClose (c io.Closer ) {
0 commit comments