public void TestGetHistoryForKey()
        {
            ChaincodeBase  cb = new Cb4();
            ChaincodeInput ci = new ChaincodeInput();

            ci.Args.AddRange(new[] { ByteString.CopyFromUtf8("") });
            ByteString       initPayload = ci.ToByteString();
            ChaincodeMessage initMsg     = MessageUtil.NewEventMessage(ChaincodeMessage.Types.Type.Init, "testChannel", "0", initPayload, null);

            ci = new ChaincodeInput();
            ci.Args.AddRange(new[] { ByteString.CopyFromUtf8("invoke"), ByteString.CopyFromUtf8("key1") });
            ByteString       invokePayload = ci.ToByteString();
            ChaincodeMessage invokeMsg     = MessageUtil.NewEventMessage(ChaincodeMessage.Types.Type.Transaction, "testChannel", "0", invokePayload, null);

            List <IScenarioStep> scenario = new List <IScenarioStep>();

            scenario.Add(new RegisterStep());
            scenario.Add(new CompleteStep());
            scenario.Add(new GetHistoryForKeyStep(false, "1", "2"));
            scenario.Add(new QueryCloseStep());
            scenario.Add(new CompleteStep());
            server = ChaincodeMockPeer.StartServer(scenario);

            cb.Start(new string[] { "-a", "127.0.0.1:7052", "-i", "testId" });
            CheckScenarioStepEnded(server, 1, Timeout);
            server.Send(initMsg);
            CheckScenarioStepEnded(server, 2, Timeout);
            server.Send(invokeMsg);
            CheckScenarioStepEnded(server, 5, Timeout);
            Assert.AreEqual(server.LastMessageSend.Type, ChaincodeMessage.Types.Type.Response);
            Assert.AreEqual(server.LastMessageRcvd.Type, ChaincodeMessage.Types.Type.Completed);
            Assert.AreEqual(Protos.Peer.ProposalResponsePackage.Response.Parser.ParseFrom(server.LastMessageRcvd.Payload).Message, "OK response2");
        }
        public void TestRegisterAndEmptyInit()
        {
            ChaincodeBaseAsync cb  = new EmptyChaincode();
            ChaincodeInput     inp = new ChaincodeInput();

            inp.Args.Add(ByteString.CopyFromUtf8(""));
            ByteString       payload = inp.ToByteString();
            ChaincodeMessage initMsg = MessageUtil.NewEventMessage(ChaincodeMessage.Types.Type.Init, "testChannel", "0", payload, null);

            List <IScenarioStep> scenario = new List <IScenarioStep>();

            scenario.Add(new RegisterStep());
            scenario.Add(new CompleteStep());

            server = ChaincodeMockPeer.StartServer(scenario);

            cb.Start(new string[] { "-a", "127.0.0.1:7052", "-i", "testId" });
            CheckScenarioStepEnded(server, 1, Timeout);

            server.Send(initMsg);
            CheckScenarioStepEnded(server, 2, Timeout);

            Assert.AreEqual(server.LastMessageSend.Type, ChaincodeMessage.Types.Type.Init);
            Assert.AreEqual(server.LastMessageRcvd.Type, ChaincodeMessage.Types.Type.Completed);
        }
        public void TestInvokeChaincode()
        {
            ChaincodeBase  cb = new Cb5();
            ChaincodeInput ci = new ChaincodeInput();

            ci.Args.AddRange(new[] { ByteString.CopyFromUtf8("") });
            ByteString       initPayload = ci.ToByteString();
            ChaincodeMessage initMsg     = MessageUtil.NewEventMessage(ChaincodeMessage.Types.Type.Init, "testChannel", "0", initPayload, null);

            ci = new ChaincodeInput();
            ci.Args.AddRange(new[] { ByteString.CopyFromUtf8("invoke") });
            ByteString       invokePayload = ci.ToByteString();
            ChaincodeMessage invokeMsg     = MessageUtil.NewEventMessage(ChaincodeMessage.Types.Type.Transaction, "testChannel", "0", invokePayload, null);

            List <IScenarioStep> scenario = new List <IScenarioStep>();

            scenario.Add(new RegisterStep());
            scenario.Add(new CompleteStep());
            scenario.Add(new InvokeChaincodeStep());
            scenario.Add(new CompleteStep());

            server = ChaincodeMockPeer.StartServer(scenario);

            cb.Start(new string[] { "-a", "127.0.0.1:7052", "-i", "testId" });
            CheckScenarioStepEnded(server, 1, Timeout);
            server.Send(initMsg);
            CheckScenarioStepEnded(server, 2, Timeout);
            server.Send(invokeMsg);
            CheckScenarioStepEnded(server, 4, Timeout);
            Assert.AreEqual(server.LastMessageSend.Type, ChaincodeMessage.Types.Type.Response);
            Assert.AreEqual(server.LastMessageRcvd.Type, ChaincodeMessage.Types.Type.Completed);
        }
