Skip to content

Commit ed01846

Browse files
committed
Fix for block event generation
[FAB-1603]Fix for incorrect marshalling of transaction into block and changed to using utils for marshalling Change-Id: I84697b6d2c2a140fb57f6ae45e3994e7ee4c4c20 Signed-off-by: Patrick Mullaney <[email protected]>
1 parent 28841b9 commit ed01846

File tree

2 files changed

+84
-36
lines changed

2 files changed

+84
-36
lines changed

events/events_test.go

+56-3
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ import (
2424
"testing"
2525
"time"
2626

27+
"github.com/golang/protobuf/ptypes/timestamp"
2728
"github.com/hyperledger/fabric/events/consumer"
2829
"github.com/hyperledger/fabric/events/producer"
2930
"github.com/hyperledger/fabric/protos/common"
3031
ehpb "github.com/hyperledger/fabric/protos/peer"
32+
"github.com/hyperledger/fabric/protos/utils"
3133
"github.com/spf13/viper"
3234
"google.golang.org/grpc"
3335
"google.golang.org/grpc/credentials"
@@ -81,9 +83,60 @@ func (a *Adapter) Disconnected(err error) {
8183
}
8284
}
8385

84-
func createTestBlock() *common.Block {
86+
func createTestBlock(t *testing.T) *common.Block {
87+
chdr := &common.ChainHeader{
88+
Type: int32(common.HeaderType_ENDORSER_TRANSACTION),
89+
Version: 1,
90+
Timestamp: &timestamp.Timestamp{
91+
Seconds: time.Now().Unix(),
92+
Nanos: 0,
93+
},
94+
ChainID: "test"}
95+
hdr := &common.Header{ChainHeader: chdr}
96+
payload := &common.Payload{Header: hdr}
97+
cea := &ehpb.ChaincodeEndorsedAction{}
98+
ccaPayload := &ehpb.ChaincodeActionPayload{Action: cea}
99+
env := &common.Envelope{}
100+
taa := &ehpb.TransactionAction{}
101+
taas := make([]*ehpb.TransactionAction, 1)
102+
taas[0] = taa
103+
tx := &ehpb.Transaction{Actions: taas}
104+
105+
events := &ehpb.ChaincodeEvent{
106+
ChaincodeID: "ccid",
107+
EventName: "EventName",
108+
Payload: []byte("EventPayload"),
109+
TxID: "TxID"}
110+
111+
pHashBytes := []byte("proposal_hash")
112+
results := []byte("results")
113+
eventBytes, err := utils.GetBytesChaincodeEvent(events)
114+
if err != nil {
115+
t.Fatalf("Failure while marshalling the ProposalResponsePayload")
116+
}
117+
ccaPayload.Action.ProposalResponsePayload, err = utils.GetBytesProposalResponsePayload(pHashBytes, results, eventBytes)
118+
if err != nil {
119+
t.Fatalf("Failure while marshalling the ProposalResponsePayload")
120+
}
121+
tx.Actions[0].Payload, err = utils.GetBytesChaincodeActionPayload(ccaPayload)
122+
if err != nil {
123+
t.Fatalf("Error marshalling tx action payload for block event: %s", err)
124+
}
125+
payload.Data, err = utils.GetBytesTransaction(tx)
126+
if err != nil {
127+
t.Fatalf("Failure while marshalling payload for block event: %s", err)
128+
}
129+
env.Payload, err = utils.GetBytesPayload(payload)
130+
if err != nil {
131+
t.Fatalf("Failure while marshalling tx envelope for block event: %s", err)
132+
}
133+
ebytes, err := utils.GetBytesEnvelope(env)
134+
if err != nil {
135+
t.Fatalf("Failure while marshalling transaction %s", err)
136+
}
137+
85138
block := common.NewBlock(1, []byte{})
86-
block.Data.Data = [][]byte{[]byte("tx1"), []byte("tx2")}
139+
block.Data.Data = append(block.Data.Data, ebytes)
87140
block.Header.DataHash = block.Data.Hash()
88141
return block
89142
}
@@ -121,7 +174,7 @@ func TestReceiveAnyMessage(t *testing.T) {
121174
var err error
122175

123176
adapter.count = 1
124-
block := createTestBlock()
177+
block := createTestBlock(t)
125178
if err = producer.SendProducerBlockEvent(block); err != nil {
126179
t.Fail()
127180
t.Logf("Error sending message %s", err)

events/producer/eventhelper.go

+28-33
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package producer
1919
import (
2020
"fmt"
2121

22-
"github.com/golang/protobuf/proto"
2322
"github.com/hyperledger/fabric/protos/common"
2423
pb "github.com/hyperledger/fabric/protos/peer"
2524
"github.com/hyperledger/fabric/protos/utils"
@@ -39,8 +38,9 @@ func SendProducerBlockEvent(block *common.Block) error {
3938
bevent.Metadata = block.Metadata
4039
bevent.Data = &common.BlockData{}
4140
for _, d := range block.Data.Data {
42-
if d != nil {
43-
if env, err := utils.GetEnvelopeFromBlock(d); err != nil {
41+
ebytes := d
42+
if ebytes != nil {
43+
if env, err := utils.GetEnvelopeFromBlock(ebytes); err != nil {
4444
logger.Errorf("Error getting tx from block(%s)\n", err)
4545
} else if env != nil {
4646
// get the payload from the envelope
@@ -52,56 +52,51 @@ func SendProducerBlockEvent(block *common.Block) error {
5252
if common.HeaderType(payload.Header.ChainHeader.Type) == common.HeaderType_ENDORSER_TRANSACTION {
5353
tx, err := utils.GetTransaction(payload.Data)
5454
if err != nil {
55-
logger.Errorf("Error unmarshalling transaction payload for block event: %s", err)
56-
continue
55+
return fmt.Errorf("Error unmarshalling transaction payload for block event: %s", err)
5756
}
58-
chaincodeActionPayload := &pb.ChaincodeActionPayload{}
59-
err = proto.Unmarshal(tx.Actions[0].Payload, chaincodeActionPayload)
57+
chaincodeActionPayload, err := utils.GetChaincodeActionPayload(tx.Actions[0].Payload)
6058
if err != nil {
61-
logger.Errorf("Error unmarshalling transaction action payload for block event: %s", err)
62-
continue
59+
return fmt.Errorf("Error unmarshalling transaction action payload for block event: %s", err)
6360
}
64-
65-
propRespPayload := &pb.ProposalResponsePayload{}
66-
err = proto.Unmarshal(chaincodeActionPayload.Action.ProposalResponsePayload, propRespPayload)
61+
propRespPayload, err := utils.GetProposalResponsePayload(chaincodeActionPayload.Action.ProposalResponsePayload)
6762
if err != nil {
68-
logger.Errorf("Error unmarshalling proposal response payload for block event: %s", err)
69-
continue
63+
return fmt.Errorf("Error unmarshalling proposal response payload for block event: %s", err)
7064
}
7165
//ENDORSER_ACTION, ProposalResponsePayload.Extension field contains ChaincodeAction
72-
caPayload := &pb.ChaincodeAction{}
73-
err = proto.Unmarshal(propRespPayload.Extension, caPayload)
66+
caPayload, err := utils.GetChaincodeAction(propRespPayload.Extension)
7467
if err != nil {
75-
logger.Errorf("Error unmarshalling chaincode action for block event: %s", err)
76-
continue
68+
return fmt.Errorf("Error unmarshalling chaincode action for block event: %s", err)
7769
}
7870
// Drop read write set from transaction before sending block event
71+
// Performance issue with chaincode deploy txs and causes nodejs grpc
72+
// to hit max message size bug
73+
// Dropping the read write set may cause issues for security and
74+
// we will need to revist when event security is addressed
7975
caPayload.Results = nil
80-
propRespPayload.Extension, err = proto.Marshal(caPayload)
76+
chaincodeActionPayload.Action.ProposalResponsePayload, err = utils.GetBytesProposalResponsePayload(propRespPayload.ProposalHash, caPayload.Results, caPayload.Events)
77+
if err != nil {
78+
return fmt.Errorf("Error marshalling tx proposal payload for block event: %s", err)
79+
}
80+
tx.Actions[0].Payload, err = utils.GetBytesChaincodeActionPayload(chaincodeActionPayload)
8181
if err != nil {
82-
logger.Errorf("Error marshalling tx proposal extension payload for block event: %s", err)
83-
continue
82+
return fmt.Errorf("Error marshalling tx action payload for block event: %s", err)
8483
}
85-
// Marshal Transaction again and append to block to be sent
86-
chaincodeActionPayload.Action.ProposalResponsePayload, err = proto.Marshal(propRespPayload)
84+
payload.Data, err = utils.GetBytesTransaction(tx)
8785
if err != nil {
88-
logger.Errorf("Error marshalling tx proposal payload for block event: %s", err)
89-
continue
86+
return fmt.Errorf("Error marshalling payload for block event: %s", err)
9087
}
91-
tx.Actions[0].Payload, err = proto.Marshal(chaincodeActionPayload)
88+
env.Payload, err = utils.GetBytesPayload(payload)
9289
if err != nil {
93-
logger.Errorf("Error marshalling tx action payload for block event: %s", err)
94-
continue
90+
return fmt.Errorf("Error marshalling tx envelope for block event: %s", err)
9591
}
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)
92+
ebytes, err = utils.GetBytesEnvelope(env)
93+
if err != nil {
94+
return fmt.Errorf("Cannot marshal transaction %s", err)
10195
}
10296
}
10397
}
10498
}
99+
bevent.Data.Data = append(bevent.Data.Data, ebytes)
105100
}
106101
return Send(CreateBlockEvent(bevent))
107102
}

0 commit comments

Comments
 (0)