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 }