Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 9880e07

Browse files
author
Dennis Kuhnert
committed
[FAB-9023] return TransactionID for transactions
for SaveChannel, InstantiateCC, UpgradeCC When a transaction is stored to the ledger, the SDK should return the ID of the transaction. Additionally, fixed bug when (nil, nil) was returned instead of an error in createChaincodeDeployProposal. Change-Id: I3987de56fcd0e9c52948554b5857d9cd79212814 Signed-off-by: Dennis Kuhnert <dennis.kuhnert@sap.com>
1 parent ccecff4 commit 9880e07

16 files changed

+179
-187
lines changed

pkg/client/resmgmt/lscc.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,13 @@ func createChaincodeDeployProposal(txh fab.TransactionHeader, deploy chaincodePr
8585
case UpgradeChaincode:
8686
fcn = lsccUpgrade
8787
default:
88-
return nil, errors.WithMessage(err, "chaincode deployment type unknown")
88+
return nil, errors.New("chaincode deployment type unknown")
8989
}
9090

9191
cir := fab.ChaincodeInvokeRequest{
9292
ChaincodeID: lscc,
9393
Fcn: fcn,
9494
Args: args,
9595
}
96-
9796
return txn.CreateChaincodeInvokeProposal(txh, cir)
9897
}

pkg/client/resmgmt/resmgmt.go

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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
6570
type 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
7585
type 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

758771
func loggedClose(c io.Closer) {

0 commit comments

Comments
 (0)