/// <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 }); } }
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 }); } }
//加入某个通道或者启动某个通道 前提是通道中已经配置了该节点 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失败" }); } }
//查询交易 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)); }
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); } } })); }
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); }
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); }
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); } }
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 }); } }
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); }
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); }
//执行交易 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)); }
//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) }); } }
//peer //[Authorize] //加入通道 public async Task <JsonResult> JoinChannel(TxHeader request) { var rs = await _txService.JoinChannel(request); return(new JsonResult(rs)); }
public async Task <TxResponse> InvokeTx(TxHeader request) { request.Type = TxType.Invoke; return(await _client.TxInvoke(request)); }
public async Task <TxResponse> QueryTx(TxHeader request) { request.Type = TxType.Query; return(await _client.TxQuery(request)); }
/// <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 }); }
public async Task <JsonResult> QueryTx(TxHeader request) { var rs = await _txService.QueryTx(request); return(new JsonResult(rs)); }