Ejemplo n.º 1
0
 public ChaincodeStub(string channelId, string txId, Handler handler, List <ByteString> args, SignedProposal signedProposal)
 {
     ChannelId      = channelId;
     TxId           = txId;
     this.handler   = handler;
     this.args      = args.ToList();
     SignedProposal = signedProposal;
     if (SignedProposal == null || SignedProposal.ProposalBytes.IsEmpty)
     {
         creator      = null;
         TxTimestamp  = null;
         transientMap = new Dictionary <string, ByteString>();
         Binding      = null;
     }
     else
     {
         Proposal      proposal      = Proposal.Parser.ParseFrom(signedProposal.ProposalBytes);
         Header        header        = Header.Parser.ParseFrom(proposal.Header);
         ChannelHeader channelHeader = ChannelHeader.Parser.ParseFrom(header.ChannelHeader);
         ValidateProposalType(channelHeader);
         SignatureHeader          signatureHeader          = SignatureHeader.Parser.ParseFrom(header.SignatureHeader);
         ChaincodeProposalPayload chaincodeProposalPayload = ChaincodeProposalPayload.Parser.ParseFrom(proposal.Payload);
         TxTimestamp  = channelHeader.Timestamp.ToDateTimeOffset();
         creator      = signatureHeader.Creator;
         transientMap = chaincodeProposalPayload.TransientMap.ToDictionary(a => a.Key, a => a.Value);
         Binding      = ComputeBinding(channelHeader, signatureHeader);
     }
 }
Ejemplo n.º 2
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. ");
        }
Ejemplo n.º 3
0
        private Payload CreateTransactionCommonPayload(Proposal ccodeProposal, ByteString propResponsePayload, List <Endorsement> endrsements)
        {
            ChaincodeEndorsedAction chaincodeEndorsedAction = new ChaincodeEndorsedAction {
                ProposalResponsePayload = propResponsePayload
            };

            chaincodeEndorsedAction.Endorsements.AddRange(endrsements);
            //ChaincodeActionPayload
            ChaincodeActionPayload chaincodeActionPayload = new ChaincodeActionPayload {
                Action = chaincodeEndorsedAction
            };

            //We need to remove any transient fields - they are not part of what the peer uses to calculate hash.
            ChaincodeProposalPayload p = ChaincodeProposalPayload.Parser.ParseFrom(ccodeProposal.Payload);
            ChaincodeProposalPayload chaincodeProposalPayloadNoTrans = new ChaincodeProposalPayload {
                Input = p.Input
            };

            chaincodeActionPayload.ChaincodeProposalPayload = chaincodeProposalPayloadNoTrans.ToByteString();


            TransactionAction transactionAction = new TransactionAction();

            Header header = Header.Parser.ParseFrom(ccodeProposal.Header);

            if (Config.Instance.ExtraLogLevel(10))
            {
                if (null != diagnosticFileDumper)
                {
                    StringBuilder sb = new StringBuilder(10000);
                    sb.Append("transaction header bytes:" + header.ToByteString().ToHexString());
                    sb.Append("\n");
                    sb.Append("transaction header sig bytes:" + header.SignatureHeader.ToHexString());
                    logger.Trace("transaction header:  " + diagnosticFileDumper.CreateDiagnosticFile(sb.ToString()));
                }
            }

            transactionAction.Header = header.SignatureHeader;

            if (Config.Instance.ExtraLogLevel(10))
            {
                if (null != diagnosticFileDumper)
                {
                    logger.Trace("transactionActionBuilder.setPayload: " + diagnosticFileDumper.CreateDiagnosticFile(chaincodeActionPayload.ToByteString().ToHexString()));
                }
            }

            transactionAction.Payload = chaincodeActionPayload.ToByteString();

            //Transaction
            Transaction transaction = new Transaction();

            transaction.Actions.Add(transactionAction);

            return(new Payload {
                Header = header, Data = transaction.ToByteString()
            });
        }