Esempio n. 4
0
        public void TestProposalBuilderWithOutMetaInf()
        {
            InstallProposalBuilder installProposalBuilder = InstallProposalBuilder.Create();

            installProposalBuilder.ChaincodeLanguage(TransactionRequest.Type.GO_LANG);
            installProposalBuilder.ChaincodePath("github.com/example_cc");
            installProposalBuilder.ChaincodeSource(SAMPLE_GO_CC.Locate());
            installProposalBuilder.ChaincodeName("example_cc.go");
            installProposalBuilder.ChaincodeVersion("1");

            Channel            channel            = hfclient.NewChannel("testProposalBuilderWithOutMetaInf");
            TransactionContext transactionContext = new TransactionContext(channel, TestUtils.TestUtils.GetMockUser("rick", "rickORG"), Factory.Instance.GetCryptoSuite());

            installProposalBuilder.Context(transactionContext);

            Proposal proposal = installProposalBuilder.Build(); // Build it get the proposal. Then unpack it to see if it's what we expect.
            ChaincodeProposalPayload chaincodeProposalPayload = ChaincodeProposalPayload.Parser.ParseFrom(proposal.Payload);
            ChaincodeInvocationSpec  chaincodeInvocationSpec  = ChaincodeInvocationSpec.Parser.ParseFrom(chaincodeProposalPayload.Input);
            ChaincodeSpec            chaincodeSpec            = chaincodeInvocationSpec.ChaincodeSpec;
            ChaincodeInput           input = chaincodeSpec.Input;

            ChaincodeDeploymentSpec chaincodeDeploymentSpec = ChaincodeDeploymentSpec.Parser.ParseFrom(input.Args[1]);
            ByteString    codePackage = chaincodeDeploymentSpec.CodePackage;
            List <string> tarBytesToEntryArrayList = TestUtils.TestUtils.TarBytesToEntryArrayList(codePackage.ToByteArray());

            List <string> expect = new List <string>()
            {
                "src/github.com/example_cc/example_cc.go"
            };

            CollectionAssert.AreEquivalent(expect, tarBytesToEntryArrayList, "Tar in Install Proposal's codePackage does not have expected entries. ");
        }
        public void Parses_arguments_correctly_when_function_name_and_parameters_are_set()
        {
            var input = new ChaincodeInput();

            input.Args.AddRange(new List <ByteString>
            {
                "invoke".ToByteString(),
                "key".ToByteString(),
                "value".ToByteString()
            });

            var sut = CreateChaincodeStub(null, "ChannelId", "TxId", input, CreateValidSignedProposal());

            sut.Args.Should().HaveCount(3);
            sut.Args.Should().HaveElementAt(0, "invoke");
            sut.Args.Should().HaveElementAt(1, "key");
            sut.Args.Should().HaveElementAt(2, "value");

            var fap = sut.GetFunctionAndParameters();

            fap.Function.Should().Be("invoke");
            fap.Parameters.Should().HaveCount(2);
            fap.Parameters.Should().HaveElementAt(0, "key");
            fap.Parameters.Should().HaveElementAt(1, "value");
        }
 private ChaincodeStub CreateChaincodeStub(
     IHandler handler,
     string channelId,
     string txId,
     ChaincodeInput chaincodeInput,
     SignedProposal signedProposal
     )
 {
     return(new ChaincodeStub(handler, channelId, txId, chaincodeInput, signedProposal,
                              new NullLogger <ChaincodeStub>()));
 }
