public Task <ChainCodeInvokeResponse> ChaincodeInit(TxRequest request) { if (request.Data.Type != TxType.Invoke) { return(Task.FromResult(new ChainCodeInvokeResponse() { StatusCode = StatusCode.BAD_TX_TYPE })); } var stub = GetChaincodeStub(request); var chaincode = new Chaincode(); chaincode.NameSpace = stub.GetChaincodeNameSpace(); chaincode.Name = stub.GetChaincodeName(); chaincode.Version = stub.GetChaincodeVersion(); var ass = _assemblyProvider.GetAssembly(stub.GetChannelId(), stub.GetChaincodeName(), stub.GetChaincodeNameSpace(), stub.GetChaincodeVersion()); var classfullname = chaincode.NameSpace + "." + chaincode.Name; //必须使用 名称空间+类名称 var type = ass.GetType(classfullname); //方法的名称 MethodInfo method = type.GetMethod("Init"); //必须使用名称空间+类名称 var obj = ass.CreateInstance(classfullname); var rs = method.Invoke(obj, new object[] { stub }); if (rs != null) { return(Task.FromResult((ChainCodeInvokeResponse)rs)); } return(null); }
private Task <ChainCodeInvokeResponse> ChaincodeInvoke(IChaincodeStub stub) { try { var chaincode = new Chaincode(); chaincode.NameSpace = stub.GetChaincodeNameSpace(); chaincode.Name = stub.GetChaincodeName(); chaincode.Version = stub.GetChaincodeVersion(); var ass = _assemblyProvider.GetAssembly(stub.GetChannelId(), stub.GetChaincodeName(), stub.GetChaincodeNameSpace(), stub.GetChaincodeVersion()); var classfullname = chaincode.NameSpace + "." + chaincode.Name; //必须使用 名称空间+类名称 var type = ass.GetType(classfullname); //方法的名称 MethodInfo method = type.GetMethod("Invoke"); //必须使用名称空间+类名称 var obj = ass.CreateInstance(classfullname); var rs = method.Invoke(obj, new object[] { stub }); if (rs != null) { return(Task.FromResult((ChainCodeInvokeResponse)rs)); } } catch (Exception ex) { return(null); } return(null); }
public bool ValidateEndorse(Chaincode chainCode, Dictionary <string, EndorseResponse> endorseDir) { _logger.LogInformation("开始校验背书策略"); foreach (var item in endorseDir) { if (item.Value.Status == false) { return(false); } } //验证背书节点的策略 var peers = GetEndorsePeer(chainCode); var channelconfig = _dataManager.GetChannelConfig(); //获取链码名称的背书策略 var chaincodeConfig = channelconfig.ChainCodeConfigs.Where(p => p.Name == chainCode.Name).FirstOrDefault(); //如果没有达到指定的背书数量则返回false if (chaincodeConfig.Policy.Number != endorseDir.Count) { return(false); } var list = peers.Select(p => p.Id).Distinct().ToList(); //判断是否是指定节点的背书 var ips = peers.Select(p => p.Id).ToList(); foreach (var item in endorseDir) { if (!ips.Contains(item.Key)) { return(false); } } //判断几个节点的背书节点是否一致 var checkdata = ""; foreach (var item in endorseDir) { if (string.IsNullOrEmpty(checkdata)) { checkdata = Newtonsoft.Json.JsonConvert.SerializeObject(item.Value.TxReadWriteSet); continue; } if (checkdata != Newtonsoft.Json.JsonConvert.SerializeObject(item.Value.TxReadWriteSet)) { return(false); } } return(true); }
/// <summary> /// 获取 需要背书的节点 /// </summary> /// <param name="ChannelId"></param> /// <param name="chainCode"></param> /// <returns></returns> public List <IPeer> GetEndorsePeer(Chaincode chainCode) { _logger.LogInformation("获取背书需要的节点"); var list = new List <IPeer>(); //如果是其他 获取最新配置 var channelconfig = _dataManager.GetChannelConfig(); //获取链码名称的背书策略 var chaincodeConfig = channelconfig.ChainCodeConfigs.Where(p => p.Name == chainCode.Name).FirstOrDefault(); foreach (var item in chaincodeConfig.Policy.OrgIds) { var org = channelconfig.OrgConfigs.Where(p => p.OrgId == item).FirstOrDefault(); var peer = _peersprovider.Get(org.Address); list.Add(peer); } return(list); }
public List <IPeer> GetEndorsePeer(Chaincode chainCode) { return(_policyProvider.GetEndorsePeer(chainCode)); }
public bool ValidateEndorse(Chaincode chainCode, Dictionary <string, EndorseResponse> endorseDir) { return(_policyProvider.ValidateEndorse(chainCode, endorseDir)); }
public Channel() { Chaincode = new Chaincode(); }