Exemplo n.º 1
0
        /// <summary>
        /// 交易执行
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task <TxResponse> TxInvoke(TxHeader request)
        {
            try
            {
                if (string.IsNullOrEmpty(_token))
                {
                    //使用身份登录
                }
                using (var client = _httpClientFactory.CreateClient())
                {
                    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.Url + "/api/tx/invoke", content); //改成自己的

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

                    return(Newtonsoft.Json.JsonConvert.DeserializeObject <TxResponse>(responseBody));
                }
            }
            catch (Exception ex)
            {
                return(new TxResponse()
                {
                    Msg = ex.Message,
                    Status = false
                });
            }
        }
Exemplo n.º 2
0
        public async Task <TxResponse> TxInvoke(TxHeader request)
        {
            try
            {
                if (string.IsNullOrEmpty(_token))
                {
                    //使用身份登录
                }

                QMBlockClientSDK.Client.TxHeader model = new Client.TxHeader()
                {
                    Data = Newtonsoft.Json.JsonConvert.SerializeObject(request)
                };
                var rs = await Client.InvokeTxAsync(model, Header);

                return(Newtonsoft.Json.JsonConvert.DeserializeObject <TxResponse>(rs.Data));
            }
            catch (Exception ex)
            {
                return(new TxResponse()
                {
                    Msg = ex.Message,
                    Status = false
                });
            }
        }
Exemplo n.º 3
0
        //加入某个通道或者启动某个通道 前提是通道中已经配置了该节点
        public async Task <TxResponse> JoinChannel(TxHeader request)
        {
            var channel = _nodePeer.GetNode(request.ChannelId);

            if (channel != null)
            {
                return(new TxResponse()
                {
                    Status = false,
                    Msg = $"通道 {request.ChannelId} 已存在"
                });
            }
            //如果是加入通道
            if (request.ChaincodeName == QMBlockSDK.CC.ConfigKey.SysNetConfigChaincode &&
                request.FuncName == QMBlockSDK.CC.ConfigKey.JoinChannelFunc)
            {
                return(await _nodePeer.JoinChannel(request.ChannelId));
            }
            else
            {
                return(new TxResponse()
                {
                    Status = false,
                    Msg = "加入channel失败"
                });
            }
        }
Exemplo n.º 4
0
        //查询交易 member
        public async Task <TxResponse> QueryTx(TxHeader request)
        {
            var txRequest = ModelHelper.ToTxRequest(request);
            var node      = _nodePeer.GetNode(request.ChannelId);

            if (node == null)
            {
                throw new Exception($"节点未加入{request.ChannelId} 通道");
            }
            return(await node.TransactionCommit(txRequest));
        }
Exemplo n.º 5
0
        private async Task <TxResponse> ListenTx(TxHeader txHeader)
        {
            var factory = new ConnectionFactory()
            {
                HostName = "localhost"
            };

            return(await Task.Run(() =>
            {
                var status = false;
                TxResponse response = null;
                using (var connection = factory.CreateConnection())
                    using (var channel = connection.CreateModel())
                    {
                        channel.ExchangeDeclare(txHeader.ChannelId, ExchangeType.Direct, true, false, null);
                        var queueName = channel.QueueDeclare().QueueName;
                        channel.QueueBind(queueName, txHeader.ChannelId, txHeader.TxHeaderId);
                        var consumer = new EventingBasicConsumer(channel);
                        consumer.Received += (model, ea) =>
                        {
                            try
                            {
                                var body = ea.Body.ToArray();
                                var message = Encoding.UTF8.GetString(body);
                                Console.WriteLine(message);
                                response = Newtonsoft.Json.JsonConvert.DeserializeObject <TxResponse>(message);
                            }
                            catch (Exception ex)
                            {
                                response = new TxResponse
                                {
                                    Status = false,
                                    Msg = "反序列化TxResponse失败"
                                };
                                _logger.LogError(ex, ex.Message);
                            }
                            finally
                            {
                                status = true;
                            }
                        };
                        channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);
                        while (true)
                        {
                            if (status)
                            {
                                return response;
                            }
                            System.Threading.Thread.Sleep(200);
                        }
                    }
            }));
        }
Exemplo n.º 6
0
        public async Task <TxResponse> InstallChaincode(string channelId, ChaincodeModel config)
        {
            var txHeader = new TxHeader
            {
                Args          = new string[] { config.Name, config.Namespace, config.Version, config.Policy },
                ChaincodeName = ConfigKey.SysCodeLifeChaincode,
                FuncName      = ConfigKey.InstallChaincodeFunc,
                ChannelId     = channelId
            };

            return(await _service.InvokeTx(txHeader));

            //return await _client.TxInvoke(txHeader);
        }
