//背书 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)); }
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 }); } }
/// <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 }); } }
//peer级别 //[Authorize(Roles = "Peer")] public async Task <JsonResult> Endorse(EndorseRequest request) { var rs = await _txService.Endorse(request); return(new JsonResult(rs)); }
/// <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); } }