@@ -17,21 +17,106 @@ limitations under the License.
17
17
package producer
18
18
19
19
import (
20
+ "fmt"
21
+
22
+ "github.com/golang/protobuf/proto"
20
23
"github.com/hyperledger/fabric/protos/common"
21
- ehpb "github.com/hyperledger/fabric/protos/peer"
24
+ pb "github.com/hyperledger/fabric/protos/peer"
25
+ "github.com/hyperledger/fabric/protos/utils"
26
+ "github.com/op/go-logging"
22
27
)
23
28
29
+ var logger * logging.Logger // package-level logger
30
+
31
+ func init () {
32
+ logger = logging .MustGetLogger ("eventhub_producer" )
33
+ }
34
+
35
+ // SendProducerBlockEvent sends block event to clients
36
+ func SendProducerBlockEvent (block * common.Block ) error {
37
+ bevent := & common.Block {}
38
+ bevent .Header = block .Header
39
+ bevent .Metadata = block .Metadata
40
+ bevent .Data = & common.BlockData {}
41
+ for _ , d := range block .Data .Data {
42
+ if d != nil {
43
+ if env , err := utils .GetEnvelopeFromBlock (d ); err != nil {
44
+ logger .Errorf ("Error getting tx from block(%s)\n " , err )
45
+ } else if env != nil {
46
+ // get the payload from the envelope
47
+ payload , err := utils .GetPayload (env )
48
+ if err != nil {
49
+ return fmt .Errorf ("Could not extract payload from envelope, err %s" , err )
50
+ }
51
+
52
+ if common .HeaderType (payload .Header .ChainHeader .Type ) == common .HeaderType_ENDORSER_TRANSACTION {
53
+ tx , err := utils .GetTransaction (payload .Data )
54
+ if err != nil {
55
+ logger .Errorf ("Error unmarshalling transaction payload for block event: %s" , err )
56
+ continue
57
+ }
58
+ chaincodeActionPayload := & pb.ChaincodeActionPayload {}
59
+ err = proto .Unmarshal (tx .Actions [0 ].Payload , chaincodeActionPayload )
60
+ if err != nil {
61
+ logger .Errorf ("Error unmarshalling transaction action payload for block event: %s" , err )
62
+ continue
63
+ }
64
+
65
+ propRespPayload := & pb.ProposalResponsePayload {}
66
+ err = proto .Unmarshal (chaincodeActionPayload .Action .ProposalResponsePayload , propRespPayload )
67
+ if err != nil {
68
+ logger .Errorf ("Error unmarshalling proposal response payload for block event: %s" , err )
69
+ continue
70
+ }
71
+ //ENDORSER_ACTION, ProposalResponsePayload.Extension field contains ChaincodeAction
72
+ caPayload := & pb.ChaincodeAction {}
73
+ err = proto .Unmarshal (propRespPayload .Extension , caPayload )
74
+ if err != nil {
75
+ logger .Errorf ("Error unmarshalling chaincode action for block event: %s" , err )
76
+ continue
77
+ }
78
+ // Drop read write set from transaction before sending block event
79
+ caPayload .Results = nil
80
+ propRespPayload .Extension , err = proto .Marshal (caPayload )
81
+ if err != nil {
82
+ logger .Errorf ("Error marshalling tx proposal extension payload for block event: %s" , err )
83
+ continue
84
+ }
85
+ // Marshal Transaction again and append to block to be sent
86
+ chaincodeActionPayload .Action .ProposalResponsePayload , err = proto .Marshal (propRespPayload )
87
+ if err != nil {
88
+ logger .Errorf ("Error marshalling tx proposal payload for block event: %s" , err )
89
+ continue
90
+ }
91
+ tx .Actions [0 ].Payload , err = proto .Marshal (chaincodeActionPayload )
92
+ if err != nil {
93
+ logger .Errorf ("Error marshalling tx action payload for block event: %s" , err )
94
+ continue
95
+ }
96
+ if t , err := proto .Marshal (tx ); err == nil {
97
+ bevent .Data .Data = append (bevent .Data .Data , t )
98
+ logger .Infof ("calling sendProducerBlockEvent\n " )
99
+ } else {
100
+ logger .Infof ("Cannot marshal transaction %s\n " , err )
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ return Send (CreateBlockEvent (bevent ))
107
+ }
108
+
24
109
//CreateBlockEvent creates a Event from a Block
25
- func CreateBlockEvent (te * common.Block ) * ehpb .Event {
26
- return & ehpb .Event {Event : & ehpb .Event_Block {Block : te }}
110
+ func CreateBlockEvent (te * common.Block ) * pb .Event {
111
+ return & pb .Event {Event : & pb .Event_Block {Block : te }}
27
112
}
28
113
29
114
//CreateChaincodeEvent creates a Event from a ChaincodeEvent
30
- func CreateChaincodeEvent (te * ehpb .ChaincodeEvent ) * ehpb .Event {
31
- return & ehpb .Event {Event : & ehpb .Event_ChaincodeEvent {ChaincodeEvent : te }}
115
+ func CreateChaincodeEvent (te * pb .ChaincodeEvent ) * pb .Event {
116
+ return & pb .Event {Event : & pb .Event_ChaincodeEvent {ChaincodeEvent : te }}
32
117
}
33
118
34
119
//CreateRejectionEvent creates an Event from TxResults
35
- func CreateRejectionEvent (tx * ehpb .Transaction , errorMsg string ) * ehpb .Event {
36
- return & ehpb .Event {Event : & ehpb .Event_Rejection {Rejection : & ehpb .Rejection {Tx : tx , ErrorMsg : errorMsg }}}
120
+ func CreateRejectionEvent (tx * pb .Transaction , errorMsg string ) * pb .Event {
121
+ return & pb .Event {Event : & pb .Event_Rejection {Rejection : & pb .Rejection {Tx : tx , ErrorMsg : errorMsg }}}
37
122
}
0 commit comments