// 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() 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 viper.GetBool("security.enabled") { if devopsLogger.IsEnabledFor(logging.DEBUG) { devopsLogger.Debug("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.Debug("Creating secure transaction %s", transID) } tx, err = sec.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, transID) if nil != err { return nil, err } } else { if devopsLogger.IsEnabledFor(logging.DEBUG) { devopsLogger.Debug("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.Debug("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, err := util.GenerateUUID() if err != nil { return nil, nil, err } 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, utils.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 }
// DeployLocal deploys the supplied chaincode image to the local peer func DeployLocal(ctx context.Context, spec *protos.ChaincodeSpec, secCxt crypto.Peer) (*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 } 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) result, err := chaincode.Execute(ctx, chaincode.GetChain(chaincode.DefaultChain), transaction, secCxt) return transaction, result, err }
// DeployLocal deploys the supplied chaincode image to the local peer func DeployLocal(ctx context.Context, spec *protos.ChaincodeSpec) (*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 } 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 (client *clientImpl) createDeployTx(chaincodeDeploymentSpec *obc.ChaincodeDeploymentSpec, uuid string, nonce []byte) (*obc.Transaction, error) { // Create a new transaction tx, err := obc.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, uuid) if err != nil { client.error("Failed creating new transaction [%s].", err.Error()) return nil, err } // Copy metadata from ChaincodeSpec tx.Metadata = chaincodeDeploymentSpec.ChaincodeSpec.Metadata if nonce == nil { tx.Nonce, err = utils.GetRandomBytes(utils.NonceSize) if err != nil { client.error("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 = "1.2" // 3. encrypt tx err = client.encryptTx(tx) if err != nil { client.error("Failed encrypting payload [%s].", err.Error()) return nil, err } } return tx, nil }
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.CreateFreshDB(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}) 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)) }
// NewChaincodeDeployTransaction is used to deploy chaincode. func (client *clientImpl) NewChaincodeDeployTransaction(chaincodeDeploymentSpec *obc.ChaincodeDeploymentSpec, uuid string) (*obc.Transaction, error) { // Verify that the client is initialized if !client.isInitialized { return nil, utils.ErrNotInitialized } // Create a new transaction tx, err := obc.NewChaincodeDeployTransaction(chaincodeDeploymentSpec, uuid) if err != nil { client.node.log.Error("Failed creating new transaction [%s].", err.Error()) return nil, err } if chaincodeDeploymentSpec.ChaincodeSpec.ConfidentialityLevel == obc.ConfidentialityLevel_CONFIDENTIAL { // 1. set confidentiality level and nonce tx.ConfidentialityLevel = obc.ConfidentialityLevel_CONFIDENTIAL tx.Nonce, err = utils.GetRandomBytes(utils.NonceSize) if err != nil { client.node.log.Error("Failed creating nonce [%s].", err.Error()) return nil, err } // 2. encrypt tx err = client.encryptTx(tx) if err != nil { client.node.log.Error("Failed encrypting payload [%s].", err.Error()) return nil, err } } // Sign the transaction // Implement like this: getNextTCert returns only a TCert // Then, invoke signWithTCert to sign the signature // Get next available (not yet used) transaction certificate // with the relative signing key. rawTCert, err := client.getNextTCert() if err != nil { client.node.log.Error("Failed getting next transaction certificate [%s].", err.Error()) return nil, err } // Append the certificate to the transaction client.node.log.Debug("Appending certificate [%s].", utils.EncodeBase64(rawTCert)) tx.Cert = rawTCert // Sign the transaction and append the signature // 1. Marshall tx to bytes rawTx, err := proto.Marshal(tx) if err != nil { client.node.log.Error("Failed marshaling tx [%s].", err.Error()) return nil, err } // 2. Sign rawTx and check signature client.node.log.Debug("Signing tx [%s].", utils.EncodeBase64(rawTx)) rawSignature, err := client.signWithTCert(rawTCert, rawTx) if err != nil { client.node.log.Error("Failed creating signature [%s].", err.Error()) return nil, err } // 3. Append the signature tx.Signature = rawSignature client.node.log.Debug("Appending signature: [%s]", utils.EncodeBase64(rawSignature)) return tx, nil }