// ReSharper disable once UnusedMethodReturnValue.Local private static ChaincodeID DeployChaincode(HFClient client, Channel channel, string ccName, string ccPath, string ccVersion) { Util.COut("deployChaincode - enter"); ChaincodeID chaincodeID = null; try { string channelName = channel.Name; Util.COut("deployChaincode - channelName = " + channelName); IReadOnlyList <Orderer> orderers = channel.Orderers; List <ProposalResponse> responses; List <ProposalResponse> successful = new List <ProposalResponse>(); List <ProposalResponse> failed = new List <ProposalResponse>(); chaincodeID = new ChaincodeID().SetName(ccName).SetVersion(ccVersion).SetPath(ccPath); //////////////////////////// // Install Proposal Request // Util.COut("Creating install proposal"); InstallProposalRequest installProposalRequest = client.NewInstallProposalRequest(); installProposalRequest.SetChaincodeID(chaincodeID); ////For GO language and serving just a single user, chaincodeSource is mostly likely the users GOPATH installProposalRequest.SetChaincodeSourceLocation(Path.Combine(TEST_FIXTURES_PATH, "sdkintegration/gocc/sample1").Locate()); installProposalRequest.SetChaincodeVersion(ccVersion); Util.COut("Sending install proposal"); //////////////////////////// // only a client from the same org as the peer can issue an install request int numInstallProposal = 0; IReadOnlyList <Peer> peersFromOrg = channel.Peers; numInstallProposal = numInstallProposal + peersFromOrg.Count; responses = client.SendInstallProposal(installProposalRequest, peersFromOrg); foreach (ProposalResponse response in responses) { if (response.Status == ChaincodeResponse.ChaincodeResponseStatus.SUCCESS) { Util.COut("Successful install proposal response Txid: {0} from peer {1}", response.TransactionID, response.Peer.Name); successful.Add(response); } else { failed.Add(response); } } Util.COut("Received {0} install proposal responses. Successful+verified: {1} . Failed: {2}", numInstallProposal, successful.Count, failed.Count); if (failed.Count > 0) { ProposalResponse first = failed.First(); Assert.Fail($"Not enough endorsers for install : {successful.Count}. {first.Message}"); } /////////////// //// Instantiate chaincode. // // From the docs: // The instantiate transaction invokes the lifecycle System Chaincode (LSCC) to create and initialize a chaincode on a channel // After being successfully instantiated, the chaincode enters the active state on the channel and is ready to process any transaction proposals of type ENDORSER_TRANSACTION InstantiateProposalRequest instantiateProposalRequest = client.NewInstantiationProposalRequest(); instantiateProposalRequest.SetProposalWaitTime(testConfig.GetProposalWaitTime()); instantiateProposalRequest.SetChaincodeID(chaincodeID); instantiateProposalRequest.SetFcn("init"); instantiateProposalRequest.SetArgs("a", "500", "b", "999"); Dictionary <string, byte[]> tm = new Dictionary <string, byte[]>(); tm.Add("HyperLedgerFabric", "InstantiateProposalRequest:JavaSDK".ToBytes()); tm.Add("method", "InstantiateProposalRequest".ToBytes()); instantiateProposalRequest.SetTransientMap(tm); /* * policy OR(Org1MSP.member, Org2MSP.member) meaning 1 signature from someone in either Org1 or Org2 * See README.md Chaincode endorsement policies section for more details. */ ChaincodeEndorsementPolicy chaincodeEndorsementPolicy = new ChaincodeEndorsementPolicy(); chaincodeEndorsementPolicy.FromYamlFile(Path.Combine(TEST_FIXTURES_PATH, "sdkintegration/chaincodeendorsementpolicy.yaml").Locate()); instantiateProposalRequest.SetChaincodeEndorsementPolicy(chaincodeEndorsementPolicy); Util.COut("Sending instantiateProposalRequest to all peers..."); successful.Clear(); failed.Clear(); responses = channel.SendInstantiationProposal(instantiateProposalRequest); foreach (ProposalResponse response in responses) { if (response.IsVerified && response.Status == ChaincodeResponse.ChaincodeResponseStatus.SUCCESS) { successful.Add(response); Util.COut("Succesful instantiate proposal response Txid:{0} from peer {1}", response.TransactionID, response.Peer.Name); } else { failed.Add(response); } } Util.COut("Received {0} instantiate proposal responses. Successful+verified: {1} . Failed: {2}", responses.Count, successful.Count, failed.Count); if (failed.Count > 0) { ProposalResponse first = failed.First(); Assert.Fail($"Not enough endorsers for instantiate :{successful.Count} endorser failed with {first.Message}. Was verified:{first.IsVerified}"); } /////////////// // Send instantiate transaction to orderer Util.COut("Sending instantiateTransaction to orderer..."); Util.COut("calling get..."); TransactionEvent evnt = channel.SendTransaction(successful, orderers, 30 * 1000); Util.COut("get done..."); Assert.IsTrue(evnt.IsValid); // must be valid to be here. Util.COut("Finished instantiate transaction with transaction id {0}", evnt.TransactionID); } catch (System.Exception e) { Util.COut("Caught an exception running channel {0}", channel.Name); Assert.Fail($"Test failed with error : {e.Message}"); } return(chaincodeID); }
// Disable MethodLength as this method is for instructional purposes and hence // we don't want to split it into smaller pieces // CHECKSTYLE:OFF: MethodLength private void RunChannel(HFClient client, Channel channel, SampleOrg sampleOrg, int delta) { string channelName = channel.Name; try { client.UserContext = sampleOrg.GetUser(TESTUSER_1_NAME); Util.COut("Running Channel %s with a delta %d", channelName, delta); Util.COut("ChaincodeID: ", chaincodeID); client.UserContext = sampleOrg.PeerAdmin; /////////////// //// InstallProposalRequest installProposalRequest = client.NewInstallProposalRequest(); installProposalRequest.SetChaincodeID(chaincodeID); ////For GO language and serving just a single user, chaincodeSource is mostly likely the users GOPATH installProposalRequest.SetChaincodeSourceLocation(Path.Combine(TEST_FIXTURES_PATH, CHAIN_CODE_FILEPATH).Locate()); installProposalRequest.SetChaincodeVersion(CHAIN_CODE_VERSION); installProposalRequest.SetProposalWaitTime(testConfig.GetProposalWaitTime()); installProposalRequest.SetChaincodeLanguage(CHAIN_CODE_LANG); Util.COut("Sending install proposal for channel: %s", channel.Name); //////////////////////////// // only a client from the same org as the peer can issue an install request int numInstallProposal = 0; List <ProposalResponse> responses; List <ProposalResponse> successful = new List <ProposalResponse>(); List <ProposalResponse> failed = new List <ProposalResponse>(); List <Peer> peersFromOrg = channel.Peers.ToList(); numInstallProposal = numInstallProposal + peersFromOrg.Count; responses = client.SendInstallProposal(installProposalRequest, peersFromOrg); foreach (ProposalResponse response in responses) { if (response.Status == ChaincodeResponse.ChaincodeResponseStatus.SUCCESS) { Util.COut("Successful install proposal response Txid: %s from peer %s", response.TransactionID, response.Peer.Name); successful.Add(response); } else { failed.Add(response); } } Util.COut("Received %d install proposal responses. Successful+verified: %d . Failed: %d", numInstallProposal, successful.Count, failed.Count); if (failed.Count > 0) { ProposalResponse first = failed.First(); Assert.Fail("Not enough endorsers for install :" + successful.Count + ". " + first.Message); } InstantiateProposalRequest instantiateProposalRequest = client.NewInstantiationProposalRequest(); instantiateProposalRequest.SetChaincodeID(chaincodeID); instantiateProposalRequest.SetProposalWaitTime(DEPLOYWAITTIME); instantiateProposalRequest.SetFcn("init"); instantiateProposalRequest.SetArgs(new string[] { }); instantiateProposalRequest.SetChaincodeCollectionConfiguration(ChaincodeCollectionConfiguration.FromYamlFile("fixture/collectionProperties/PrivateDataIT.yaml".Locate())); Util.COut("Sending instantiate proposal"); List <ProposalResponse> responses2; responses2 = channel.SendInstantiationProposal(instantiateProposalRequest); successful.Clear(); failed.Clear(); foreach (ProposalResponse response in responses2) { if (response.Status == ChaincodeResponse.ChaincodeResponseStatus.SUCCESS) { Util.COut("Successful upgrade proposal response Txid: %s from peer %s", response.TransactionID, response.Peer.Name); successful.Add(response); } else { failed.Add(response); } } Util.COut("Received %d upgrade proposal responses. Successful+verified: %d . Failed: %d", channel.Peers.Count, successful.Count, failed.Count); if (failed.Count > 0) { ProposalResponse first = failed.First(); Assert.Fail("Not enough endorsers for upgrade :" + successful.Count + ". " + first.Message); } Util.COut("Sending instantiate proposal to orderer."); channel.SendTransaction(successful, sampleOrg.PeerAdmin); Util.COut("instantiate proposal completed."); //Now lets run the new chaincode which should *double* the results we asked to move. // return setAmount(client, channel, chaincodeID, "50", null).get(testConfig.getTransactionWaitTime(), TimeUnit.SECONDS); SetAmount(client, channel, chaincodeID, 50, null); Util.COut("Got back acknowledgement from setAmount from all peers."); WaitOnFabric(10000); Util.COut("delta is %s", delta); QueryChaincodeForExpectedValue(client, channel, "" + 250, chaincodeID); //Now lets run the new chaincode which should *double* the results we asked to move. MoveAmount(client, channel, chaincodeID, "50", null); } catch (TransactionEventException e) { TransactionEvent te = e.TransactionEvent; Assert.Fail($"Transaction with txid %s failed. %s", te.TransactionID, e.Message); } catch (System.Exception e) { Assert.Fail($"Test failed with {e.Message} exception {e}"); } QueryChaincodeForExpectedValue(client, channel, "" + 300, chaincodeID); Util.COut("Running for Channel %s done", channelName); }