@@ -28,6 +28,15 @@ func init() {
2828 rand .Seed (time .Now ().UnixNano ())
2929}
3030
31+ // CCProposalType reflects transitions in the chaincode lifecycle
32+ type CCProposalType int
33+
34+ // Define chaincode proposal types
35+ const (
36+ Instantiate CCProposalType = iota
37+ Upgrade
38+ )
39+
3140// CreateTransaction create a transaction with proposal response, following the endorsement policy.
3241func (c * Channel ) CreateTransaction (resps []* apitxn.TransactionProposalResponse ) (* apitxn.Transaction , error ) {
3342 if len (resps ) == 0 {
@@ -163,59 +172,8 @@ func (c *Channel) SendInstantiateProposal(chaincodeName string,
163172 args [][]byte , chaincodePath string , chaincodeVersion string ,
164173 chaincodePolicy * common.SignaturePolicyEnvelope , targets []apitxn.ProposalProcessor ) ([]* apitxn.TransactionProposalResponse , apitxn.TransactionID , error ) {
165174
166- if chaincodeName == "" {
167- return nil , apitxn.TransactionID {}, errors .New ("chaincodeName is required" )
168- }
169- if chaincodePath == "" {
170- return nil , apitxn.TransactionID {}, errors .New ("chaincodePath is required" )
171- }
172- if chaincodeVersion == "" {
173- return nil , apitxn.TransactionID {}, errors .New ("chaincodeVersion is required" )
174- }
175- if chaincodePolicy == nil {
176- return nil , apitxn.TransactionID {}, errors .New ("chaincodePolicy is required" )
177- }
178-
179- // TODO: We should validate that targets are added to the channel.
180- if targets == nil || len (targets ) < 1 {
181- return nil , apitxn.TransactionID {}, errors .New ("missing peer objects for instantiate chaincode proposal" )
182- }
183-
184- ccds := & pb.ChaincodeDeploymentSpec {ChaincodeSpec : & pb.ChaincodeSpec {
185- Type : pb .ChaincodeSpec_GOLANG , ChaincodeId : & pb.ChaincodeID {Name : chaincodeName , Path : chaincodePath , Version : chaincodeVersion },
186- Input : & pb.ChaincodeInput {Args : args }}}
187-
188- if c .clientContext .UserContext () == nil {
189- return nil , apitxn.TransactionID {}, errors .New ("user context is nil" )
190- }
191- creator , err := c .clientContext .UserContext ().Identity ()
192- if err != nil {
193- return nil , apitxn.TransactionID {}, errors .Wrap (err , "getting user context's identity failed" )
194- }
195- chaincodePolicyBytes , err := protos_utils .Marshal (chaincodePolicy )
196- if err != nil {
197- return nil , apitxn.TransactionID {}, err
198- }
199- // create a proposal from a chaincodeDeploymentSpec
200- proposal , txID , err := protos_utils .CreateDeployProposalFromCDS (c .Name (), ccds , creator , chaincodePolicyBytes , []byte ("escc" ), []byte ("vscc" ))
201- if err != nil {
202- return nil , apitxn.TransactionID {}, errors .Wrap (err , "create chaincode deploy proposal failed" )
203- }
204-
205- signedProposal , err := c .signProposal (proposal )
206- if err != nil {
207- return nil , apitxn.TransactionID {}, err
208- }
209-
210- txnID := apitxn.TransactionID {ID : txID } // Nonce is missing
211-
212- transactionProposalResponse , err := txnproc .SendTransactionProposalToProcessors (& apitxn.TransactionProposal {
213- SignedProposal : signedProposal ,
214- Proposal : proposal ,
215- TxnID : txnID ,
216- }, targets )
175+ return c .sendCCProposal (Instantiate , chaincodeName , args , chaincodePath , chaincodeVersion , chaincodePolicy , targets )
217176
218- return transactionProposalResponse , txnID , err
219177}
220178
221179// SendUpgradeProposal sends an upgrade proposal to one or more endorsing peers.
@@ -227,6 +185,15 @@ func (c *Channel) SendUpgradeProposal(chaincodeName string,
227185 args [][]byte , chaincodePath string , chaincodeVersion string ,
228186 chaincodePolicy * common.SignaturePolicyEnvelope , targets []apitxn.ProposalProcessor ) ([]* apitxn.TransactionProposalResponse , apitxn.TransactionID , error ) {
229187
188+ return c .sendCCProposal (Upgrade , chaincodeName , args , chaincodePath , chaincodeVersion , chaincodePolicy , targets )
189+
190+ }
191+
192+ // helper function that sends an instantiate or upgrade chaincode proposal to one or more endorsing peers
193+ func (c * Channel ) sendCCProposal (ccProposalType CCProposalType , chaincodeName string ,
194+ args [][]byte , chaincodePath string , chaincodeVersion string ,
195+ chaincodePolicy * common.SignaturePolicyEnvelope , targets []apitxn.ProposalProcessor ) ([]* apitxn.TransactionProposalResponse , apitxn.TransactionID , error ) {
196+
230197 if chaincodeName == "" {
231198 return nil , apitxn.TransactionID {}, errors .New ("chaincodeName is required" )
232199 }
@@ -240,9 +207,8 @@ func (c *Channel) SendUpgradeProposal(chaincodeName string,
240207 return nil , apitxn.TransactionID {}, errors .New ("chaincodePolicy is required" )
241208 }
242209
243- // TODO: We should validate that targets are added to the channel.
244210 if targets == nil || len (targets ) < 1 {
245- return nil , apitxn.TransactionID {}, errors .New ("missing peer objects for upgrade chaincode proposal" )
211+ return nil , apitxn.TransactionID {}, errors .New ("missing peer objects for chaincode proposal" )
246212 }
247213
248214 ccds := & pb.ChaincodeDeploymentSpec {ChaincodeSpec : & pb.ChaincodeSpec {
@@ -260,10 +226,24 @@ func (c *Channel) SendUpgradeProposal(chaincodeName string,
260226 if err != nil {
261227 return nil , apitxn.TransactionID {}, err
262228 }
263- // create a proposal from a chaincodeDeploymentSpec
264- proposal , txID , err := protos_utils .CreateUpgradeProposalFromCDS (c .Name (), ccds , creator , chaincodePolicyBytes , []byte ("escc" ), []byte ("vscc" ))
265- if err != nil {
266- return nil , apitxn.TransactionID {}, errors .Wrap (err , "create chaincode upgrade proposal failed" )
229+
230+ var proposal * pb.Proposal
231+ var txID string
232+
233+ switch ccProposalType {
234+
235+ case Instantiate :
236+ proposal , txID , err = protos_utils .CreateDeployProposalFromCDS (c .Name (), ccds , creator , chaincodePolicyBytes , []byte ("escc" ), []byte ("vscc" ))
237+ if err != nil {
238+ return nil , apitxn.TransactionID {}, errors .Wrap (err , "create instantiate chaincode proposal failed" )
239+ }
240+ case Upgrade :
241+ proposal , txID , err = protos_utils .CreateUpgradeProposalFromCDS (c .Name (), ccds , creator , chaincodePolicyBytes , []byte ("escc" ), []byte ("vscc" ))
242+ if err != nil {
243+ return nil , apitxn.TransactionID {}, errors .Wrap (err , "create upgrade chaincode proposal failed" )
244+ }
245+ default :
246+ return nil , apitxn.TransactionID {}, errors .Errorf ("chaincode proposal type %d not supported" , ccProposalType )
267247 }
268248
269249 signedProposal , err := c .signProposal (proposal )
@@ -282,7 +262,7 @@ func (c *Channel) SendUpgradeProposal(chaincodeName string,
282262 return transactionProposalResponse , txnID , err
283263}
284264
285- // SignPayload ... TODO.
265+ // SignPayload signs payload
286266func (c * Channel ) SignPayload (payload []byte ) (* fab.SignedEnvelope , error ) {
287267 //Get user info
288268 user := c .clientContext .UserContext ()
0 commit comments