/// <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); } }