Esempio n. 7
0
 public IChaincodeStub Create(
     IHandler handler,
     string channelId,
     string txId,
     ChaincodeInput chaincodeInput,
     SignedProposal signedProposal
     )
 {
     using (var scope = _serviceProvider.GetRequiredService <IServiceScopeFactory>().CreateScope())
     {
         return(new ChaincodeStub(handler, channelId, txId, chaincodeInput, signedProposal,
                                  scope.ServiceProvider.GetRequiredService <ILogger <ChaincodeStub> >()));
     }
 }
        public void TestStateValidationParameter()
        {
            ChaincodeBase  cb = new Cb8();
            ChaincodeInput ci = new ChaincodeInput();

            ci.Args.AddRange(new[] { ByteString.CopyFromUtf8("init") });
            ByteString            initPayload = ci.ToByteString();
            ChaincodeMessage      initMsg     = MessageUtil.NewEventMessage(ChaincodeMessage.Types.Type.Init, "testChannel", "0", initPayload, null);
            StateBasedEndorsement sbe         = new StateBasedEndorsement(null);

            sbe.AddOrgs(RoleType.RoleTypePeer, "Org1");
            sbe.AddOrgs(RoleType.RoleTypeMember, "Org2");

            List <IScenarioStep> scenario = new List <IScenarioStep>();


            scenario.Add(new RegisterStep());
            scenario.Add(new CompleteStep());

            scenario.Add(new GetStateMetadataStep(sbe));
            scenario.Add(new PutStateMetadataStep(sbe));
            scenario.Add(new CompleteStep());
            server = ChaincodeMockPeer.StartServer(scenario);

            cb.Start(new string[] { "-a", "127.0.0.1:7052", "-i", "testId" });
            CheckScenarioStepEnded(server, 1, Timeout);

            server.Send(initMsg);
            CheckScenarioStepEnded(server, 2, Timeout);
            Assert.AreEqual(server.LastMessageSend.Type, ChaincodeMessage.Types.Type.Init);
            Assert.AreEqual(server.LastMessageRcvd.Type, ChaincodeMessage.Types.Type.Completed);
            Assert.AreEqual(Protos.Peer.ProposalResponsePackage.Response.Parser.ParseFrom(server.LastMessageRcvd.Payload).Message, "OK response1");


            ci = new ChaincodeInput();
            ci.Args.AddRange(new[] { ByteString.CopyFromUtf8("invoke"), ByteString.CopyFromUtf8("a") });
            ByteString       invokePayload = ci.ToByteString();
            ChaincodeMessage invokeMsg     = MessageUtil.NewEventMessage(ChaincodeMessage.Types.Type.Transaction, "testChannel", "0", invokePayload, null);

            server.Send(invokeMsg);
            CheckScenarioStepEnded(server, 5, Timeout);
            Assert.AreEqual(server.LastMessageSend.Type, ChaincodeMessage.Types.Type.Response);
            Assert.AreEqual(server.LastMessageRcvd.Type, ChaincodeMessage.Types.Type.Completed);
            Assert.AreEqual(Protos.Peer.ProposalResponsePackage.Response.Parser.ParseFrom(server.LastMessageRcvd.Payload).Message, "OK response2");
        }
Esempio n. 9
0
        public ChaincodeStub(
            IHandler handler,
            string channelId,
            string txId,
            ChaincodeInput chaincodeInput,
            SignedProposal signedProposal,
            ILogger <ChaincodeStub> logger
            )
        {
            _handler  = handler;
            ChannelId = channelId;
            TxId      = txId;
            _logger   = logger;

            Args = chaincodeInput.Args.Select(entry => entry.ToStringUtf8()).ToList();

            DecodedSignedProposal = ValidateSignedProposal(signedProposal);
        }
        public void Parses_arguments_correctly_when_function_name()
        {
            var input = new ChaincodeInput();

            input.Args.AddRange(new List <ByteString> {
                "invoke".ToByteString()
            });

            var sut = CreateChaincodeStub(null, "ChannelId", "TxId", input, CreateValidSignedProposal());

            sut.Args.Should().HaveCount(1);
            sut.Args.Should().Contain("invoke");

            var fap = sut.GetFunctionAndParameters();

            fap.Function.Should().Be("invoke");
            fap.Parameters.Should().BeEmpty();
        }
