Skip to content

Commit 011cd41

Browse files
committed
[FAB-1392] - Use bytes for headers
This change set ensures that the protobuf representation for headers be in bytes. This makes sure that if ever protobuf marshalling is non-deterministic, we do not have problems because whenever we hash a header, we do that over the serialized version we receive. Change-Id: I838e0d5dec2f79f88fab63d92bdfb51d92c2f069 Signed-off-by: Alessandro Sorniotti <ale.linux@sopit.net>
1 parent 008ee85 commit 011cd41

File tree

48 files changed

+499
-260
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+499
-260
lines changed

common/configtx/manager_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ func makeConfigUpdateEnvelope(chainID string, configPairs ...*configPair) *cb.En
9292
return &cb.Envelope{
9393
Payload: utils.MarshalOrPanic(&cb.Payload{
9494
Header: &cb.Header{
95-
ChannelHeader: &cb.ChannelHeader{
95+
ChannelHeader: utils.MarshalOrPanic(&cb.ChannelHeader{
9696
Type: int32(cb.HeaderType_CONFIG_UPDATE),
97-
},
97+
}),
9898
},
9999
Data: utils.MarshalOrPanic(&cb.ConfigUpdateEnvelope{
100100
ConfigUpdate: utils.MarshalOrPanic(config),

common/configtx/update.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,16 @@ func envelopeToConfigUpdate(configtx *cb.Envelope) (*cb.ConfigUpdateEnvelope, er
154154
return nil, err
155155
}
156156

157-
if payload.Header == nil || payload.Header.ChannelHeader == nil {
158-
return nil, fmt.Errorf("Envelope must have ChannelHeader")
157+
if payload.Header == nil /* || payload.Header.ChannelHeader == nil */ {
158+
return nil, fmt.Errorf("Envelope must have a Header")
159159
}
160160

161-
if payload.Header == nil || payload.Header.ChannelHeader.Type != int32(cb.HeaderType_CONFIG_UPDATE) {
161+
chdr, err := utils.UnmarshalChannelHeader(payload.Header.ChannelHeader)
162+
if err != nil {
163+
return nil, fmt.Errorf("Invalid ChannelHeader")
164+
}
165+
166+
if chdr.Type != int32(cb.HeaderType_CONFIG_UPDATE) {
162167
return nil, fmt.Errorf("Not a tx of type CONFIG_UPDATE")
163168
}
164169

common/ledger/blkstorage/fsblkstorage/block_serialization.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,5 +207,9 @@ func extractTxID(txEnvelopBytes []byte) (string, error) {
207207
if err != nil {
208208
return "", nil
209209
}
210-
return txPayload.Header.ChannelHeader.TxId, nil
210+
chdr, err := utils.UnmarshalChannelHeader(txPayload.Header.ChannelHeader)
211+
if err != nil {
212+
return "", err
213+
}
214+
return chdr.TxId, nil
211215
}

core/committer/txvalidator/txvalidator_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,11 @@ func TestNewTxValidator_DuplicateTransactions(t *testing.T) {
7575
// Create simeple endorsement transaction
7676
payload := &common.Payload{
7777
Header: &common.Header{
78-
ChannelHeader: &common.ChannelHeader{
78+
ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{
7979
TxId: "simple_txID", // Fake txID
8080
Type: int32(common.HeaderType_ENDORSER_TRANSACTION),
8181
ChannelId: util2.GetTestChainID(),
82-
},
82+
}),
8383
},
8484
Data: []byte("test"),
8585
}

core/committer/txvalidator/validator.go

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,23 @@ func (v *txValidator) Validate(block *common.Block) error {
118118
continue
119119
}
120120

121-
chain := payload.Header.ChannelHeader.ChannelId
122-
logger.Debug("Transaction is for chain %s", chain)
121+
chdr, err := utils.UnmarshalChannelHeader(payload.Header.ChannelHeader)
122+
if err != nil {
123+
logger.Warning("Could not unmarshal channel header, err %s, skipping", err)
124+
continue
125+
}
123126

124-
if !v.chainExists(chain) {
125-
logger.Errorf("Dropping transaction for non-existent chain %s", chain)
127+
channel := chdr.ChannelId
128+
logger.Debug("Transaction is for chain %s", channel)
129+
130+
if !v.chainExists(channel) {
131+
logger.Errorf("Dropping transaction for non-existent chain %s", channel)
126132
continue
127133
}
128134

129-
if common.HeaderType(payload.Header.ChannelHeader.Type) == common.HeaderType_ENDORSER_TRANSACTION {
135+
if common.HeaderType(chdr.Type) == common.HeaderType_ENDORSER_TRANSACTION {
130136
// Check duplicate transactions
131-
txID := payload.Header.ChannelHeader.TxId
137+
txID := chdr.TxId
132138
if _, err := v.support.Ledger().GetTransactionByID(txID); err == nil {
133139
logger.Warning("Duplicate transaction found, ", txID, ", skipping")
134140
continue
@@ -141,7 +147,7 @@ func (v *txValidator) Validate(block *common.Block) error {
141147
logger.Errorf("VSCCValidateTx for transaction txId = %s returned error %s", txID, err)
142148
continue
143149
}
144-
} else if common.HeaderType(payload.Header.ChannelHeader.Type) == common.HeaderType_CONFIG {
150+
} else if common.HeaderType(chdr.Type) == common.HeaderType_CONFIG {
145151
configEnvelope, err := configtx.UnmarshalConfigEnvelope(payload.Data)
146152
if err != nil {
147153
err := fmt.Errorf("Error unmarshaling config which passed initial validity checks: %s", err)
@@ -154,7 +160,7 @@ func (v *txValidator) Validate(block *common.Block) error {
154160
logger.Critical(err)
155161
return err
156162
}
157-
logger.Debugf("config transaction received for chain %s", chain)
163+
logger.Debugf("config transaction received for chain %s", channel)
158164
}
159165

160166
if _, err := proto.Marshal(env); err != nil {
@@ -178,17 +184,21 @@ func (v *txValidator) Validate(block *common.Block) error {
178184
}
179185

180186
func (v *vsccValidatorImpl) VSCCValidateTx(payload *common.Payload, envBytes []byte) error {
187+
chdr, err := utils.UnmarshalChannelHeader(payload.Header.ChannelHeader)
188+
if err != nil {
189+
return err
190+
}
191+
181192
// Chain ID
182-
chainID := payload.Header.ChannelHeader.ChannelId
193+
chainID := chdr.ChannelId
183194
if chainID == "" {
184195
err := fmt.Errorf("transaction header does not contain an chain ID")
185196
logger.Errorf("%s", err)
186197
return err
187198
}
188199

189200
// Get transaction id
190-
txid := payload.Header.ChannelHeader.TxId
191-
logger.Info("[XXX remove me XXX] Transaction type,", common.HeaderType(payload.Header.ChannelHeader.Type))
201+
txid := chdr.TxId
192202
if txid == "" {
193203
err := fmt.Errorf("transaction header does not contain transaction ID")
194204
logger.Errorf("%s", err)

core/common/validation/config_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ func TestValidateConfigTx(t *testing.T) {
3636

3737
updateResult := &cb.Envelope{
3838
Payload: utils.MarshalOrPanic(&cb.Payload{Header: &cb.Header{
39-
ChannelHeader: &cb.ChannelHeader{
39+
ChannelHeader: utils.MarshalOrPanic(&cb.ChannelHeader{
4040
Type: int32(cb.HeaderType_CONFIG),
4141
ChannelId: chainID,
42-
},
43-
SignatureHeader: &cb.SignatureHeader{
42+
}),
43+
SignatureHeader: utils.MarshalOrPanic(&cb.SignatureHeader{
4444
Creator: signerSerialized,
4545
Nonce: utils.CreateNonceOrPanic(),
46-
},
46+
}),
4747
},
4848
Data: utils.MarshalOrPanic(&cb.ConfigEnvelope{
4949
LastUpdate: chCrtEnv,

core/common/validation/msgvalidation.go

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ func ValidateProposalMessage(signedProp *pb.SignedProposal) (*pb.Proposal, *comm
7979
}
8080

8181
// validate the header
82-
err = validateCommonHeader(hdr)
82+
chdr, shdr, err := validateCommonHeader(hdr)
8383
if err != nil {
8484
return nil, nil, nil, err
8585
}
8686

8787
// validate the signature
88-
err = checkSignatureFromCreator(hdr.SignatureHeader.Creator, signedProp.Signature, signedProp.ProposalBytes, hdr.ChannelHeader.ChannelId)
88+
err = checkSignatureFromCreator(shdr.Creator, signedProp.Signature, signedProp.ProposalBytes, chdr.ChannelId)
8989
if err != nil {
9090
return nil, nil, nil, err
9191
}
@@ -96,15 +96,15 @@ func ValidateProposalMessage(signedProp *pb.SignedProposal) (*pb.Proposal, *comm
9696
// This check is needed to ensure that the lookup into the ledger
9797
// for the same TxID catches duplicates.
9898
err = utils.CheckProposalTxID(
99-
hdr.ChannelHeader.TxId,
100-
hdr.SignatureHeader.Nonce,
101-
hdr.SignatureHeader.Creator)
99+
chdr.TxId,
100+
shdr.Nonce,
101+
shdr.Creator)
102102
if err != nil {
103103
return nil, nil, nil, err
104104
}
105105

106106
// continue the validation in a way that depends on the type specified in the header
107-
switch common.HeaderType(hdr.ChannelHeader.Type) {
107+
switch common.HeaderType(chdr.Type) {
108108
case common.HeaderType_CONFIG:
109109
//which the types are different the validation is the same
110110
//viz, validate a proposal to a chaincode. If we need other
@@ -121,7 +121,7 @@ func ValidateProposalMessage(signedProp *pb.SignedProposal) (*pb.Proposal, *comm
121121
return prop, hdr, chaincodeHdrExt, err
122122
default:
123123
//NOTE : we proably need a case
124-
return nil, nil, nil, fmt.Errorf("Unsupported proposal type %d", common.HeaderType(hdr.ChannelHeader.Type))
124+
return nil, nil, nil, fmt.Errorf("Unsupported proposal type %d", common.HeaderType(chdr.Type))
125125
}
126126
}
127127

@@ -220,22 +220,32 @@ func validateChannelHeader(cHdr *common.ChannelHeader) error {
220220
}
221221

222222
// checks for a valid Header
223-
func validateCommonHeader(hdr *common.Header) error {
223+
func validateCommonHeader(hdr *common.Header) (*common.ChannelHeader, *common.SignatureHeader, error) {
224224
if hdr == nil {
225-
return fmt.Errorf("Nil header")
225+
return nil, nil, fmt.Errorf("Nil header")
226226
}
227227

228-
err := validateChannelHeader(hdr.ChannelHeader)
228+
chdr, err := utils.UnmarshalChannelHeader(hdr.ChannelHeader)
229229
if err != nil {
230-
return err
230+
return nil, nil, err
231231
}
232232

233-
err = validateSignatureHeader(hdr.SignatureHeader)
233+
shdr, err := utils.GetSignatureHeader(hdr.SignatureHeader)
234234
if err != nil {
235-
return err
235+
return nil, nil, err
236236
}
237237

238-
return nil
238+
err = validateChannelHeader(chdr)
239+
if err != nil {
240+
return nil, nil, err
241+
}
242+
243+
err = validateSignatureHeader(shdr)
244+
if err != nil {
245+
return nil, nil, err
246+
}
247+
248+
return chdr, shdr, nil
239249
}
240250

241251
// validateConfigTransaction validates the payload of a
@@ -319,14 +329,10 @@ func validateEndorserTransaction(data []byte, hdr *common.Header) error {
319329

320330
// build the original header by stitching together
321331
// the common ChannelHeader and the per-action SignatureHeader
322-
hdrOrig := &common.Header{ChannelHeader: hdr.ChannelHeader, SignatureHeader: sHdr}
323-
hdrBytes, err := utils.GetBytesHeader(hdrOrig) // FIXME: here we hope that hdrBytes will be the same one that the endorser had
324-
if err != nil {
325-
return err
326-
}
332+
hdrOrig := &common.Header{ChannelHeader: hdr.ChannelHeader, SignatureHeader: act.Header}
327333

328334
// compute proposalHash
329-
pHash, err := utils.GetProposalHash2(hdrBytes, cap.ChaincodeProposalPayload)
335+
pHash, err := utils.GetProposalHash2(hdrOrig, cap.ChaincodeProposalPayload)
330336
if err != nil {
331337
return err
332338
}
@@ -358,29 +364,29 @@ func ValidateTransaction(e *common.Envelope) (*common.Payload, error) {
358364
putilsLogger.Infof("Header is %s", payload.Header)
359365

360366
// validate the header
361-
err = validateCommonHeader(payload.Header)
367+
chdr, shdr, err := validateCommonHeader(payload.Header)
362368
if err != nil {
363369
return nil, err
364370
}
365371

366372
// validate the signature in the envelope
367-
err = checkSignatureFromCreator(payload.Header.SignatureHeader.Creator, e.Signature, e.Payload, payload.Header.ChannelHeader.ChannelId)
373+
err = checkSignatureFromCreator(shdr.Creator, e.Signature, e.Payload, chdr.ChannelId)
368374
if err != nil {
369375
return nil, err
370376
}
371377

372378
// TODO: ensure that creator can transact with us (some ACLs?) which set of APIs is supposed to give us this info?
373379

374380
// continue the validation in a way that depends on the type specified in the header
375-
switch common.HeaderType(payload.Header.ChannelHeader.Type) {
381+
switch common.HeaderType(chdr.Type) {
376382
case common.HeaderType_ENDORSER_TRANSACTION:
377383
// Verify that the transaction ID has been computed properly.
378384
// This check is needed to ensure that the lookup into the ledger
379385
// for the same TxID catches duplicates.
380386
err = utils.CheckProposalTxID(
381-
payload.Header.ChannelHeader.TxId,
382-
payload.Header.SignatureHeader.Nonce,
383-
payload.Header.SignatureHeader.Creator)
387+
chdr.TxId,
388+
shdr.Nonce,
389+
shdr.Creator)
384390
if err != nil {
385391
return nil, err
386392
}
@@ -396,6 +402,6 @@ func ValidateTransaction(e *common.Envelope) (*common.Payload, error) {
396402
putilsLogger.Infof("ValidateTransactionEnvelope returns err %s", err)
397403
return payload, err
398404
default:
399-
return nil, fmt.Errorf("Unsupported transaction payload type %d", common.HeaderType(payload.Header.ChannelHeader.Type))
405+
return nil, fmt.Errorf("Unsupported transaction payload type %d", common.HeaderType(chdr.Type))
400406
}
401407
}

core/deliverservice/blocksprovider/blocksprovider.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,10 @@ func (b *blocksProviderImpl) seekOldest() error {
178178
return b.client.Send(&common.Envelope{
179179
Payload: utils.MarshalOrPanic(&common.Payload{
180180
Header: &common.Header{
181-
ChannelHeader: &common.ChannelHeader{
181+
ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{
182182
ChannelId: b.chainID,
183-
},
184-
SignatureHeader: &common.SignatureHeader{},
183+
}),
184+
SignatureHeader: utils.MarshalOrPanic(&common.SignatureHeader{}),
185185
},
186186
Data: utils.MarshalOrPanic(&orderer.SeekInfo{
187187
Start: &orderer.SeekPosition{Type: &orderer.SeekPosition_Oldest{Oldest: &orderer.SeekOldest{}}},
@@ -196,10 +196,10 @@ func (b *blocksProviderImpl) seekLatestFromCommitter(height uint64) error {
196196
return b.client.Send(&common.Envelope{
197197
Payload: utils.MarshalOrPanic(&common.Payload{
198198
Header: &common.Header{
199-
ChannelHeader: &common.ChannelHeader{
199+
ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{
200200
ChannelId: b.chainID,
201-
},
202-
SignatureHeader: &common.SignatureHeader{},
201+
}),
202+
SignatureHeader: utils.MarshalOrPanic(&common.SignatureHeader{}),
203203
},
204204
Data: utils.MarshalOrPanic(&orderer.SeekInfo{
205205
Start: &orderer.SeekPosition{Type: &orderer.SeekPosition_Specified{Specified: &orderer.SeekSpecified{Number: height}}},

core/endorser/endorser.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,17 @@ func (e *Endorser) ProcessProposal(ctx context.Context, signedProp *pb.SignedPro
278278
return &pb.ProposalResponse{Response: &pb.Response{Status: 500, Message: err.Error()}}, err
279279
}
280280

281-
chainID := hdr.ChannelHeader.ChannelId
281+
chdr, err := putils.UnmarshalChannelHeader(hdr.ChannelHeader)
282+
if err != nil {
283+
return &pb.ProposalResponse{Response: &pb.Response{Status: 500, Message: err.Error()}}, err
284+
}
285+
286+
shdr, err := putils.GetSignatureHeader(hdr.SignatureHeader)
287+
if err != nil {
288+
return &pb.ProposalResponse{Response: &pb.Response{Status: 500, Message: err.Error()}}, err
289+
}
290+
291+
chainID := chdr.ChannelId
282292

283293
//chainless MSPs have "" chain name
284294
ischainless := false
@@ -290,7 +300,7 @@ func (e *Endorser) ProcessProposal(ctx context.Context, signedProp *pb.SignedPro
290300
// Check for uniqueness of prop.TxID with ledger
291301
// Notice that ValidateProposalMessage has already verified
292302
// that TxID is computed propertly
293-
txid := hdr.ChannelHeader.TxId
303+
txid := chdr.TxId
294304
if txid == "" {
295305
err = errors.New("Invalid txID. It must be different from the empty string.")
296306
return &pb.ProposalResponse{Response: &pb.Response{Status: 500, Message: err.Error()}}, err
@@ -304,7 +314,7 @@ func (e *Endorser) ProcessProposal(ctx context.Context, signedProp *pb.SignedPro
304314
return nil, errors.New(fmt.Sprintf("Failure while looking up the ledger %s", chainID))
305315
}
306316
if _, err := lgr.GetTransactionByID(txid); err == nil {
307-
return nil, fmt.Errorf("Duplicate transaction found [%s]. Creator [%x]. [%s]", txid, hdr.SignatureHeader.Creator, err)
317+
return nil, fmt.Errorf("Duplicate transaction found [%s]. Creator [%x]. [%s]", txid, shdr.Creator, err)
308318
}
309319
}
310320

core/ledger/kvledger/history/historydb/historyleveldb/historyleveldb.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ func (historyDB *historyDB) Commit(block *common.Block) error {
106106
return err
107107
}
108108

109-
if common.HeaderType(payload.Header.ChannelHeader.Type) == common.HeaderType_ENDORSER_TRANSACTION {
109+
chdr, err := putils.UnmarshalChannelHeader(payload.Header.ChannelHeader)
110+
if err != nil {
111+
return err
112+
}
113+
114+
if common.HeaderType(chdr.Type) == common.HeaderType_ENDORSER_TRANSACTION {
110115

111116
// extract actions from the envelope message
112117
respPayload, err := putils.GetActionFromEnvelope(envBytes)

0 commit comments

Comments
 (0)