Beispiel #1
0
        //背书 peer
        public Task <EndorseResponse> Endorse(EndorseRequest request)
        {
            var node = _nodePeer.GetNode(request.ChannelId);

            if (node == null)
            {
                throw new Exception($"节点未加入{request.ChannelId} 通道");
            }
            return(node.Endorse(request.Request));
        }
Beispiel #2
0
        public async Task <EndorseResponse> Endorse(EndorseRequest request)
        {
            try
            {
                var model = new NetRequest
                {
                    Data = Newtonsoft.Json.JsonConvert.SerializeObject(request)
                };
                var rs = await GetClient().EndorseAsync(model);

                return(Newtonsoft.Json.JsonConvert.DeserializeObject <EndorseResponse>(rs.Data));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
                return(new EndorseResponse()
                {
                    Status = false,
                    Msg = ex.Message
                });
            }
        }
Beispiel #3
0
        /// <summary>
        /// 交易背书
        /// </summary>
        /// <param name="endorseRequest"></param>
        /// <returns></returns>
        public async Task <EndorseResponse> Endorse(EndorseRequest request)
        {
            try
            {
                var         client  = _httpClientFactory.CreateClient(QMRaftCore.Config.VoteHttpClientName);
                HttpContent content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request));
                content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(this.Id + "/api/Tx/Endorse", content); //改成自己的

                response.EnsureSuccessStatusCode();                                          //用来抛异常的
                var responseBody = await response.Content.ReadAsStringAsync();

                var model = Newtonsoft.Json.JsonConvert.DeserializeObject <EndorseResponse>(responseBody);
                return(model);
            }
            catch (Exception e)
            {
                return(new EndorseResponse {
                    Status = false, Msg = e.Message
                });
            }
        }
Beispiel #4
0
        //peer级别

        //[Authorize(Roles = "Peer")]
        public async Task <JsonResult> Endorse(EndorseRequest request)
        {
            var rs = await _txService.Endorse(request);

            return(new JsonResult(rs));
        }
Beispiel #5
0
        /// <summary>
        /// 将交易发给需要背书的背书节点
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <TxResponse> Transaction(TxRequest request)
        {
            var requestData = request.Data;

            var txResponse = new TxResponse();
            //获取链码配置中的背书节点,
            var peers          = _configProviders.GetEndorsePeer(requestData.Channel.Chaincode);
            var taskList       = new Dictionary <string, Task <EndorseResponse> >();
            var endorseDir     = new Dictionary <string, EndorseResponse>();
            var endorseRequest = new EndorseRequest
            {
                ChannelId = request.Header.ChannelId,
                Request   = request
            };

            //添加背书task
            foreach (var item in peers)
            {
                if (item.Id == CurrentState.Id)
                {
                    taskList.Add(item.Id, Endorse(request));
                }
                else
                {
                    taskList.Add(item.Id, item.Endorse(endorseRequest));
                }
            }
            var txResult = false;
            var count    = 0;

            while (true)
            {
                taskList = taskList.Where(p => !endorseDir.ContainsKey(p.Key)).ToDictionary(p => p.Key, p => p.Value);
                //如果没有进行过背书 则返回false
                if (taskList.Count() == 0)
                {
                    txResponse.Msg = "不满足背书策略";
                    break;
                }
                foreach (var item in taskList)
                {
                    if (item.Value.IsCompleted)
                    {
                        endorseDir.Add(item.Key, await item.Value);
                    }
                }
                ///验证背书策略
                var rs = _configProviders.ValidateEndorse(requestData.Channel.Chaincode, endorseDir);
                if (rs)
                {
                    txResult = true;
                    break;
                }
                Thread.Sleep(20);
                if (count * 20 > _configProviders.GetEndorseTimeOut())
                {
                    txResponse.Msg = "背书超时";
                    break;
                }
            }
            //如果背书策略通过
            if (txResult)
            {
                //交易封装对象 交易头 背书结果 背书签名
                var envelopr = new Envelope
                {
                    TxReqeust = request
                };
                var endorses = endorseDir.Select(p => p.Value).ToList();
                foreach (var item in endorses)
                {
                    //将背书结果赋值给交易信封  只需要赋值一次
                    if (envelopr.PayloadReponse.Status == false)
                    {
                        envelopr.PayloadReponse.Status         = item.Status;
                        envelopr.PayloadReponse.Message        = item.Msg;
                        envelopr.PayloadReponse.TxReadWriteSet = item.TxReadWriteSet;
                    }
                    envelopr.Endorsements.Add(item.Endorsement);
                }

                //交易加入交易池中
                _node.TxPool.Add(envelopr);
                return(new TxResponse()
                {
                    Status = true, Msg = "等待上链", TxId = request.Data.TxId
                });

                /*
                 * //var statusRs = await _node.TxPool.TxStatus(envelopr.TxReqeust.Data.TxId);
                 * if (statusRs == "0")
                 * {
                 *  txResponse.Status = true;
                 *  txResponse.Msg = "上链成功";
                 * }
                 * if (statusRs == "1")
                 * {
                 *  txResponse.Status = false;
                 *  txResponse.Msg = "上链失败";
                 * }
                 * if (statusRs == "2")
                 * {
                 *  txResponse.Status = true;
                 *  txResponse.Msg = "服务器忙";
                 * }
                 */
                //return txResponse;
            }
            else
            {
                //失败的
                var errorTx = endorseDir.Where(p => p.Value.Status == false).Select(p => p.Key + ":" + p.Value.Msg).ToList();
                txResponse.Msg    = "背书失败";
                txResponse.Data   = errorTx;
                txResponse.Status = false;
                txResponse.TxId   = request.Data.TxId;
                return(txResponse);
            }
        }