@@ -21,21 +21,20 @@ import (
21
21
"fmt"
22
22
"os"
23
23
24
+ "github.com/hyperledger/fabric/core/ledger/util"
24
25
"github.com/hyperledger/fabric/events/consumer"
25
26
"github.com/hyperledger/fabric/protos/common"
26
27
pb "github.com/hyperledger/fabric/protos/peer"
27
28
"github.com/hyperledger/fabric/protos/utils"
28
29
)
29
30
30
31
type adapter struct {
31
- notfy chan * pb.Event_Block
32
- rejected chan * pb.Event_Rejection
33
- listenToRejections bool
32
+ notfy chan * pb.Event_Block
34
33
}
35
34
36
35
//GetInterestedEvents implements consumer.EventAdapter interface for registering interested events
37
36
func (a * adapter ) GetInterestedEvents () ([]* pb.Interest , error ) {
38
- return []* pb.Interest {{EventType : pb .EventType_BLOCK }, { EventType : pb . EventType_REJECTION } }, nil
37
+ return []* pb.Interest {{EventType : pb .EventType_BLOCK }}, nil
39
38
}
40
39
41
40
//Recv implements consumer.EventAdapter interface for receiving events
@@ -44,12 +43,6 @@ func (a *adapter) Recv(msg *pb.Event) (bool, error) {
44
43
a .notfy <- o
45
44
return true , nil
46
45
}
47
- if o , e := msg .Event .(* pb.Event_Rejection ); e {
48
- if a .listenToRejections {
49
- a .rejected <- o
50
- }
51
- return true , nil
52
- }
53
46
return false , fmt .Errorf ("Receive unkown type event: %v" , msg )
54
47
}
55
48
@@ -59,12 +52,11 @@ func (a *adapter) Disconnected(err error) {
59
52
os .Exit (1 )
60
53
}
61
54
62
- func createEventClient (eventAddress string , listenToRejections bool , cid string ) * adapter {
55
+ func createEventClient (eventAddress string , cid string ) * adapter {
63
56
var obcEHClient * consumer.EventsClient
64
57
65
58
done := make (chan * pb.Event_Block )
66
- reject := make (chan * pb.Event_Rejection )
67
- adapter := & adapter {notfy : done , rejected : reject , listenToRejections : listenToRejections }
59
+ adapter := & adapter {notfy : done }
68
60
obcEHClient , _ = consumer .NewEventsClient (eventAddress , 5 , adapter )
69
61
if err := obcEHClient .Start (); err != nil {
70
62
fmt .Printf ("could not start chat %s\n " , err )
@@ -74,6 +66,23 @@ func createEventClient(eventAddress string, listenToRejections bool, cid string)
74
66
75
67
return adapter
76
68
}
69
+ func getTxPayload (tdata []byte ) (* common.Payload , error ) {
70
+ if tdata == nil {
71
+ return nil , fmt .Errorf ("Cannot extract payload from nil transaction" )
72
+ }
73
+
74
+ if env , err := utils .GetEnvelopeFromBlock (tdata ); err != nil {
75
+ return nil , fmt .Errorf ("Error getting tx from block(%s)" , err )
76
+ } else if env != nil {
77
+ // get the payload from the envelope
78
+ payload , err := utils .GetPayload (env )
79
+ if err != nil {
80
+ return nil , fmt .Errorf ("Could not extract payload from envelope, err %s" , err )
81
+ }
82
+ return payload , nil
83
+ }
84
+ return nil , nil
85
+ }
77
86
78
87
// getChainCodeEvents parses block events for chaincode events associated with individual transactions
79
88
func getChainCodeEvents (tdata []byte ) (* pb.ChaincodeEvent , error ) {
@@ -82,7 +91,7 @@ func getChainCodeEvents(tdata []byte) (*pb.ChaincodeEvent, error) {
82
91
}
83
92
84
93
if env , err := utils .GetEnvelopeFromBlock (tdata ); err != nil {
85
- return nil , fmt .Errorf ("Error getting tx from block(%s)\n " , err )
94
+ return nil , fmt .Errorf ("Error getting tx from block(%s)" , err )
86
95
} else if env != nil {
87
96
// get the payload from the envelope
88
97
payload , err := utils .GetPayload (env )
@@ -119,16 +128,14 @@ func getChainCodeEvents(tdata []byte) (*pb.ChaincodeEvent, error) {
119
128
120
129
func main () {
121
130
var eventAddress string
122
- var listenToRejections bool
123
131
var chaincodeID string
124
132
flag .StringVar (& eventAddress , "events-address" , "0.0.0.0:7053" , "address of events server" )
125
- flag .BoolVar (& listenToRejections , "listen-to-rejections" , false , "whether to listen to rejection events" )
126
133
flag .StringVar (& chaincodeID , "events-from-chaincode" , "" , "listen to events from given chaincode" )
127
134
flag .Parse ()
128
135
129
136
fmt .Printf ("Event Address: %s\n " , eventAddress )
130
137
131
- a := createEventClient (eventAddress , listenToRejections , chaincodeID )
138
+ a := createEventClient (eventAddress , chaincodeID )
132
139
if a == nil {
133
140
fmt .Printf ("Error creating event client\n " )
134
141
return
@@ -141,24 +148,29 @@ func main() {
141
148
fmt .Printf ("\n " )
142
149
fmt .Printf ("Received block\n " )
143
150
fmt .Printf ("--------------\n " )
144
- for _ , r := range b .Block .Data .Data {
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
+ txsFltr := util .NewFilterBitArrayFromBytes (b .Block .Metadata .Metadata [common .BlockMetadataIndex_TRANSACTIONS_FILTER ])
152
+
153
+ for i , r := range b .Block .Data .Data {
154
+ if txsFltr .IsSet (uint (i )) {
155
+ tx , _ := getTxPayload (r )
156
+ if tx != nil {
157
+ fmt .Printf ("\n " )
158
+ fmt .Printf ("\n " )
159
+ fmt .Printf ("Received invalid transaction\n " )
160
+ fmt .Printf ("--------------\n " )
161
+ fmt .Printf ("Transaction invalid: TxID: %s\n " , tx .Header .ChainHeader .TxID )
162
+ }
163
+ } else {
164
+ fmt .Printf ("Transaction:\n \t [%v]\n " , r )
165
+ if event , err := getChainCodeEvents (r ); err == nil {
166
+ if len (chaincodeID ) != 0 && event .ChaincodeID == chaincodeID {
167
+ fmt .Printf ("Received chaincode event\n " )
168
+ fmt .Printf ("------------------------\n " )
169
+ fmt .Printf ("Chaincode Event:%+v\n " , event )
170
+ }
151
171
}
152
172
}
153
173
}
154
- case r := <- a .rejected :
155
- fmt .Printf ("\n " )
156
- fmt .Printf ("\n " )
157
- fmt .Printf ("Received rejected transaction\n " )
158
- fmt .Printf ("--------------\n " )
159
- //TODO get TxID from pb.ChaincodeHeader from TransactionAction's Header
160
- //fmt.Printf("Transaction error:\n%s\t%s\n", r.Rejection.Tx.Txid, r.Rejection.ErrorMsg)
161
- fmt .Printf ("Transaction error:\n %s\n " , r .Rejection .ErrorMsg )
162
174
}
163
175
}
164
176
}
0 commit comments