Esempio n. 11
0
 // handleTransaction Handles request to execute a transaction.
 private void InternalHandleTransaction(ChaincodeMessage message, CancellationToken token, Func <IChaincodeStub, CancellationToken, Task <Response> > action)
 {
     Task.Run(async() =>
     {
         try
         {
             // Get the function and args from Payload
             ChaincodeInput input = ChaincodeInput.Parser.ParseFrom(message.Payload);
             // Mark as a transaction (allow put/del state)
             MarkIsTransaction(message.ChannelId, message.Txid, true);
             // Create the ChaincodeStub which the chaincode can use to
             // callback
             IChaincodeStub stub = new ChaincodeStub(message.ChannelId, message.Txid, this, input.Args.ToList(), message.Proposal);
             // Call chaincode's init
             Response result = await action(stub, token).ConfigureAwait(false);
             if (result.Status >= Status.INTERNAL_SERVER_ERROR)
             {
                 // Send ERROR with entire result.Message as payload
                 logger.Error($"[{message.Txid},-8]Init failed. Sending {ChaincodeMessage.Types.Type.Error}");
                 await QueueOutboundChaincodeMessageAsync(NewErrorEventMessage(message.ChannelId, message.Txid, result.Message, stub.Event), token).ConfigureAwait(false);
             }
             else
             {
                 // Send COMPLETED with entire result as payload
                 logger.Debug($"[{message.Txid},-8]Init succeeded. Sending {ChaincodeMessage.Types.Type.Completed}");
                 await QueueOutboundChaincodeMessageAsync(NewCompletedEventMessage(message.ChannelId, message.Txid, result, stub.Event), token).ConfigureAwait(false);
             }
         }
         catch (Exception e)
         {
             logger.Error(e, $"[{message.Txid},-8]Init failed. Sending {ChaincodeMessage.Types.Type.Error}");
             await QueueOutboundChaincodeMessageAsync(NewErrorEventMessage(message.ChannelId, message.Txid, e), token).ConfigureAwait(false);
         }
         finally
         {
             // delete isTransaction entry
             DeleteIsTransaction(message.ChannelId, message.Txid);
         }
     }, token);
 }
        public void TestStreamShutdown()
        {
            ChaincodeBase  cb = new Cb7();
            ChaincodeInput ci = new ChaincodeInput();

            ci.Args.AddRange(new[] { ByteString.CopyFromUtf8("") });
            ByteString       initPayload = ci.ToByteString();
            ChaincodeMessage initMsg     = MessageUtil.NewEventMessage(ChaincodeMessage.Types.Type.Init, "testChannel", "0", initPayload, null);

            List <IScenarioStep> scenario = new List <IScenarioStep>();

            scenario.Add(new RegisterStep());
            scenario.Add(new CompleteStep());
            server = ChaincodeMockPeer.StartServer(scenario);

            cb.Start(new string[] { "-a", "127.0.0.1:7052", "-i", "testId" });
            CheckScenarioStepEnded(server, 1, Timeout);

            server.Send(initMsg);
            server.Stop();
            server = null;
        }
        public async Task <Response> HandleInvokeChaincode(
            string chaincodeName,
            IEnumerable <ByteString> args,
            string channelId,
            string txId
            )
        {
            var chaincodeId = new ChaincodeID {
                Name = chaincodeName
            };
            var inputArgs = new RepeatedField <ByteString>().Concat(args);

            var chaincodeInput = new ChaincodeInput();

            chaincodeInput.Args.AddRange(inputArgs);

            var payload = new ChaincodeSpec
            {
                ChaincodeId = chaincodeId,
                Input       = chaincodeInput
            };

            var response = await CreateMessageAndListen <ChaincodeMessage>(MessageMethod.InvokeChaincode,
                                                                           ChaincodeMessage.Types.Type.InvokeChaincode, payload, channelId, txId);

            if (response.Type == ChaincodeMessage.Types.Type.Completed)
            {
                return(Response.Parser.ParseFrom(response.Payload));
            }

            if (response.Type == ChaincodeMessage.Types.Type.Error)
            {
                throw new Exception(response.Payload.ToStringUtf8());
            }

            throw new Exception("Something went somewhere horribly wrong");
        }
        private async Task HandleMessage(ChaincodeMessage message, HandleMessageAction action)
        {
            ChaincodeMessage nextMessage = null;
            ChaincodeInput   input       = null;

            try
            {
                input = ChaincodeInput.Parser.ParseFrom(message.Payload);
            }
            catch
            {
                _logger.LogError(
                    $"{message.ChannelId}-{message.Txid} Incorrect payload format. Sending ERROR message back to peer");
                nextMessage = new ChaincodeMessage
                {
                    Txid      = message.Txid,
                    ChannelId = message.ChannelId,
                    Type      = ChaincodeMessage.Types.Type.Error,
                    Payload   = message.Payload
                };
            }

            if (input == null)
            {
                await WriteStream.WriteAsync(nextMessage);

                return;
            }

            IChaincodeStub stub = null;

            try
            {
                stub = _chaincodeStubFactory.Create(this, message.ChannelId, message.Txid, input,
                                                    message.Proposal);
            }
            catch (Exception ex)
            {
                _logger.LogError($"Failed to construct a chaincode stub instance for the INIT message: {ex}");
                nextMessage = new ChaincodeMessage
                {
                    Type      = ChaincodeMessage.Types.Type.Error,
                    Payload   = ex.ToString().ToByteString(),
                    Txid      = message.Txid,
                    ChannelId = message.ChannelId
                };
            }

            if (stub == null)
            {
                await WriteStream.WriteAsync(nextMessage);

                return;
            }

            Response response;

            if (action == HandleMessageAction.Init)
            {
                response = await _chaincode.Init(stub);
            }
            else
            {
                response = await _chaincode.Invoke(stub);
            }

            if (response.Status == 0)
            {
                var errorMessage = $"[{message.ChannelId}-{message.Txid}] Calling chaincode {action} " +
                                   "has not called success or error";
                _logger.LogError(errorMessage);
                response = Shim.Error(errorMessage);
            }

            _logger.LogInformation($"[{message.ChaincodeEvent}]-{message.Txid} Calling chaincode {action}, " +
                                   $"response status {response.Status}");

            if (response.Status >= (int)ResponseCodes.Error)
            {
                _logger.LogError($"[{message.ChannelId}-{message.Txid}] Calling chaincode {action} " +
                                 $"returned error response {response.Message}. " +
                                 "Sending ERROR message back to peer");

                nextMessage = new ChaincodeMessage
                {
                    Type      = ChaincodeMessage.Types.Type.Error,
                    Payload   = response.Message.ToByteString(),
                    Txid      = message.Txid,
                    ChannelId = message.ChannelId
                };
            }
            else
            {
                _logger.LogInformation($"[{message.ChannelId}-{message.Txid}] Calling chaincode {action} " +
                                       "succeeded. Sending COMPLETED message back to peer");
                nextMessage = new ChaincodeMessage
                {
                    Type           = ChaincodeMessage.Types.Type.Completed,
                    Payload        = response.ToByteString(),
                    Txid           = message.Txid,
                    ChannelId      = message.ChannelId,
                    ChaincodeEvent = stub.ChaincodeEvent
                };
            }

            await WriteStream.WriteAsync(nextMessage);
        }