Ejemplo n.º 4
0
        private static Proposal CreateChaincodeProposalWithTxIDNonceAndTransient(ChaincodeSpec ccis, TransactionHeader transactionHeader, Dictionary <string, string> transientMap)
        {
            var ccHdrExt = new ChaincodeHeaderExtension()
            {
                ChaincodeId = ccis.ChaincodeId
            };
            var ccHdrExtBytes = Util.Marshal(ccHdrExt);
            var cis           = new ChaincodeInvocationSpec()
            {
                ChaincodeSpec = ccis
            };

            var cisBytes      = Util.Marshal(cis);
            var ccPropPayload = new ChaincodeProposalPayload()
            {
                Input        = cisBytes,
                TransientMap = Util.ConvertMapField(transientMap)
            };
            var ccPropPayloadBytes = Util.Marshal(ccPropPayload);
            var timestamp          = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow);

            // TODO: epoch is now set to zero. This must be changed once we
            // get a more appropriate mechanism to handle it in.
            ulong epoch = 0;
            var   hdr   = new Header()
            {
                ChannelHeader = Util.Marshal(new ChannelHeader()
                {
                    Type      = (int)HeaderType.EndorserTransaction,
                    TxId      = transactionHeader.Id,
                    Timestamp = timestamp,
                    ChannelId = transactionHeader.ChannelID,
                    Extension = ccHdrExtBytes,
                    Epoch     = epoch
                }),
                SignatureHeader = Util.Marshal(new SignatureHeader()
                {
                    Nonce   = transactionHeader.Nonce,
                    Creator = transactionHeader.Creator
                })
            };
            var hdrBytes = Util.Marshal(hdr);
            var prop     = new Proposal()
            {
                Header  = hdrBytes,
                Payload = ccPropPayloadBytes
            };

            return(prop);
        }
        public void TestGetTransient()
        {
            ChaincodeProposalPayload payload = new ChaincodeProposalPayload();

            payload.TransientMap.Add("key0", ByteString.CopyFromUtf8("value0"));
            payload.TransientMap.Add("key1", ByteString.CopyFromUtf8("value1"));

            SignedProposal signedProposal = new SignedProposal {
                ProposalBytes = new Proposal {
                    Header = new Header {
                        ChannelHeader = new ChannelHeader {
                            Type = (int)HeaderType.EndorserTransaction, Timestamp = new Timestamp()
                        }.ToByteString(),
                    }.ToByteString(), Payload = payload.ToByteString()
                }.ToByteString()
            };
            ChaincodeStub stub = new ChaincodeStub("myc", "txId", handler.Object, new List <ByteString>(), signedProposal);

            Assert.That.ContainsDictionary <string, byte[], byte>(stub.Transient, new Dictionary <string, byte[]> {
                { "key0", "value0".ToBytes() }, { "key1", "value1".ToBytes() }
            });
        }
Ejemplo n.º 6
0
        private Proposal CreateFabricProposal(string chID, Protos.Peer.ChaincodeID ccodeID)
        {
            if (null == transientMap)
            {
                transientMap = new Dictionary <string, byte[]>();
            }

            if (IS_DEBUG_LEVEL)
            {
                foreach (KeyValuePair <string, byte[]> tme in transientMap)
                {
                    logger.Debug($"transientMap('{tme.Key.LogString()}', '{Encoding.UTF8.GetString(tme.Value).LogString()}'))");
                }
            }

            ChaincodeHeaderExtension chaincodeHeaderExtension = new ChaincodeHeaderExtension {
                ChaincodeId = ccodeID
            };

            ChannelHeader chainHeader = ProtoUtils.CreateChannelHeader(HeaderType.EndorserTransaction, context.TxID, chID, context.Epoch, context.FabricTimestamp, chaincodeHeaderExtension, null);

            ChaincodeInvocationSpec chaincodeInvocationSpec = CreateChaincodeInvocationSpec(ccodeID, ccType);

            ChaincodeProposalPayload payload = new ChaincodeProposalPayload {
                Input = chaincodeInvocationSpec.ToByteString()
            };

            foreach (KeyValuePair <string, byte[]> pair in transientMap)
            {
                payload.TransientMap.Add(pair.Key, ByteString.CopyFrom(pair.Value));
            }
            Header header = new Header {
                SignatureHeader = ProtoUtils.GetSignatureHeaderAsByteString(context), ChannelHeader = chainHeader.ToByteString()
            };

            return(new Proposal {
                Header = header.ToByteString(), Payload = payload.ToByteString()
            });
        }