// ReSharper disable once UnusedMethodReturnValue.Local private TransactionEvent MoveAmount(HFClient client, Channel channel, ChaincodeID chaincdeID, string moveAmount, IUser user) { List <ProposalResponse> successful = new List <ProposalResponse>(); List <ProposalResponse> failed = new List <ProposalResponse>(); /////////////// // Send transaction proposal to all peers TransactionProposalRequest transactionProposalRequest = client.NewTransactionProposalRequest(); transactionProposalRequest.SetChaincodeID(chaincdeID); transactionProposalRequest.SetFcn("move"); // Private data needs to be sent via Transient field to prevent identifiable //information being sent to the orderer. Dictionary <string, byte[]> transientMap = new Dictionary <string, byte[]>(); transientMap["A"] = "a".ToBytes(); //test using bytes .. end2end uses Strings. transientMap["B"] = "b".ToBytes(); transientMap["moveAmount"] = moveAmount.ToBytes(); transactionProposalRequest.TransientMap = transientMap; transactionProposalRequest.SetProposalWaitTime(testConfig.GetProposalWaitTime()); if (user != null) { // specific user use that transactionProposalRequest.SetUserContext(user); } Util.COut("sending transaction proposal to all peers with arguments: move(a,b,%s)", moveAmount); List <ProposalResponse> invokePropResp = channel.SendTransactionProposal(transactionProposalRequest); foreach (ProposalResponse response in invokePropResp) { if (response.Status == ChaincodeResponse.ChaincodeResponseStatus.SUCCESS) { Util.COut("Successful transaction proposal response Txid: %s from peer %s", response.TransactionID, response.Peer.Name); successful.Add(response); } else { failed.Add(response); } } Util.COut("Received %d transaction proposal responses for moveAmount. Successful+verified: %d . Failed: %d", invokePropResp.Count, successful.Count, failed.Count); if (failed.Count > 0) { ProposalResponse firstTransactionProposalResponse = failed.First(); throw new ProposalException($"Not enough endorsers for invoke(move a,b,{moveAmount}):{firstTransactionProposalResponse.Status} endorser error:{firstTransactionProposalResponse.Message}. Was verified:{firstTransactionProposalResponse.IsVerified}"); } Util.COut("Successfully received transaction proposal responses."); //////////////////////////// // Send transaction to orderer Util.COut("Sending chaincode transaction(move a,b,%s) to orderer.", moveAmount); if (user != null) { return(channel.SendTransaction(successful, user)); } return(channel.SendTransaction(successful)); }
// ReSharper disable once UnusedMethodReturnValue.Local private static TransactionEvent MoveAmount(HFClient client, Channel channel, ChaincodeID chaincodeID, string from, string to, string moveAmount, IUser user) { List <ProposalResponse> successful = new List <ProposalResponse>(); List <ProposalResponse> failed = new List <ProposalResponse>(); /////////////// // Send transaction proposal to all peers TransactionProposalRequest transactionProposalRequest = client.NewTransactionProposalRequest(); transactionProposalRequest.SetChaincodeID(chaincodeID); transactionProposalRequest.SetFcn("move"); transactionProposalRequest.SetArgs(from, to, moveAmount); transactionProposalRequest.SetProposalWaitTime(testConfig.GetProposalWaitTime()); if (user != null) { // specific user use that transactionProposalRequest.SetUserContext(user); } Util.COut("sending transaction proposal to all peers with arguments: move(%s,%s,%s)", from, to, moveAmount); List <ProposalResponse> invokePropResp = channel.SendTransactionProposal(transactionProposalRequest); foreach (ProposalResponse response in invokePropResp) { if (response.Status == ChaincodeResponse.ChaincodeResponseStatus.SUCCESS) { Util.COut("Successful transaction proposal response Txid: {0} from peer {1}", response.TransactionID, response.Peer.Name); successful.Add(response); } else { failed.Add(response); } } // Check that all the proposals are consistent with each other. We should have only one set // where all the proposals above are consistent. List <HashSet <ProposalResponse> > proposalConsistencySets = SDKUtils.GetProposalConsistencySets(invokePropResp); if (proposalConsistencySets.Count != 1) { Assert.Fail($"Expected only one set of consistent move proposal responses but got {proposalConsistencySets.Count}"); } Util.COut("Received {0} transaction proposal responses. Successful+verified: {1} . Failed: {2}", invokePropResp.Count, successful.Count, failed.Count); if (failed.Count > 0) { ProposalResponse firstTransactionProposalResponse = failed.First(); throw new ProposalException($"Not enough endorsers for invoke(move {from},{to},{moveAmount}):{firstTransactionProposalResponse.Status} endorser error:{firstTransactionProposalResponse.Message}. Was verified:{firstTransactionProposalResponse.IsVerified}"); } Util.COut("Successfully received transaction proposal responses."); //////////////////////////// // Send transaction to orderer Util.COut("Sending chaincode transaction(move %s,%s,%s) to orderer.", from, to, moveAmount); if (user != null) { return(channel.SendTransaction(successful, user, testConfig.GetTransactionWaitTime() * 1000)); } return(channel.SendTransaction(successful, testConfig.GetTransactionWaitTime() * 1000)); }
// ReSharper disable once UnusedMethodReturnValue.Local private TransactionEvent SetAmount(HFClient client, Channel channel, ChaincodeID chaincdeID, int delta, IUser user) { List <ProposalResponse> successful = new List <ProposalResponse>(); List <ProposalResponse> failed = new List <ProposalResponse>(); /////////////// // Send transaction proposal to all peers TransactionProposalRequest transactionProposalRequest = client.NewTransactionProposalRequest(); transactionProposalRequest.SetChaincodeID(chaincdeID); transactionProposalRequest.SetFcn("set"); Dictionary <string, byte[]> transientMap = new Dictionary <string, byte[]>(); transientMap["A"] = "a".ToBytes(); // test using bytes as args. End2end uses Strings. transientMap["AVal"] = "500".ToBytes(); transientMap["B"] = "b".ToBytes(); string arg3 = "" + (200 + delta); transientMap["BVal"] = arg3.ToBytes(); transactionProposalRequest.TransientMap = transientMap; transactionProposalRequest.SetProposalWaitTime(testConfig.GetProposalWaitTime()); if (user != null) { // specific user use that transactionProposalRequest.SetUserContext(user); } List <ProposalResponse> invokePropResp = channel.SendTransactionProposal(transactionProposalRequest); foreach (ProposalResponse response in invokePropResp) { if (response.Status == ChaincodeResponse.ChaincodeResponseStatus.SUCCESS) { Util.COut("Successful transaction proposal response Txid: %s from peer %s", response.TransactionID, response.Peer.Name); successful.Add(response); } else { failed.Add(response); } } Util.COut("Received %d transaction proposal responses for setAmount. Successful+verified: %d . Failed: %d", invokePropResp.Count, successful.Count, failed.Count); if (failed.Count > 0) { ProposalResponse firstTransactionProposalResponse = failed.First(); throw new ProposalException($"Not enough endorsers for set(move a,b,{0}):{firstTransactionProposalResponse.Status} endorser error:{firstTransactionProposalResponse.Message}. Was verified:{firstTransactionProposalResponse.IsVerified}"); } Util.COut("Successfully received transaction proposal responses for setAmount. Now sending to orderer."); //////////////////////////// // Send transaction to orderer if (user != null) { return(channel.SendTransaction(successful, user)); } return(channel.SendTransaction(successful)); }