Esempio n. 15
0
        public static ChaincodeDeploymentSpec CreateDeploymentSpec(ChaincodeSpec.Types.Type ccType, string name, string chaincodePath,
                                                                   string chaincodeVersion, List <string> args,
                                                                   byte[] codePackage)
        {
            Protos.Peer.ChaincodeID chaincodeID = new Protos.Peer.ChaincodeID
            {
                Name    = name,
                Version = chaincodeVersion
            };
            if (chaincodePath != null)
            {
                chaincodeID.Path = chaincodePath;
            }
            if (args == null)
            {
                args = new List <string>();
            }
            // build chaincodeInput
            List <ByteString> argList        = args.Select(ByteString.CopyFromUtf8).ToList();
            ChaincodeInput    chaincodeInput = new ChaincodeInput();

            chaincodeInput.Args.AddRange(argList);

            // Construct the ChaincodeSpec
            ChaincodeSpec chaincodeSpec = new ChaincodeSpec {
                ChaincodeId = chaincodeID, Input = chaincodeInput, Type = ccType
            };

            if (isDebugLevel)
            {
                StringBuilder sb = new StringBuilder(1000);
                sb.Append("ChaincodeDeploymentSpec chaincode cctype: ")
                .Append(ccType.ToString())
                .Append(", name:")
                .Append(chaincodeID.Name)
                .Append(", path: ")
                .Append(chaincodeID.Path)
                .Append(", version: ")
                .Append(chaincodeID.Version);

                string sep = "";
                sb.Append(" args(");

                foreach (ByteString x in argList)
                {
                    sb.Append(sep).Append("\"").Append(x.ToStringUtf8().LogString()).Append("\"");
                    sep = ", ";
                }
                sb.Append(")");
                logger.Debug(sb.ToString());
            }

            ChaincodeDeploymentSpec spec = new ChaincodeDeploymentSpec {
                ChaincodeSpec = chaincodeSpec, ExecEnv = ChaincodeDeploymentSpec.Types.ExecutionEnvironment.Docker
            };

            if (codePackage != null)
            {
                spec.CodePackage = ByteString.CopyFrom(codePackage);
            }
            return(spec);
        }
