@@ -21,7 +21,6 @@ import (
21
21
"github.com/hyperledger/fabric-sdk-go/pkg/logging"
22
22
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common"
23
23
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
24
- protos_utils "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/utils"
25
24
)
26
25
27
26
var logger = logging .NewLogger ("fabric_sdk_go" )
@@ -70,21 +69,47 @@ func (c *Resource) SignChannelConfig(config []byte, signer fab.IdentityContext)
70
69
71
70
// CreateChannel calls the orderer to start building the new channel.
72
71
func (c * Resource ) CreateChannel (request fab.CreateChannelRequest ) (fab.TransactionID , error ) {
73
- haveEnvelope := false
72
+ if request .Orderer == nil {
73
+ return fab.TransactionID {}, errors .New ("missing orderer request parameter for the initialize channel" )
74
+ }
75
+
76
+ if request .Name == "" {
77
+ return fab.TransactionID {}, errors .New ("missing name request parameter for the new channel" )
78
+ }
79
+
74
80
if request .Envelope != nil {
75
- logger .Debug ("createChannel - have envelope" )
76
- haveEnvelope = true
81
+ return c .createChannelFromEnvelope (request )
77
82
}
78
83
79
- if ! haveEnvelope && request .TxnID .ID == "" {
80
- txnID , err := txn .NewID (c .clientContext )
81
- if err != nil {
82
- return txnID , err
83
- }
84
- request .TxnID = txnID
84
+ if request .Config == nil {
85
+ return fab.TransactionID {}, errors .New ("missing envelope request parameter containing the configuration of the new channel" )
85
86
}
86
87
87
- return request .TxnID , c .createOrUpdateChannel (request , haveEnvelope )
88
+ if request .Signatures == nil {
89
+ return fab.TransactionID {}, errors .New ("missing signatures request parameter for the new channel" )
90
+ }
91
+
92
+ txnID , err := txn .NewID (c .clientContext )
93
+ if err != nil {
94
+ return txnID , err
95
+ }
96
+
97
+ return txnID , c .createOrUpdateChannel (txnID , request )
98
+ }
99
+
100
+ // TODO: this function was extracted from createOrUpdateChannel, but needs a closer examination.
101
+ func (c * Resource ) createChannelFromEnvelope (request fab.CreateChannelRequest ) (fab.TransactionID , error ) {
102
+ env , err := c .extractSignedEnvelope (request .Envelope )
103
+ if err != nil {
104
+ return fab.TransactionID {}, errors .WithMessage (err , "signed envelope not valid" )
105
+ }
106
+
107
+ // Send request
108
+ _ , err = request .Orderer .SendBroadcast (env )
109
+ if err != nil {
110
+ return fab.TransactionID {}, errors .WithMessage (err , "failed broadcast to orderer" )
111
+ }
112
+ return fab.TransactionID {}, nil
88
113
}
89
114
90
115
// GenesisBlockFromOrderer returns the genesis block from the defined orderer that may be
@@ -107,6 +132,10 @@ func (c *Resource) GenesisBlockFromOrderer(channelName string, orderer fab.Order
107
132
Stop : seekStop ,
108
133
Behavior : ab .SeekInfo_BLOCK_UNTIL_READY ,
109
134
}
135
+ seekInfoBytes , err := proto .Marshal (seekInfo )
136
+ if err != nil {
137
+ return nil , errors .Wrap (err , "marshaling of seek info header failed" )
138
+ }
110
139
111
140
tlsCertHash := ccomm .TLSCertHash (c .clientContext .Config ())
112
141
channelHeaderOpts := txn.ChannelHeaderOpts {
@@ -116,24 +145,15 @@ func (c *Resource) GenesisBlockFromOrderer(channelName string, orderer fab.Order
116
145
}
117
146
seekInfoHeader , err := txn .CreateChannelHeader (common .HeaderType_DELIVER_SEEK_INFO , channelHeaderOpts )
118
147
if err != nil {
119
- return nil , errors .Wrap (err , "BuildChannelHeader failed" )
120
- }
121
- seekHeader , err := txn .CreateHeader (c .clientContext , seekInfoHeader , txnID )
122
- if err != nil {
123
- return nil , errors .Wrap (err , "BuildHeader failed" )
124
- }
125
- seekPayload := & common.Payload {
126
- Header : seekHeader ,
127
- Data : protos_utils .MarshalOrPanic (seekInfo ),
148
+ return nil , errors .Wrap (err , "CreateChannelHeader failed" )
128
149
}
129
- seekPayloadBytes := protos_utils .MarshalOrPanic (seekPayload )
130
150
131
- signedEnvelope , err := txn .SignPayload ( c . clientContext , seekPayloadBytes )
151
+ payload , err := txn .CreatePayload ( txnID , seekInfoHeader , seekInfoBytes )
132
152
if err != nil {
133
- return nil , errors .WithMessage (err , "SignPayload failed" )
153
+ return nil , errors .Wrap (err , "CreatePayload failed" )
134
154
}
135
155
136
- block , err := txn .SendEnvelope (c .clientContext , signedEnvelope , orderers )
156
+ block , err := txn .SendPayload (c .clientContext , payload , orderers )
137
157
if err != nil {
138
158
return nil , errors .WithMessage (err , "SendEnvelope failed" )
139
159
}
@@ -168,101 +188,50 @@ func (c *Resource) JoinChannel(request fab.JoinChannelRequest) error {
168
188
return err
169
189
}
170
190
171
- // createOrUpdateChannel creates a new channel or updates an existing channel.
172
- func ( c * Resource ) createOrUpdateChannel ( request fab. CreateChannelRequest , haveEnvelope bool ) error {
173
- // Validate request
174
- if request . Config == nil && ! haveEnvelope {
175
- return errors .New ( "missing envelope request parameter containing the configuration of the new channel " )
191
+ func ( c * Resource ) extractSignedEnvelope ( reqEnvelope [] byte ) ( * fab. SignedEnvelope , error ) {
192
+ envelope := & common. Envelope {}
193
+ err := proto . Unmarshal ( reqEnvelope , envelope )
194
+ if err != nil {
195
+ return nil , errors .Wrap ( err , "unmarshal request envelope failed " )
176
196
}
177
-
178
- if request . Signatures == nil && ! haveEnvelope {
179
- return errors . New ( "missing signatures request parameter for the new channel" )
197
+ se := fab. SignedEnvelope {
198
+ Signature : envelope . Signature ,
199
+ Payload : envelope . Payload ,
180
200
}
201
+ return & se , nil
202
+ }
181
203
182
- if request .TxnID .ID == "" && ! haveEnvelope {
183
- return errors .New ("txId required" )
184
- }
204
+ // createOrUpdateChannel creates a new channel or updates an existing channel.
205
+ func (c * Resource ) createOrUpdateChannel (txnID fab.TransactionID , request fab.CreateChannelRequest ) error {
185
206
186
- if request .TxnID .Nonce == nil && ! haveEnvelope {
187
- return errors .New ("nonce required" )
207
+ configUpdateEnvelope := & common.ConfigUpdateEnvelope {
208
+ ConfigUpdate : request .Config ,
209
+ Signatures : request .Signatures ,
188
210
}
189
-
190
- if request . Orderer = = nil {
191
- return errors .New ( "missing orderer request parameter for the initialize channel " )
211
+ configUpdateEnvelopeBytes , err := proto . Marshal ( configUpdateEnvelope )
212
+ if err ! = nil {
213
+ return errors .Wrap ( err , "marshal configUpdateEnvelope failed " )
192
214
}
193
215
194
- if request .Name == "" {
195
- return errors .New ("missing name request parameter for the new channel" )
216
+ channelHeaderOpts := txn.ChannelHeaderOpts {
217
+ ChannelID : request .Name ,
218
+ TxnID : txnID ,
219
+ TLSCertHash : ccomm .TLSCertHash (c .clientContext .Config ()),
196
220
}
197
-
198
- // channel = null;
199
- var signature []byte
200
- var payloadBytes []byte
201
-
202
- if haveEnvelope {
203
- logger .Debug ("createOrUpdateChannel - have envelope" )
204
- envelope := & common.Envelope {}
205
- err := proto .Unmarshal (request .Envelope , envelope )
206
- if err != nil {
207
- return errors .Wrap (err , "unmarshal request envelope failed" )
208
- }
209
- signature = envelope .Signature
210
- payloadBytes = envelope .Payload
211
- } else {
212
- logger .Debug ("createOrUpdateChannel - have config_update" )
213
- configUpdateEnvelope := & common.ConfigUpdateEnvelope {
214
- ConfigUpdate : request .Config ,
215
- Signatures : request .Signatures ,
216
- }
217
-
218
- // TODO: Move
219
- channelHeaderOpts := txn.ChannelHeaderOpts {
220
- ChannelID : request .Name ,
221
- TxnID : request .TxnID ,
222
- TLSCertHash : ccomm .TLSCertHash (c .clientContext .Config ()),
223
- }
224
- channelHeader , err := txn .CreateChannelHeader (common .HeaderType_CONFIG_UPDATE , channelHeaderOpts )
225
- if err != nil {
226
- return errors .WithMessage (err , "BuildChannelHeader failed" )
227
- }
228
-
229
- header , err := txn .CreateHeader (c .clientContext , channelHeader , request .TxnID )
230
- if err != nil {
231
- return errors .Wrap (err , "BuildHeader failed" )
232
- }
233
- configUpdateEnvelopeBytes , err := proto .Marshal (configUpdateEnvelope )
234
- if err != nil {
235
- return errors .Wrap (err , "marshal configUpdateEnvelope failed" )
236
- }
237
- payload := & common.Payload {
238
- Header : header ,
239
- Data : configUpdateEnvelopeBytes ,
240
- }
241
- payloadBytes , err = proto .Marshal (payload )
242
- if err != nil {
243
- return errors .Wrap (err , "marshal payload failed" )
244
- }
245
-
246
- signingMgr := c .clientContext .SigningManager ()
247
- if signingMgr == nil {
248
- return errors .New ("signing manager is nil" )
249
- }
250
-
251
- signature , err = signingMgr .Sign (payloadBytes , c .clientContext .PrivateKey ())
252
- if err != nil {
253
- return errors .WithMessage (err , "signing payload failed" )
254
- }
221
+ channelHeader , err := txn .CreateChannelHeader (common .HeaderType_CONFIG_UPDATE , channelHeaderOpts )
222
+ if err != nil {
223
+ return errors .WithMessage (err , "CreateChannelHeader failed" )
255
224
}
256
225
257
- // Send request
258
- _ , err := request .Orderer .SendBroadcast (& fab.SignedEnvelope {
259
- Signature : signature ,
260
- Payload : payloadBytes ,
261
- })
226
+ payload , err := txn .CreatePayload (txnID , channelHeader , configUpdateEnvelopeBytes )
262
227
if err != nil {
263
- return errors .WithMessage (err , "failed broadcast to orderer " )
228
+ return errors .WithMessage (err , "CreatePayload failed " )
264
229
}
265
230
231
+ _ , err = txn .BroadcastPayload (c .clientContext , payload , []fab.Orderer {request .Orderer })
232
+ if err != nil {
233
+ return errors .WithMessage (err , "SendEnvelope failed" )
234
+ }
266
235
return nil
267
236
}
268
237
0 commit comments