Exemplo n.º 7
0
        public static TxRequest ToTxRequest(TxHeader header)
        {
            var txRequest = new TxRequest();

            txRequest.Header = header;
            txRequest.Data.Channel.ChannelId = header.ChannelId;
            txRequest.Data.TxId      = Guid.NewGuid().ToString();
            txRequest.Data.Type      = header.Type;
            txRequest.Data.Timestamp = DateTime.Now.Ticks;
            txRequest.Data.Channel.Chaincode.FuncName = header.FuncName;
            txRequest.Data.Channel.Chaincode.Args     = header.Args;
            txRequest.Data.Channel.Chaincode.Name     = header.ChaincodeName;
            return(txRequest);
        }
Exemplo n.º 8
0
        public async Task <TxResponse> InvokeTxWaitResult(TxHeader request)
        {
            request.Type = TxType.Invoke;
            //开始监听
            var task     = ListenTx(request);
            var response = await _client.TxInvoke(request);

            //如果状态是true 则等待上链中,返回监听结果
            if (response.Status)
            {
                return(await task);
            }
            else
            {
                //结束监听 返回错误结果
                //task.
                return(response);
            }
        }
Exemplo n.º 9
0
        public async Task <TxResponse> TxQuery(TxHeader request)
        {
            try
            {
                QMBlockClientSDK.Client.TxHeader model = new Client.TxHeader()
                {
                    Data = Newtonsoft.Json.JsonConvert.SerializeObject(request)
                };
                var rs = await Client.QueryTxAsync(model, Header);

                return(Newtonsoft.Json.JsonConvert.DeserializeObject <TxResponse>(rs.Data));
            }
            catch (Exception ex)
            {
                return(new TxResponse()
                {
                    Msg = ex.Message,
                    Status = false
                });
            }
        }
Exemplo n.º 10
0
        public async Task <TxResponse> AddOrg(string channelid, OrgConfig config)
        {
            if (string.IsNullOrEmpty(config.Address))
            {
                throw new Exception("请输入组织地址");
            }
            if (string.IsNullOrEmpty(config.Name))
            {
                throw new Exception("请输入组织名称");
            }
            if (string.IsNullOrEmpty(config.OrgId))
            {
                throw new Exception("请输入组织ID");
            }
            if (config.Certificate == null)
            {
                throw new Exception("未找到组织证书");
            }

            var checkRs = RSAHelper.VerifyData(config.Certificate.TBSCertificate.PublicKey, Newtonsoft.Json.JsonConvert.SerializeObject(config.Certificate.TBSCertificate), config.Certificate.SignatureValue);

            if (!checkRs)
            {
                throw new Exception("证书校验不通过");
            }

            var txHeader = new TxHeader
            {
                Args          = new string[] { Newtonsoft.Json.JsonConvert.SerializeObject(config) },
                ChaincodeName = ConfigKey.SysNetConfigChaincode,
                FuncName      = ConfigKey.AddOrgFunc,
                Type          = TxType.Invoke,
                ChannelId     = channelid
            };

            return(await _service.InvokeTx(txHeader));

            //return await _client.TxInvoke(txHeader);
        }
Exemplo n.º 11
0
        public async Task <TxResponse> InitChaincode(string channelId, string chaincodeName, string[] args)
        {
            var txHeader = new TxHeader();
            var list     = new List <string>
            {
                chaincodeName
            };

            foreach (var item in args)
            {
                list.Add(item);
            }

            txHeader.Args          = list.ToArray();
            txHeader.ChaincodeName = ConfigKey.SysCodeLifeChaincode;
            txHeader.FuncName      = ConfigKey.InitChaincodeFunc;
            txHeader.Type          = TxType.Invoke;
            txHeader.ChannelId     = channelId;
            return(await _service.InvokeTx(txHeader));

            //return await _client.TxInvoke(txHeader);
        }
Exemplo n.º 12
0
        //执行交易 member
        public async Task <TxResponse> InvokeTx(TxHeader request)
        {
            //如果是初始化通道
            if (request.ChaincodeName == QMBlockSDK.CC.ConfigKey.SysNetConfigChaincode &&
                request.FuncName == QMBlockSDK.CC.ConfigKey.InitChannelFunc)
            {
                return(await InitChannel(request));
            }
            //如果是加入通道
            if (request.ChaincodeName == QMBlockSDK.CC.ConfigKey.SysNetConfigChaincode &&
                request.FuncName == QMBlockSDK.CC.ConfigKey.JoinChannelFunc)
            {
                return(await JoinChannel(request));
            }//其他情况是执行链码
            var txRequest = ModelHelper.ToTxRequest(request);
            var node      = _nodePeer.GetNode(request.ChannelId);

            if (node == null)
            {
                throw new Exception($"节点未加入{request.ChannelId} 通道");
            }
            return(await node.TransactionCommit(txRequest));
        }