Esempio n. 16
0
        private ChaincodeInvocationSpec CreateChaincodeInvocationSpec(Protos.Peer.ChaincodeID ccodeID, ChaincodeSpec.Types.Type langType)
        {
            List <ByteString> allArgs = new List <ByteString>();

            if (argList != null && argList.Count > 0)
            {
                // If we already have an argList then the Builder subclasses have already set the arguments
                // for chaincodeInput. Accept the list and pass it on to the chaincodeInput builder
                // TODO need to clean this logic up so that common protobuf struct builds are in one place
                allArgs = argList;
            }
            else if (request != null)
            {
                // if argList is empty and we have a Request, build the chaincodeInput args array from the Request args and argbytes lists
                allArgs.Add(ByteString.CopyFromUtf8(request.Fcn));
                List <string> args = request.Args;
                if (args != null && args.Count > 0)
                {
                    foreach (string arg in args)
                    {
                        allArgs.Add(ByteString.CopyFromUtf8(arg));
                    }
                }

                // TODO currently assume that chaincodeInput args are strings followed by byte[].
                // Either agree with Fabric folks that this will always be the case or modify all Builders to expect
                // a List of Objects and determine if each list item is a string or a byte array
                List <byte[]> argBytes = request.ArgsBytes;
                if (argBytes != null && argBytes.Count > 0)
                {
                    foreach (byte[] arg in argBytes)
                    {
                        allArgs.Add(ByteString.CopyFrom(arg));
                    }
                }
            }

            if (IS_DEBUG_LEVEL)
            {
                StringBuilder logout = new StringBuilder(1000);

                logout.Append($"ChaincodeInvocationSpec type: {langType.ToString()}, chaincode name: {ccodeID.Name}, chaincode path: {ccodeID.Path}, chaincode version: {ccodeID.Version}");

                string sep = "";
                logout.Append(" args(");

                foreach (ByteString x in allArgs)
                {
                    logout.Append(sep).Append("\"").Append(x.ToStringUtf8().LogString()).Append("\"");
                    sep = ", ";
                }

                logout.Append(")");

                logger.Debug(logout.ToString);
            }

            ChaincodeInput chaincodeInput = new ChaincodeInput();

            chaincodeInput.Args.AddRange(allArgs);
            ChaincodeSpec chaincodeSpec = new ChaincodeSpec {
                Type = langType, ChaincodeId = ccodeID, Input = chaincodeInput
            };

            return(new ChaincodeInvocationSpec {
                ChaincodeSpec = chaincodeSpec
            });
        }