Example #1
0
        //区块分发 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));
        }
Example #2
0
        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);
        }
Example #3
0
        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 = ""
                });
            }
        }
Example #4
0
        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
                });
            }
        }
Example #5
0
        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
                });
            }
        }
Example #6
0
        /// <summary>
        /// 节点将区块扩散
        /// </summary>
        /// <param name="block"></param>
        /// <returns></returns>
        public async Task <HandOutResponse> Handle(HandOutRequest request)
        {
            var rs = await State.BlockHandOut(request);

            return(rs);
        }
Example #7
0
        //peer级别

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

            return(new JsonResult(rs));
        }
Example #8
0
        /// <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);
            }
        }