Exemplo n.º 13
0
        //peer
        //[Authorize]
        //创建新通道并且启动
        public override async Task <TxResponse> InitChannel(TxHeader request, ServerCallContext context)
        {
            try
            {
                var model = Newtonsoft.Json.JsonConvert.DeserializeObject <QMBlockSDK.TX.TxHeader>(request.Data);
                var rs    = await _txService.InitChannel(model);

                return(new TxResponse()
                {
                    Data = Newtonsoft.Json.JsonConvert.SerializeObject(rs)
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
                var rs = new QMBlockSDK.TX.TxResponse();
                rs.Msg    = ex.Message;
                rs.Status = false;
                return(new TxResponse()
                {
                    Data = Newtonsoft.Json.JsonConvert.SerializeObject(rs)
                });
            }
        }
Exemplo n.º 14
0
        //peer
        //[Authorize]
        //加入通道
        public async Task <JsonResult> JoinChannel(TxHeader request)
        {
            var rs = await _txService.JoinChannel(request);

            return(new JsonResult(rs));
        }
Exemplo n.º 15
0
 public async Task <TxResponse> InvokeTx(TxHeader request)
 {
     request.Type = TxType.Invoke;
     return(await _client.TxInvoke(request));
 }
Exemplo n.º 16
0
 public async Task <TxResponse> QueryTx(TxHeader request)
 {
     request.Type = TxType.Query;
     return(await _client.TxQuery(request));
 }
Exemplo n.º 17
0
        /// <summary>
        /// 创建新通道 默认只加载本地的节点
        /// </summary>
        /// <param name="channelName"></param>
        public async Task <TxResponse> CreateNewChannel(string channelId)
        {
            //创建交易请求
            var txHeader = new TxHeader();

            txHeader.ChannelId     = channelId;
            txHeader.Type          = TxType.Invoke;
            txHeader.ChaincodeName = ConfigKey.SysNetConfigChaincode;
            txHeader.FuncName      = ConfigKey.InitChannelFunc;
            txHeader.Args          = new string[] { channelId };

            var tx = ModelHelper.ToTxRequest(txHeader);

            EndorseResponse response = new EndorseResponse();
            var             result   = ChainCodeSubmit(tx).Result;

            if (result.StatusCode != StatusCode.Successful)
            {
                return(new TxResponse()
                {
                    Status = false, Msg = result.Message
                });
            }
            response.TxReadWriteSet       = result.TxReadWriteSet;
            response.Status               = true;
            response.Msg                  = "背书完成";
            response.Endorsement.Identity = _configProvider.GetPublicIndentity();
            var str        = Newtonsoft.Json.JsonConvert.SerializeObject(response);
            var privatekey = _configProvider.GetPrivateKey();

            //节点对背书数据签名
            response.Endorsement.Signature = RSAHelper.SignData(privatekey, response);

            Envelope envelope = new Envelope();

            envelope.TxReqeust = tx;
            envelope.Endorsements.Add(response.Endorsement);
            envelope.PayloadReponse                = new ProposaResponsePayload();
            envelope.PayloadReponse.Message        = response.Msg;
            envelope.PayloadReponse.Status         = response.Status;
            envelope.PayloadReponse.TxReadWriteSet = response.TxReadWriteSet;

            var block = new Block();

            block.Header.ChannelId = channelId;
            block.Header.Number    = 0;
            block.Header.Term      = 0;
            block.Header.Timestamp = DateTime.Now.Ticks;
            block.Data.Envelopes.Add(envelope);
            block.Signer.Identity = _configProvider.GetPublicIndentity();
            //计算hash·
            block.Header.DataHash = RSAHelper.GenerateMD5(Newtonsoft.Json.JsonConvert.SerializeObject(block));
            //对整个区块进行签名
            block.Signer.Signature = RSAHelper.SignData(_configProvider.GetPrivateKey(), block);
            //上链
            await _dataManager.PutOnChainBlockAsync(block);

            return(new TxResponse()
            {
                Status = true
            });
        }
Exemplo n.º 18
0
        public async Task <JsonResult> QueryTx(TxHeader request)
        {
            var rs = await _txService.QueryTx(request);

            return(new JsonResult(rs));
        }