github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/internal/pkg/gateway/event/transaction.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  SPDX-License-Identifier: Apache-2.0
     4  */
     5  
     6  package event
     7  
     8  import (
     9  	"github.com/golang/protobuf/proto"
    10  	"github.com/golang/protobuf/ptypes/timestamp"
    11  	"github.com/hyperledger/fabric-protos-go/common"
    12  	"github.com/hyperledger/fabric-protos-go/peer"
    13  )
    14  
    15  type Transaction struct {
    16  	parent          *Block
    17  	payload         *common.Payload
    18  	id              string
    19  	timestamp       *timestamp.Timestamp
    20  	status          peer.TxValidationCode
    21  	chaincodeEvents []*ChaincodeEvent
    22  }
    23  
    24  func (tx *Transaction) Block() *Block {
    25  	return tx.parent
    26  }
    27  
    28  func (tx *Transaction) ID() string {
    29  	return tx.id
    30  }
    31  
    32  func (tx *Transaction) Timestamp() *timestamp.Timestamp {
    33  	return tx.timestamp
    34  }
    35  
    36  func (tx *Transaction) Status() peer.TxValidationCode {
    37  	return tx.status
    38  }
    39  
    40  func (tx *Transaction) Valid() bool {
    41  	return tx.status == peer.TxValidationCode_VALID
    42  }
    43  
    44  func (tx *Transaction) ChaincodeEvents() ([]*ChaincodeEvent, error) {
    45  	var err error
    46  
    47  	if tx.chaincodeEvents == nil {
    48  		tx.chaincodeEvents, err = tx.readChaincodeEvents()
    49  	}
    50  
    51  	return tx.chaincodeEvents, err
    52  }
    53  
    54  func (tx *Transaction) readChaincodeEvents() ([]*ChaincodeEvent, error) {
    55  	transaction := &peer.Transaction{}
    56  	if err := proto.Unmarshal(tx.payload.GetData(), transaction); err != nil {
    57  		return nil, err
    58  	}
    59  
    60  	chaincodeEvents := make([]*ChaincodeEvent, 0)
    61  
    62  	for _, action := range transaction.GetActions() {
    63  		actionPayload := &peer.ChaincodeActionPayload{}
    64  		if err := proto.Unmarshal(action.GetPayload(), actionPayload); err != nil {
    65  			continue
    66  		}
    67  
    68  		responsePayload := &peer.ProposalResponsePayload{}
    69  		if err := proto.Unmarshal(actionPayload.GetAction().GetProposalResponsePayload(), responsePayload); err != nil {
    70  			continue
    71  		}
    72  
    73  		action := &peer.ChaincodeAction{}
    74  		if err := proto.Unmarshal(responsePayload.GetExtension(), action); err != nil {
    75  			continue
    76  		}
    77  
    78  		event := &peer.ChaincodeEvent{}
    79  		if err := proto.Unmarshal(action.GetEvents(), event); err != nil {
    80  			continue
    81  		}
    82  
    83  		if !validChaincodeEvent(event) {
    84  			continue
    85  		}
    86  
    87  		chaincodeEvent := &ChaincodeEvent{
    88  			parent:  tx,
    89  			message: event,
    90  		}
    91  		chaincodeEvents = append(chaincodeEvents, chaincodeEvent)
    92  	}
    93  
    94  	return chaincodeEvents, nil
    95  }
    96  
    97  func validChaincodeEvent(event *peer.ChaincodeEvent) bool {
    98  	return len(event.GetChaincodeId()) > 0 && len(event.GetEventName()) > 0 && len(event.GetTxId()) > 0
    99  }