//区块分发 peer public Task <HandOutResponse> BlockHandOut(HandOutRequest request) { var node = _nodePeer.GetNode(request.ChannelId); if (node == null) { throw new Exception($"节点未加入{request.ChannelId} 通道"); } return(node.Handle(request)); }
public async Task <HandOutResponse> BlockHandOut(Block block) { //如果不是leader节点不能分发区块 var request = new HandOutRequest(); request.Block = block; request.ChannelId = GetChannelId(); request.Type = HandOutType.CheckSave; var rs = await Handle(request); return(rs); }
public async Task <HandOutResponse> BlockHandOut(HandOutRequest request) { //follower节点是接受区块 switch (request.Type) { case HandOutType.CheckSave: return(await CheckBlockAndSave(request.Block)); case HandOutType.Commit: return(await CommitBlock(request.Block)); default: return(new HandOutResponse() { Success = false, Message = "" }); } }
public async Task <HandOutResponse> BlockHandOut(HandOutRequest request) { try { var model = new NetRequest { Data = Newtonsoft.Json.JsonConvert.SerializeObject(request) }; var rs = await GetClient().BlockHandOutAsync(model); return(Newtonsoft.Json.JsonConvert.DeserializeObject <HandOutResponse>(rs.Data)); } catch (Exception ex) { _logger.LogError(ex, ex.Message); return(new HandOutResponse() { Message = ex.Message, Success = false }); } }
public async Task <HandOutResponse> BlockHandOut(HandOutRequest 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/Block/HandOut", content); //改成自己的 response.EnsureSuccessStatusCode(); //用来抛异常的 var responseBody = await response.Content.ReadAsStringAsync(); var model = Newtonsoft.Json.JsonConvert.DeserializeObject <HandOutResponse>(responseBody); return(model); } catch (Exception e) { return(new HandOutResponse { Success = false, Message = e.Message }); } }
/// <summary> /// 节点将区块扩散 /// </summary> /// <param name="block"></param> /// <returns></returns> public async Task <HandOutResponse> Handle(HandOutRequest request) { var rs = await State.BlockHandOut(request); return(rs); }
//peer级别 //[Authorize(Roles = "Peer")] public async Task <JsonResult> BlockHandOut(HandOutRequest request) { var rs = await _txService.BlockHandOut(request); return(new JsonResult(rs)); }
/// <summary> /// leader节点分发区块 /// </summary> /// <param name="request"></param> /// <returns></returns> public async Task <HandOutResponse> BlockHandOut(HandOutRequest request) { var response = new HandOutResponse(); //获取所有的节点 var peers = _configProviders.GetAllPeer(); //获取需求远程请求服务的节点 var notself = peers.Where(p => p.Id != CurrentState.Id).ToList(); //如果没有其他节点 本地提交区块 则返回结果 if (notself.Count() == 0) { await _blockDataManager.PutOnChainBlockAsync(request.Block); response.Success = true; return(response); } //分发区块 List <Task <HandOutResponse> > taskList = new List <Task <HandOutResponse> >(); var handOutRequest = new HandOutRequest { Block = request.Block, Type = HandOutType.CheckSave, ChannelId = request.ChannelId }; foreach (var item in notself) { taskList.Add(item.BlockHandOut(handOutRequest)); } var rightcount = 1; var badcount = 0; //区块分发的校验成功的数量是否大于二分之一 var checkback = false; while (true) { for (var i = 0; i < taskList.Count; i++) { if (taskList[i].IsCompleted) { var rs = await taskList[i]; taskList.RemoveAt(i); i--; if (rs.Success) { rightcount++; //如果投票数量大于一半 //这里获取的peer不包括本节点 if (rightcount >= ((peers.Count / 2) + 1)) { checkback = true; break; } } else { badcount++; if (badcount >= ((peers.Count / 2) + 1)) { checkback = false; break; } } } } if (taskList.Count == 0) { break; } System.Threading.Thread.Sleep(10); } //如过校验区块成功 if (checkback) { //本地保存区块 //通知节点本地保存区块 var commitHandOutRequest = new HandOutRequest { Block = request.Block, ChannelId = _node.GetChannelId(), Type = HandOutType.Commit }; foreach (var item in notself) { taskList.Add(item.BlockHandOut(commitHandOutRequest)); } //返回 var putonRS = await _blockDataManager.PutOnChainBlockAsync(request.Block); if (putonRS) { response.Success = true; response.Message = "block save successful"; } else { response.Success = false; response.Message = "上链失败"; } return(response); } else { response.Success = false; response.Message = "follower check block err"; return(response); } }