// Deploy a chaincode - i.e., build and initialize. func deploy(ctx context.Context, spec *pb.ChaincodeSpec) ([]byte, error) { // First build and get the deployment spec chaincodeDeploymentSpec, err := getDeploymentSpec(ctx, spec) if err != nil { return nil, err } tid := chaincodeDeploymentSpec.ChaincodeSpec.ChaincodeID.Name // Now create the Transactions message and send to Peer. transaction, err := pb.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, tid) if err != nil { return nil, fmt.Errorf("Error deploying chaincode: %s ", err) } ledger, err := ledger.GetLedger() if err != nil { return nil, fmt.Errorf("Failed to get handle to ledger: %s ", err) } ledger.BeginTxBatch("1") b, err := Execute(ctx, GetChain(DefaultChain), transaction) if err != nil { return nil, fmt.Errorf("Error deploying chaincode: %s", err) } ledger.CommitTxBatch("1", []*pb.Transaction{transaction}, nil, nil) return b, err }
// Deploy deploys the supplied chaincode image to the validators through a transaction func (d *Devops) Deploy(ctx context.Context, spec *pb.ChaincodeSpec) (*pb.ChaincodeDeploymentSpec, error) { // get the deployment spec chaincodeDeploymentSpec, err := d.getChaincodeBytes(ctx, spec) if err != nil { devopsLogger.Error(fmt.Sprintf("Error deploying chaincode spec: %v\n\n error: %s", spec, err)) return nil, err } // Now create the Transactions message and send to Peer. transID := chaincodeDeploymentSpec.ChaincodeSpec.ChaincodeID.Name var tx *pb.Transaction var sec crypto.Client if peer.SecurityEnabled() { if devopsLogger.IsEnabledFor(logging.DEBUG) { devopsLogger.Debugf("Initializing secure devops using context %s", spec.SecureContext) } sec, err = crypto.InitClient(spec.SecureContext, nil) defer crypto.CloseClient(sec) // remove the security context since we are no longer need it down stream spec.SecureContext = "" if nil != err { return nil, err } if devopsLogger.IsEnabledFor(logging.DEBUG) { devopsLogger.Debugf("Creating secure transaction %s", transID) } tx, err = sec.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, transID, spec.Attributes...) if nil != err { return nil, err } } else { if devopsLogger.IsEnabledFor(logging.DEBUG) { devopsLogger.Debugf("Creating deployment transaction (%s)", transID) } tx, err = pb.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, transID) if err != nil { return nil, fmt.Errorf("Error deploying chaincode: %s ", err) } } if devopsLogger.IsEnabledFor(logging.DEBUG) { devopsLogger.Debugf("Sending deploy transaction (%s) to validator", tx.Uuid) } resp := d.coord.ExecuteTransaction(tx) if resp.Status == pb.Response_FAILURE { err = fmt.Errorf(string(resp.Msg)) } return chaincodeDeploymentSpec, err }
func createConfidentialECertHDeployTransaction(t *testing.T) (*obc.Transaction, *obc.Transaction, error) { uuid := util.GenerateUUID() cds := &obc.ChaincodeDeploymentSpec{ ChaincodeSpec: &obc.ChaincodeSpec{ Type: obc.ChaincodeSpec_GOLANG, ChaincodeID: &obc.ChaincodeID{Path: "Contract001"}, CtorMsg: nil, ConfidentialityLevel: obc.ConfidentialityLevel_CONFIDENTIAL, }, EffectiveDate: nil, CodePackage: nil, } otx, err := obc.NewChaincodeDeployTransaction(cds, uuid) if err != nil { return nil, nil, err } handler, err := deployer.GetEnrollmentCertificateHandler() if err != nil { return nil, nil, err } txHandler, err := handler.GetTransactionHandler() if err != nil { return nil, nil, err } tx, err := txHandler.NewChaincodeDeployTransaction(cds, uuid) // Check binding consistency binding, _ := txHandler.GetBinding() if !reflect.DeepEqual(binding, primitives.Hash(append(handler.GetCertificate(), tx.Nonce...))) { t.Fatal("Binding is malformed!") } // Check confidentiality level if tx.ConfidentialityLevel != cds.ChaincodeSpec.ConfidentialityLevel { t.Fatal("Failed setting confidentiality level") } // Check metadata if !reflect.DeepEqual(cds.ChaincodeSpec.Metadata, tx.Metadata) { t.Fatal("Failed copying metadata") } return otx, tx, err }
func (client *clientImpl) createDeployTx(chaincodeDeploymentSpec *obc.ChaincodeDeploymentSpec, uuid string, nonce []byte, tCert tCert, attrs ...string) (*obc.Transaction, error) { // Create a new transaction tx, err := obc.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, uuid) if err != nil { client.Errorf("Failed creating new transaction [%s].", err.Error()) return nil, err } // Copy metadata from ChaincodeSpec tx.Metadata, err = getMetadata(chaincodeDeploymentSpec.GetChaincodeSpec(), tCert, attrs...) if err != nil { client.Errorf("Failed creating new transaction [%s].", err.Error()) return nil, err } if nonce == nil { tx.Nonce, err = primitives.GetRandomNonce() if err != nil { client.Errorf("Failed creating nonce [%s].", err.Error()) return nil, err } } else { // TODO: check that it is a well formed nonce tx.Nonce = nonce } // Handle confidentiality if chaincodeDeploymentSpec.ChaincodeSpec.ConfidentialityLevel == obc.ConfidentialityLevel_CONFIDENTIAL { // 1. set confidentiality level and nonce tx.ConfidentialityLevel = obc.ConfidentialityLevel_CONFIDENTIAL // 2. set confidentiality protocol version tx.ConfidentialityProtocolVersion = client.conf.GetConfidentialityProtocolVersion() // 3. encrypt tx err = client.encryptTx(tx) if err != nil { client.Errorf("Failed encrypting payload [%s].", err.Error()) return nil, err } } return tx, nil }
// deployLocal deploys the supplied chaincode image to the local peer func deploySysCC(ctx context.Context, spec *protos.ChaincodeSpec) error { // First build and get the deployment spec chaincodeDeploymentSpec, err := buildSysCC(ctx, spec) if err != nil { sysccLogger.Error(fmt.Sprintf("Error deploying chaincode spec: %v\n\n error: %s", spec, err)) return err } transaction, err := protos.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, chaincodeDeploymentSpec.ChaincodeSpec.ChaincodeID.Name) if err != nil { return fmt.Errorf("Error deploying chaincode: %s ", err) } _, _, err = chaincode.Execute(ctx, chaincode.GetChain(chaincode.DefaultChain), transaction) return err }
func createPublicDeployTransaction(t *testing.T) (*obc.Transaction, *obc.Transaction, error) { uuid := util.GenerateUUID() cds := &obc.ChaincodeDeploymentSpec{ ChaincodeSpec: &obc.ChaincodeSpec{ Type: obc.ChaincodeSpec_GOLANG, ChaincodeID: &obc.ChaincodeID{Path: "Contract001"}, CtorMsg: nil, ConfidentialityLevel: obc.ConfidentialityLevel_PUBLIC, }, EffectiveDate: nil, CodePackage: nil, } otx, err := obc.NewChaincodeDeployTransaction(cds, uuid) if err != nil { return nil, nil, err } tx, err := deployer.NewChaincodeDeployTransaction(cds, uuid) return otx, tx, err }
func TestBlockChain_SingleBlock(t *testing.T) { testDBWrapper.CleanDB(t) blockchainTestWrapper := newTestBlockchainWrapper(t) blockchain := blockchainTestWrapper.blockchain // Create the Chaincode specification chaincodeSpec := &protos.ChaincodeSpec{Type: protos.ChaincodeSpec_GOLANG, ChaincodeID: &protos.ChaincodeID{Path: "Contracts"}, CtorMsg: &protos.ChaincodeInput{Function: "Initialize", Args: []string{"param1"}}} chaincodeDeploymentSepc := &protos.ChaincodeDeploymentSpec{ChaincodeSpec: chaincodeSpec} uuid := testutil.GenerateUUID(t) newChaincodeTx, err := protos.NewChaincodeDeployTransaction(chaincodeDeploymentSepc, uuid) testutil.AssertNoError(t, err, "Failed to create new chaincode Deployment Transaction") t.Logf("New chaincode tx: %v", newChaincodeTx) block1 := protos.NewBlock([]*protos.Transaction{newChaincodeTx}, nil) blockNumber := blockchainTestWrapper.addNewBlock(block1, []byte("stateHash1")) t.Logf("New chain: %v", blockchain) testutil.AssertEquals(t, blockNumber, uint64(0)) testutil.AssertEquals(t, blockchain.getSize(), uint64(1)) testutil.AssertEquals(t, blockchainTestWrapper.fetchBlockchainSizeFromDB(), uint64(1)) }
// DeployLocal deploys the supplied chaincode image to the local peer func DeployLocal(ctx context.Context, spec *protos.ChaincodeSpec, gbexists bool) (*protos.Transaction, []byte, error) { // First build and get the deployment spec chaincodeDeploymentSpec, err := BuildLocal(ctx, spec) if err != nil { genesisLogger.Error(fmt.Sprintf("Error deploying chaincode spec: %v\n\n error: %s", spec, err)) return nil, nil, err } var transaction *protos.Transaction if gbexists { ledger, err := ledger.GetLedger() if err != nil { return nil, nil, fmt.Errorf("Failed to get handle to ledger (%s)", err) } transaction, err = ledger.GetTransactionByUUID(chaincodeDeploymentSpec.ChaincodeSpec.ChaincodeID.Name) if err != nil { genesisLogger.Warning(fmt.Sprintf("cannot get deployment transaction for %s - %s", chaincodeDeploymentSpec.ChaincodeSpec.ChaincodeID.Name, err)) transaction = nil } else { genesisLogger.Debug("deployment transaction for %s exists", chaincodeDeploymentSpec.ChaincodeSpec.ChaincodeID.Name) } } if transaction == nil { transaction, err = protos.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, chaincodeDeploymentSpec.ChaincodeSpec.ChaincodeID.Name) if err != nil { return nil, nil, fmt.Errorf("Error deploying chaincode: %s ", err) } } //chaincode.NewChaincodeSupport(chaincode.DefaultChain, peer.GetPeerEndpoint, false, 120000) // The secHelper is set during creat ChaincodeSupport, so we don't need this step //ctx = context.WithValue(ctx, "security", secCxt) result, err := chaincode.Execute(ctx, chaincode.GetChain(chaincode.DefaultChain), transaction) return transaction, result, err }
func createDeployTransaction(dspec *pb.ChaincodeDeploymentSpec, uuid string) (*pb.Transaction, error) { var tx *pb.Transaction var err error var sec crypto.Client if dspec.ChaincodeSpec.SecureContext != "" { sec, err = crypto.InitClient(dspec.ChaincodeSpec.SecureContext, nil) defer crypto.CloseClient(sec) if nil != err { return nil, err } tx, err = sec.NewChaincodeDeployTransaction(dspec, uuid) if nil != err { return nil, err } } else { tx, err = pb.NewChaincodeDeployTransaction(dspec, uuid) if err != nil { return nil, fmt.Errorf("Error deploying chaincode: %s ", err) } } return tx, nil }