Ejemplo n.º 1
0
        public async Task <RawResponse> PrivateRequest(SignedRequest req)
        {
            if (apiKey == null || apiSecret == null)
            {
                throw new BinanceClientNotConfigured($"API key and API secret must be set before making private/signed requests. Provided: {apiKey}, {apiSecret}");
            }

            if (!req.IsValid())
            {
                //TODO: proper exception
                throw new Exception("Signed Request not valid");
            }

            var response = await ReqAsync(req.BuildSignedUrl(apiSecret), req.Method, req.UseApiKey);

            Console.WriteLine("URL: " + response.RequestMessage.RequestUri.ToString());
            Console.WriteLine(response.StatusCode);

            if (!response.IsSuccessStatusCode)
            {
                throw new BinanceFailedRequest($"Request failed with status code: {response.StatusCode}. Request URL: {response.RequestMessage.RequestUri.ToString()}");
            }

            _lastResponse = await RawResponse.FromHttpResponse(response);

            return(_lastResponse);
        }
Ejemplo n.º 2
0
        public Response <User> Register(SignedRequest <RegisterRequest> request)
        {
            var response = new Response <User>();

            try
            {
                if (request == null || request.RequestData == null)
                {
                    response.Code         = -1;
                    response.Description  = "请求参数为空!";
                    response.ResponseData = null;
                }
                else
                {
                    NoteUserManager      manager = new NoteUserManager(request.Version);
                    ManagerResult <User> result  = manager.Register(request.RequestData.User, request.RequestData.PwdHashStr);
                    response.GetResultInfo(result);
                    response.ResponseData = result.ResultData;
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(LogType.Error, ex);
                response.Code = -1;
            }

            return(response);
        }
Ejemplo n.º 3
0
        public Response <Verification> GetVerificationByPhoneNumber(GetVerificationByPhoneNumberRequest request, SignatureCheckInfo signatureCheckInfo)
        {
            try
            {
                Signature signature = Signature.NewSignature(signatureCheckInfo.AppId);

                SignedRequest <GetVerificationByPhoneNumberRequest> requestValue = new SignedRequest <GetVerificationByPhoneNumberRequest>()
                {
                    RequestData = request,
                    AppId       = signature.AppId,
                    Nonce       = signature.Nonce,
                    TimeStamp   = signature.TimeStamp,
                    Signature   = signature.Sign,
                    Version     = signatureCheckInfo.Version
                };

                string requestUri = this.baseAddr + @"api/verification/GetVerificationByPhoneNumber";
                HttpResponseMessage httpResponse = HttpClientHelper.Client.PostAsJsonAsync <SignedRequest <GetVerificationByPhoneNumberRequest> >(requestUri, requestValue).Result;

                if (httpResponse.IsSuccessStatusCode)
                {
                    return(httpResponse.Content.ReadAsAsync <Response <Verification> >().Result);
                }
                else
                {
                    LogHelper.WriteLog(LogType.Error, "VerificationManager", "GetVerificationByPhoneNumber", "HTTP响应失败:" + requestUri);
                    return(null);
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(LogType.Error, ex);
                return(null);
            }
        }
Ejemplo n.º 4
0
        protected override User GetUser(HttpContextBase context)
        {
            string signedRequestValue = context.Request["signed_request"];

            try
            {
                ValidateSignedRequest(signedRequestValue);
            }
            catch (Exception ex)
            {
                _errorLogger.Log(ex);
                return(null);
            }

            SignedRequest signedRequest = _facebookClient.ParseSignedRequest(signedRequestValue);

            User user = _userService.GetUser(signedRequest.UserId);

            if (user == null)
            {
                user = new User {
                    FacebookUserId = signedRequest.UserId
                };
            }

            user.AccessToken   = signedRequest.AccessToken;
            user.SignedRequest = signedRequestValue;

            return(user);
        }
Ejemplo n.º 5
0
        public Response <bool> CheckVerification(SignedRequest <CheckVerificationRequest> request)
        {
            Response <bool> response = new Response <bool>();

            try
            {
                if (request == null || request.RequestData == null)
                {
                    response.Code         = -1;
                    response.Description  = "请求参数为空!";
                    response.ResponseData = false;
                }
                else
                {
                    VerificationManager  verificationManager = new VerificationManager(request.Version);
                    ManagerResult <bool> result = verificationManager.CheckVerification(request.RequestData.PhoneNumber, request.RequestData.Code);
                    response.GetResultInfo(result);
                    response.ResponseData = result.ResultData;
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(LogType.Error, ex);
                response.Code = -1;
            }

            return(response);
        }
Ejemplo n.º 6
0
        private User GetUser(HttpContextBase context)
        {
            string signedRequestValue = context.Request["signed_request"];

            try
            {
                ValidateSignedRequest(signedRequestValue);
            }
            catch (Exception ex)
            {
                //_errorLogger.Log(ex);
                return(null);
            }

            // parse the signed request
            SignedRequest signedRequest = _facebookClient.ParseSignedRequest(signedRequestValue);

            // get the user
            User user = _userService.GetUser(signedRequest.UserId);

            if (user == null)
            {
                user = new User {
                    FacebookUserId = signedRequest.UserId
                };
            }

            // update access token and signed request
            user.AccessToken   = signedRequest.AccessToken;
            user.SignedRequest = signedRequestValue;

            return(user);
        }
Ejemplo n.º 7
0
        public Response <Verification> AddVerification(SignedRequest <Verification> request)
        {
            Response <Verification> response = new Response <Verification>();

            try
            {
                if (request == null || request.RequestData == null)
                {
                    response.Code         = -1;
                    response.Description  = "请求参数为空!";
                    response.ResponseData = null;
                }
                else
                {
                    VerificationManager          verificationManager = new VerificationManager(request.Version);
                    ManagerResult <Verification> result = verificationManager.AddVerification(request.RequestData);
                    response.GetResultInfo(result);
                    response.ResponseData = result.ResultData;
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(LogType.Error, ex);
                response.Code = -1;
            }

            return(response);
        }
 // Sign() will calculate relevant account signiture information and insert into your message request body
 private Request Sign(SignedRequest request)
 {
     request.ClientRequestId = Guid.NewGuid().ToString("N");
     request.Account         = credentials.Account;
     request.Date            = DateTime.UtcNow.ToString("yyyyMMdd");
     request.Signature       = $"ALPHA-{SignatureEngine.ComputeSignature(SignatureEngine.ComputeHash(credentials.Key), SignatureEngine.PrepareMessage(request, SignatureEngine.MessageSignatureOrdering.Alphabetical))}";
     return(request);
 }
Ejemplo n.º 9
0
        public static bool IsPageLiked(object SignedRequest)
        {
            if (SignedRequest != null)
            {
                string signedRequest = (new FacebookClient()).ParseSignedRequest(GlobalFacebookConfiguration.Configuration.AppSecret, SignedRequest.ToString()).ToString();

                SignedRequest signedRequestObj = ParseJsonObject <SignedRequest>(signedRequest);
                return((signedRequestObj.Page != null) && (signedRequestObj.Page.Liked));
            }
            return(false);
        }
Ejemplo n.º 10
0
 public virtual Task <Response> SendDiscoveryRequestAsync(SignedRequest signedRequest, int?milliseconds = null, CancellationToken token = default(CancellationToken))
 {
     if (shutdown)
     {
         throw new PeerException("Shutdown");
     }
     if (milliseconds.HasValue && milliseconds > 0)
     {
         return(SendDiscoveryRequestInternalAsync(signedRequest, token).TimeoutAsync(TimeSpan.FromMilliseconds(milliseconds.Value), token));
     }
     return(SendDiscoveryRequestInternalAsync(signedRequest, token));
 }
Ejemplo n.º 11
0
        public string GetPayload(Transaction transaction)
        {
            var data = Johny.HashtablePool.Claim();

            data["orderId"]   = EB.Encoding.ToHexString(EB.Crypto.RandomBytes(32));
            data["productId"] = transaction.productId;
            data["algorithm"] = "sha1";

            var bytes   = Encoding.GetBytes(JSON.Stringify(data));
            var hmac    = Hmac.Sha1(Encoding.GetBytes(_config.PublicKey));
            var payload = SignedRequest.Stringify(bytes, hmac);

            return(payload);
        }
Ejemplo n.º 12
0
        public string GetPayload(Transaction transaction)
        {
            var data = new Hashtable();

            data["orderId"]   = EB.Encoding.ToHexString(EB.Crypto.RandomBytes(32));
            data["productId"] = transaction.productId;
            data["algorithm"] = "sha1";

            var bytes   = Encoding.GetBytes(JSON.Stringify(data));
            var hmac    = Hmac.Sha1(Encoding.GetBytes(_config.PublicKey));
            var payload = SignedRequest.Stringify(bytes, hmac);

            EB.Debug.Log("---Apple---GetPayload():这里是苹果版本的支付信息,但是不知道是否有地方调用");
            return(payload);
        }
Ejemplo n.º 13
0
        public void PurchaseItem(Item item)
        {
            var data = Johny.HashtablePool.Claim();

            data["orderId"]   = EB.Encoding.ToHexString(EB.Crypto.RandomBytes(32));
            data["productId"] = item.productId;
            data["algorithm"] = "sha1";

            if (!string.IsNullOrEmpty(item.LimitedTimeGiftId))
            {
                data["limitedTimeGiftId"] = item.LimitedTimeGiftId;
            }

            var bytes   = Encoding.GetBytes(JSON.Stringify(data));
            var hmac    = Hmac.Sha1(Encoding.GetBytes(_config.PublicKey));
            var payload = SignedRequest.Stringify(bytes, hmac);


            Transaction transaction = new Transaction();

            transaction.transactionId = data["orderId"].ToString();
            transaction.payload       = payload;
            transaction.productId     = item.productId;
            if (!string.IsNullOrEmpty(item.LimitedTimeGiftId))
            {
                transaction.limitedTimeGiftId = item.LimitedTimeGiftId;
            }

            if (_config.Verify != null)
            {
                _config.Verify(transaction);
            }
            else
            {
                Complete(transaction);
            }
        }
Ejemplo n.º 14
0
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContextBase      context            = filterContext.HttpContext;
            string               signedRequestValue = context.Request["signed_request"];
            HttpSessionStateBase session            = context.Session;

            if (session[_userSettingsKey] == null && !String.IsNullOrEmpty(signedRequestValue))
            {
                SignedRequest signedRequest = _facebookClient.ParseSignedRequest(signedRequestValue);

                User user = _userService.GetUser(signedRequest.UserId);
                if (user == null)
                {
                    user = new User {
                        FacebookUserId = signedRequest.UserId
                    };
                }

                user.AccessToken   = signedRequest.AccessToken;
                user.SignedRequest = signedRequestValue;

                session[_userSettingsKey] = user;
            }
        }
Ejemplo n.º 15
0
        public Manager(Config config)
        {
            if (Enabled == true)
            {
                _config       = config;
                _rpcs         = Johny.HashtablePool.Claim();
                _deferred     = new EB.Deferred(8);
                _updateHandle = EB.Coroutines.SetUpdate(_deferred.Dispatch);

                // load certs
                //EB.Net.TcpClientFactory.LoadCertStore("Crypto/Certs");

                // make the signed request
                Hashtable data = Johny.HashtablePool.Claim();
                data["_id"]       = EB.Version.GetMACAddress();
                data["type"]      = Application.platform.ToString();
                data["game"]      = _config.game;
                data["last"]      = EB.Time.Now;
                data["algorithm"] = "hmac-sha1";
                var json = EB.JSON.Stringify(data);

                var key = SignedRequest.Stringify(Encoding.GetBytes(json), Hmac.Sha1(Encoding.GetBytes(_config.serverKey)));

                var url = _config.serverUrl + "?access_token=" + key;
                _wsUrl = new EB.Uri(url);
                Debug.Log("GameTalk Url: " + url);

                _socket          = new EB.Net.TalkWebSocket();
                _socket.OnError += this.OnError;
                _socket.OnRPC   += this.OnRPC;

                Bind(string.Empty, new RPC.Global());

                ConnectIfNeeded();
            }
        }
Ejemplo n.º 16
0
 private async Task <Response> SendDiscoveryRequestInternalAsync(SignedRequest signedRequest, CancellationToken token)
 {
     return(await dfs.DiscoverAsync(signedRequest, null, null, token));
 }
Ejemplo n.º 17
0
 public Response SendDiscoveryRequest(SignedRequest signedRequest, int?milliseconds = null)
 {
     return(SendDiscoveryRequestAsync(signedRequest, milliseconds).RunAndUnwrap());
 }
Ejemplo n.º 18
0
        public async Task <SDNetwork> NetworkDiscoveryAsync(TransactionContext ltransactionContext, bool force, CancellationToken token = default(CancellationToken))
        {
            using (await discoverLock.LockAsync(token).ConfigureAwait(false))
            {
                logger.Trace($"Network discovery force: {force}");
                List <Peer> speers = serviceDiscoveryPeers.Shuffle().ToList();
                SDNetwork   ret    = sdNetwork;
                if (!force && null != ret && !ret.TimeElapsed)
                {
                    return(ret);
                }
                ret = null;
                foreach (Peer serviceDiscoveryPeer in speers)
                {
                    try
                    {
                        SDNetwork lsdNetwork = new SDNetwork(SERVICE_DISCOVER_FREQ_SECONDS);
                        byte[]    clientTLSCertificateDigest = serviceDiscoveryPeer.GetClientTLSCertificateDigest();
                        logger.Info($"Channel {channelName} doing discovery with peer: {serviceDiscoveryPeer}");
                        if (null == clientTLSCertificateDigest)
                        {
                            throw new ArgumentException($"Channel {channelName}, peer {serviceDiscoveryPeer} requires mutual tls for service discovery.");
                        }
                        ByteString clientIdent    = ltransactionContext.Identity.ToByteString();
                        ByteString tlshash        = ByteString.CopyFrom(clientTLSCertificateDigest);
                        AuthInfo   authentication = new AuthInfo();
                        authentication.ClientIdentity    = clientIdent;
                        authentication.ClientTlsCertHash = tlshash;
                        List <Query> fq = new List <Query>(2);
                        Query        cq = new Query();
                        Query        pq = new Query();
                        cq.Channel     = channelName;
                        pq.Channel     = channelName;
                        cq.ConfigQuery = new ConfigQuery();
                        pq.PeerQuery   = new PeerMembershipQuery();
                        fq.Add(cq);
                        fq.Add(pq);
                        Request request = new Request();
                        request.Queries.AddRange(fq);
                        request.Authentication = authentication;
                        ByteString    payloadBytes   = request.ToByteString();
                        ByteString    signatureBytes = ltransactionContext.SignByteStrings(payloadBytes);
                        SignedRequest sr             = new SignedRequest();
                        sr.Payload   = payloadBytes;
                        sr.Signature = signatureBytes;
                        if (IS_TRACE_LEVEL && null != diagnosticFileDumper) // dump protobuf we sent
                        {
                            logger.Trace($"Service discovery channel {channelName} {serviceDiscoveryPeer} service chaincode query sent {diagnosticFileDumper.CreateDiagnosticProtobufFile(sr.ToByteArray())}");
                        }
                        Response response = await serviceDiscoveryPeer.SendDiscoveryRequestAsync(sr, SERVICE_DISCOVERY_WAITTIME, token).ConfigureAwait(false);

                        if (IS_TRACE_LEVEL && null != diagnosticFileDumper) // dump protobuf we get
                        {
                            logger.Trace($"Service discovery channel {channelName} {serviceDiscoveryPeer} service discovery returned {diagnosticFileDumper.CreateDiagnosticProtobufFile(response.ToByteArray())}");
                        }
                        //serviceDiscoveryPeer.HasConnected; ???
                        List <QueryResult> resultsList = response.Results.ToList();
                        QueryResult        queryResult = resultsList[0]; //configquery
                        if (queryResult.ResultCase == QueryResult.ResultOneofCase.Error)
                        {
                            logger.Warn($"Channel {channelName} peer: {serviceDiscoveryPeer} error during service discovery {queryResult.Error.Content}");
                            continue;
                        }

                        QueryResult queryResult2 = resultsList[1];
                        if (queryResult2.ResultCase == QueryResult.ResultOneofCase.Error)
                        {
                            logger.Warn($"Channel {channelName} peer: {serviceDiscoveryPeer} error during service discovery {queryResult2.Error.Content}");
                            continue;
                        }

                        ConfigResult configResult = queryResult.ConfigResult;
                        Dictionary <string, FabricMSPConfig> msps = configResult.Msps.ToDictionary(a => a.Key, a => a.Value);
                        HashSet <ByteString> cbbs = new HashSet <ByteString>();
                        foreach (string i in msps.Keys)
                        {
                            FabricMSPConfig value = msps[i];
                            string          mspid = value.Name;
                            cbbs.AddRange(value.RootCerts);
                            cbbs.AddRange(value.IntermediateCerts);
                            value.RootCerts.ToList().ForEach(a => lsdNetwork.AddTlsCert(mspid, a.ToByteArray()));
                            value.TlsIntermediateCerts.ToList().ForEach(a => lsdNetwork.AddTlsIntermCert(mspid, a.ToByteArray()));
                        }

                        List <byte[]> toaddCerts = new List <byte[]>();
                        AddCerts(cbbs, toaddCerts);
                        if (toaddCerts.Count > 0) // add them to crypto store.
                        {
                            toaddCerts.ForEach(a => channel.Client.CryptoSuite.Store.AddCertificate(a.ToUTF8String()));
                        }
                        Dictionary <string, SDOrderer> ordererEndpoints = new Dictionary <string, SDOrderer>();
                        Dictionary <string, Endpoints> orderersMap      = configResult.Orderers.ToDictionary(a => a.Key, a => a.Value);
                        foreach (string mspid in orderersMap.Keys)
                        {
                            Endpoints value = orderersMap[mspid];
                            foreach (Protos.Discovery.Endpoint l in value.Endpoint)
                            {
                                string endpoint = l.Host + ":" + l.Port.ToString().ToLowerInvariant().Trim();
                                logger.Trace($"Channel {channelName} discovered orderer MSPID: {mspid}, endpoint: {endpoint}");
                                SDOrderer sdOrderer = new SDOrderer(channel, mspid, endpoint, lsdNetwork.GetTlsCerts(mspid), lsdNetwork.GetTlsIntermediateCerts(mspid));
                                ordererEndpoints[sdOrderer.Endpoint] = sdOrderer;
                            }
                        }

                        lsdNetwork.SetOrdererEndpoints(ordererEndpoints);
                        PeerMembershipResult            membership = queryResult2.Members;
                        Dictionary <string, SDEndorser> endorsers  = new Dictionary <string, SDEndorser>();
                        foreach (string mspId in membership.PeersByOrg.Keys)
                        {
                            Peers peer = membership.PeersByOrg[mspId];
                            foreach (Protos.Discovery.Peer pp in peer.Peers_)
                            {
                                SDEndorser ppp = new SDEndorser(channel, pp, lsdNetwork.GetTlsCerts(mspId), lsdNetwork.GetTlsIntermediateCerts(mspId));
                                logger.Trace($"Channel {channelName} discovered peer MSPID: {mspId}, endpoint: {ppp.Endpoint}");
                                endorsers[ppp.Endpoint] = ppp;
                            }
                        }

                        lsdNetwork.SetEndorsers(endorsers);
                        lsdNetwork.End();
                        sdNetwork = lsdNetwork;
                        ret       = lsdNetwork;
                        break;
                    }
                    catch (Exception e)
                    {
                        logger.Warn($"Channel {channelName} peer {serviceDiscoveryPeer} service discovery error {e.Message}");
                    }
                }

                logger.Debug($"Channel {channelName} service discovery completed: {ret != null}");
                return(ret);
            }
        }
Ejemplo n.º 19
0
        public async Task <Dictionary <string, SDChaindcode> > DiscoverEndorserEndpointsAsync(TransactionContext tContext, List <List <ServiceDiscoveryChaincodeCalls> > chaincodeNames, CancellationToken token = default(CancellationToken))
        {
            if (null == chaincodeNames)
            {
                logger.Warn("Discover of chaincode names was null.");
                return(new Dictionary <string, SDChaindcode>());
            }

            if (chaincodeNames.Count == 0)
            {
                logger.Warn("Discover of chaincode names was empty.");
                return(new Dictionary <string, SDChaindcode>());
            }

            if (IS_DEBUG_LEVEL)
            {
                StringBuilder cns = new StringBuilder(1000);
                string        sep = "";
                cns.Append("[");
                foreach (List <ServiceDiscoveryChaincodeCalls> s in chaincodeNames)
                {
                    ServiceDiscoveryChaincodeCalls n = s[0];
                    cns.Append(sep).Append(n.Write(s.GetRange(1, s.Count - 1)));
                    sep = ", ";
                }

                cns.Append("]");
                logger.Debug($"Channel {channelName} doing discovery for chaincodes: {cns}");
            }

            List <Peer> speers = serviceDiscoveryPeers.Shuffle().ToList();
            Dictionary <string, SDChaindcode> ret = new Dictionary <string, SDChaindcode>();

            sdNetwork = await NetworkDiscoveryAsync(tContext, false, token).ConfigureAwait(false);

            token.ThrowIfCancellationRequested();
            ServiceDiscoveryException serviceDiscoveryException = null;

            foreach (Peer serviceDiscoveryPeer in speers)
            {
                serviceDiscoveryException = null;
                try
                {
                    logger.Debug($"Channel {channelName} doing discovery for chaincodes on peer: {serviceDiscoveryPeer}");
                    TransactionContext ltransactionContext        = tContext.RetryTransactionSameContext();
                    byte[]             clientTLSCertificateDigest = serviceDiscoveryPeer.GetClientTLSCertificateDigest();
                    if (null == clientTLSCertificateDigest)
                    {
                        logger.Warn($"Channel {channelName} peer {serviceDiscoveryPeer} requires mutual tls for service discovery.");
                        continue;
                    }

                    ByteString clientIdent    = ltransactionContext.Identity.ToByteString();
                    ByteString tlshash        = ByteString.CopyFrom(clientTLSCertificateDigest);
                    AuthInfo   authentication = new AuthInfo();
                    authentication.ClientIdentity    = clientIdent;
                    authentication.ClientTlsCertHash = tlshash;
                    List <Query> fq = new List <Query>(chaincodeNames.Count);
                    foreach (List <ServiceDiscoveryChaincodeCalls> chaincodeName in chaincodeNames)
                    {
                        if (ret.ContainsKey(chaincodeName[0].Name))
                        {
                            continue;
                        }

                        List <ChaincodeCall> chaincodeCalls = new List <ChaincodeCall>();
                        chaincodeName.ForEach(serviceDiscoveryChaincodeCalls => chaincodeCalls.Add(serviceDiscoveryChaincodeCalls.Build()));
                        List <ChaincodeInterest> cinn = new List <ChaincodeInterest>(1);
                        //chaincodeName.ForEach(ServiceDiscoveryChaincodeCalls.Build);
                        ChaincodeInterest cci = new ChaincodeInterest();
                        cci.Chaincodes.Add(chaincodeCalls);
                        cinn.Add(cci);
                        ChaincodeQuery chaincodeQuery = new ChaincodeQuery();
                        chaincodeQuery.Interests.AddRange(cinn);
                        Query q = new Query();
                        q.Channel = channelName;
                        q.CcQuery = chaincodeQuery;
                        fq.Add(q);
                    }

                    if (fq.Count == 0)
                    {
                        //this would be odd but lets take care of it.
                        break;
                    }

                    Request request = new Request();
                    request.Queries.AddRange(fq);
                    request.Authentication = authentication;
                    ByteString    payloadBytes   = request.ToByteString();
                    ByteString    signatureBytes = ltransactionContext.SignByteStrings(payloadBytes);
                    SignedRequest sr             = new SignedRequest();
                    sr.Payload   = payloadBytes;
                    sr.Signature = signatureBytes;
                    if (IS_TRACE_LEVEL && null != diagnosticFileDumper) // dump protobuf we sent
                    {
                        logger.Trace($"Service discovery channel {channelName} {serviceDiscoveryPeer} service chaincode query sent {diagnosticFileDumper.CreateDiagnosticProtobufFile(sr.ToByteArray())}");
                    }
                    logger.Debug($"Channel {channelName} peer {serviceDiscoveryPeer} sending chaincode query request");
                    Response response = await serviceDiscoveryPeer.SendDiscoveryRequestAsync(sr, SERVICE_DISCOVERY_WAITTIME, token).ConfigureAwait(false);

                    if (IS_TRACE_LEVEL && null != diagnosticFileDumper) // dump protobuf we get
                    {
                        logger.Trace($"Service discovery channel {channelName} {serviceDiscoveryPeer} query returned {diagnosticFileDumper.CreateDiagnosticProtobufFile(response.ToByteArray())}");
                    }
                    logger.Debug($"Channel {channelName} peer {serviceDiscoveryPeer} completed chaincode query request");
                    //serviceDiscoveryPeer.HasConnected();
                    foreach (QueryResult queryResult in response.Results)
                    {
                        if (queryResult.ResultCase == QueryResult.ResultOneofCase.Error)
                        {
                            ServiceDiscoveryException discoveryException = new ServiceDiscoveryException($"Error {queryResult.Error.Content}");
                            logger.Error(discoveryException.Message);
                            continue;
                        }

                        if (queryResult.ResultCase != QueryResult.ResultOneofCase.CcQueryRes)
                        {
                            ServiceDiscoveryException discoveryException = new ServiceDiscoveryException($"Error expected chaincode endorsement query but got {queryResult.ResultCase.ToString()}");
                            logger.Error(discoveryException.Message);
                            continue;
                        }

                        ChaincodeQueryResult ccQueryRes = queryResult.CcQueryRes;
                        if (ccQueryRes.Content.Count == 0)
                        {
                            throw new ServiceDiscoveryException($"Error {queryResult.Error.Content}");
                        }

                        foreach (EndorsementDescriptor es in ccQueryRes.Content)
                        {
                            string          chaincode = es.Chaincode;
                            List <SDLayout> layouts   = new List <SDLayout>();
                            foreach (Layout layout in es.Layouts)
                            {
                                SDLayout sdLayout = null;
                                Dictionary <string, uint> quantitiesByGroupMap = layout.QuantitiesByGroup.ToDictionary(a => a.Key, a => a.Value);
                                foreach (string key in quantitiesByGroupMap.Keys)
                                {
                                    uint quantity = quantitiesByGroupMap[key];
                                    if (quantity < 1)
                                    {
                                        continue;
                                    }

                                    Peers peers = es.EndorsersByGroups.GetOrNull(key);
                                    if (peers == null || peers.Peers_.Count == 0)
                                    {
                                        continue;
                                    }

                                    List <SDEndorser> sdEndorsers = new List <SDEndorser>();

                                    foreach (Protos.Discovery.Peer pp in peers.Peers_)
                                    {
                                        SDEndorser ppp      = new SDEndorser(channel, pp, null, null);
                                        string     endPoint = ppp.Endpoint;
                                        SDEndorser nppp     = sdNetwork.GetEndorserByEndpoint(endPoint);
                                        if (null == nppp)
                                        {
                                            sdNetwork = await NetworkDiscoveryAsync(tContext, true, token).ConfigureAwait(false);

                                            if (null == sdNetwork)
                                            {
                                                throw new ServiceDiscoveryException("Failed to discover network resources.");
                                            }

                                            nppp = sdNetwork.GetEndorserByEndpoint(ppp.Endpoint);
                                            if (null == nppp)
                                            {
                                                throw new ServiceDiscoveryException($"Failed to discover peer endpoint information {ppp.Endpoint} for chaincode {chaincode}");
                                            }
                                        }

                                        sdEndorsers.Add(nppp);
                                    }

                                    if (sdLayout == null)
                                    {
                                        sdLayout = new SDLayout();
                                        layouts.Add(sdLayout);
                                    }

                                    sdLayout.AddGroup(key, (int)quantity, sdEndorsers);
                                }
                            }

                            if (layouts.Count == 0)
                            {
                                logger.Warn($"Channel {channelName} chaincode {chaincode} discovered no layouts!");
                            }
                            else
                            {
                                if (IS_DEBUG_LEVEL)
                                {
                                    StringBuilder sb = new StringBuilder(1000);
                                    sb.Append("Channel ").Append(channelName).Append(" found ").Append(layouts.Count).Append(" layouts for chaincode: ").Append(es.Chaincode);

                                    sb.Append(", layouts: [");

                                    string sep = "";
                                    foreach (SDLayout layout in layouts)
                                    {
                                        sb.Append(sep).Append(layout);

                                        sep = ", ";
                                    }

                                    sb.Append("]");

                                    logger.Debug(sb.ToString());
                                }

                                ret[chaincode] = new SDChaindcode(es.Chaincode, layouts);
                            }
                        }
                    }

                    if (ret.Count == chaincodeNames.Count)
                    {
                        break; // found them all.
                    }
                }
                catch (ServiceDiscoveryException e)
                {
                    logger.Warn($"Service discovery error on peer {serviceDiscoveryPeer}. Error: {e.Message}");
                    serviceDiscoveryException = e;
                }
                catch (Exception e)
                {
                    logger.Warn($"Service discovery error on peer {serviceDiscoveryPeer}. Error: {e.Message}");
                    serviceDiscoveryException = new ServiceDiscoveryException(e.Message, e);
                }
            }

            if (null != serviceDiscoveryException)
            {
                throw serviceDiscoveryException;
            }

            if (ret.Count != chaincodeNames.Count())
            {
                logger.Warn($"Channel {channelName} failed to find all layouts for chaincodes. Expected: {chaincodeNames.Count} and found: {ret.Count}");
            }

            return(ret);
        }