@@ -22,29 +22,19 @@ import (
22
22
"os"
23
23
24
24
"github.com/hyperledger/fabric/events/consumer"
25
+ "github.com/hyperledger/fabric/protos/common"
25
26
pb "github.com/hyperledger/fabric/protos/peer"
27
+ "github.com/hyperledger/fabric/protos/utils"
26
28
)
27
29
28
30
type adapter struct {
29
31
notfy chan * pb.Event_Block
30
32
rejected chan * pb.Event_Rejection
31
- cEvent chan * pb.Event_ChaincodeEvent
32
33
listenToRejections bool
33
- chaincodeID string
34
34
}
35
35
36
36
//GetInterestedEvents implements consumer.EventAdapter interface for registering interested events
37
37
func (a * adapter ) GetInterestedEvents () ([]* pb.Interest , error ) {
38
- if a .chaincodeID != "" {
39
- return []* pb.Interest {
40
- {EventType : pb .EventType_BLOCK },
41
- {EventType : pb .EventType_REJECTION },
42
- {EventType : pb .EventType_CHAINCODE ,
43
- RegInfo : & pb.Interest_ChaincodeRegInfo {
44
- ChaincodeRegInfo : & pb.ChaincodeReg {
45
- ChaincodeID : a .chaincodeID ,
46
- EventName : "" }}}}, nil
47
- }
48
38
return []* pb.Interest {{EventType : pb .EventType_BLOCK }, {EventType : pb .EventType_REJECTION }}, nil
49
39
}
50
40
@@ -60,10 +50,6 @@ func (a *adapter) Recv(msg *pb.Event) (bool, error) {
60
50
}
61
51
return true , nil
62
52
}
63
- if o , e := msg .Event .(* pb.Event_ChaincodeEvent ); e {
64
- a .cEvent <- o
65
- return true , nil
66
- }
67
53
return false , fmt .Errorf ("Receive unkown type event: %v" , msg )
68
54
}
69
55
@@ -78,7 +64,7 @@ func createEventClient(eventAddress string, listenToRejections bool, cid string)
78
64
79
65
done := make (chan * pb.Event_Block )
80
66
reject := make (chan * pb.Event_Rejection )
81
- adapter := & adapter {notfy : done , rejected : reject , listenToRejections : listenToRejections , chaincodeID : cid , cEvent : make ( chan * pb. Event_ChaincodeEvent ) }
67
+ adapter := & adapter {notfy : done , rejected : reject , listenToRejections : listenToRejections }
82
68
obcEHClient , _ = consumer .NewEventsClient (eventAddress , 5 , adapter )
83
69
if err := obcEHClient .Start (); err != nil {
84
70
fmt .Printf ("could not start chat %s\n " , err )
@@ -89,6 +75,48 @@ func createEventClient(eventAddress string, listenToRejections bool, cid string)
89
75
return adapter
90
76
}
91
77
78
+ // getChainCodeEvents parses block events for chaincode events associated with individual transactions
79
+ func getChainCodeEvents (tdata []byte ) (* pb.ChaincodeEvent , error ) {
80
+ if tdata == nil {
81
+ return nil , fmt .Errorf ("Cannot extract payload from nil transaction" )
82
+ }
83
+
84
+ if env , err := utils .GetEnvelopeFromBlock (tdata ); err != nil {
85
+ return nil , fmt .Errorf ("Error getting tx from block(%s)\n " , err )
86
+ } else if env != nil {
87
+ // get the payload from the envelope
88
+ payload , err := utils .GetPayload (env )
89
+ if err != nil {
90
+ return nil , fmt .Errorf ("Could not extract payload from envelope, err %s" , err )
91
+ }
92
+
93
+ if common .HeaderType (payload .Header .ChainHeader .Type ) == common .HeaderType_ENDORSER_TRANSACTION {
94
+ tx , err := utils .GetTransaction (payload .Data )
95
+ if err != nil {
96
+ return nil , fmt .Errorf ("Error unmarshalling transaction payload for block event: %s" , err )
97
+ }
98
+ chaincodeActionPayload , err := utils .GetChaincodeActionPayload (tx .Actions [0 ].Payload )
99
+ if err != nil {
100
+ return nil , fmt .Errorf ("Error unmarshalling transaction action payload for block event: %s" , err )
101
+ }
102
+ propRespPayload , err := utils .GetProposalResponsePayload (chaincodeActionPayload .Action .ProposalResponsePayload )
103
+ if err != nil {
104
+ return nil , fmt .Errorf ("Error unmarshalling proposal response payload for block event: %s" , err )
105
+ }
106
+ caPayload , err := utils .GetChaincodeAction (propRespPayload .Extension )
107
+ if err != nil {
108
+ return nil , fmt .Errorf ("Error unmarshalling chaincode action for block event: %s" , err )
109
+ }
110
+ ccEvent , err := utils .GetChaincodeEvents (caPayload .Events )
111
+
112
+ if ccEvent != nil {
113
+ return ccEvent , nil
114
+ }
115
+ }
116
+ }
117
+ return nil , fmt .Errorf ("No events found" )
118
+ }
119
+
92
120
func main () {
93
121
var eventAddress string
94
122
var listenToRejections bool
@@ -115,6 +143,13 @@ func main() {
115
143
fmt .Printf ("--------------\n " )
116
144
for _ , r := range b .Block .Data .Data {
117
145
fmt .Printf ("Transaction:\n \t [%v]\n " , r )
146
+ if event , err := getChainCodeEvents (r ); err == nil {
147
+ if event .ChaincodeID == chaincodeID {
148
+ fmt .Printf ("Received chaincode event\n " )
149
+ fmt .Printf ("------------------------\n " )
150
+ fmt .Printf ("Chaincode Event:%+v\n " , event )
151
+ }
152
+ }
118
153
}
119
154
case r := <- a .rejected :
120
155
fmt .Printf ("\n " )
@@ -124,12 +159,6 @@ func main() {
124
159
//TODO get TxID from pb.ChaincodeHeader from TransactionAction's Header
125
160
//fmt.Printf("Transaction error:\n%s\t%s\n", r.Rejection.Tx.Txid, r.Rejection.ErrorMsg)
126
161
fmt .Printf ("Transaction error:\n %s\n " , r .Rejection .ErrorMsg )
127
- case ce := <- a .cEvent :
128
- fmt .Printf ("\n " )
129
- fmt .Printf ("\n " )
130
- fmt .Printf ("Received chaincode event\n " )
131
- fmt .Printf ("------------------------\n " )
132
- fmt .Printf ("Chaincode Event:%v\n " , ce )
133
162
}
134
163
}
135
164
}
0 commit comments