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); }
/// <summary> /// 安装链码(将链码加入到配置中) /// </summary> /// <param name="stub"></param> /// <returns></returns> public ChainCodeInvokeResponse InstallChaincode(IChaincodeStub stub) { /** * arg[0] 链码名称 * arg[1] 命名空间 也是dll文件名称 * arg[2] 版本号 * arg[3] 背书策略 * * 1.打包上传到指定的文件夹 (每个单独的 不是写链码) * * 2.安装链码 即在配置中写入链码 * 3.链码初始化 * **/ try { var args = stub.GetArgs(); if (args.Length != 4) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } var chaincodeConfig = new ChaincodeConfig(); chaincodeConfig.Name = args[0]; chaincodeConfig.Namespace = args[1]; chaincodeConfig.Version = args[2]; chaincodeConfig.Status = ChaincodeStatus.INSTALLED; chaincodeConfig.Policy = Newtonsoft.Json.JsonConvert.DeserializeObject <Policy>(args[3]); #region 检查参数 if (string.IsNullOrEmpty(chaincodeConfig.Name)) { return(stub.Response("请输入链码名称", StatusCode.BAD_OTHERS)); } if (string.IsNullOrEmpty(chaincodeConfig.Namespace)) { return(stub.Response("请输入链码命名空间", StatusCode.BAD_OTHERS)); } if (string.IsNullOrEmpty(chaincodeConfig.Version) || !decimal.TryParse(chaincodeConfig.Version, out decimal rs)) { return(stub.Response("版本号格式不正确", StatusCode.BAD_OTHERS)); } #endregion #region 检查代码是否已经上传到了正确目录 String basePath = AppContext.BaseDirectory; var chaincodepath = Path.Combine(basePath, ConfigKey.ChaincodePath, stub.GetChannelId(), args[0], args[1], args[2]); if (!Directory.Exists(chaincodepath)) { return(stub.Response("链码不存在", StatusCode.BAD_OTHERS)); } #endregion var channelConfig = stub.GetChannelConfig(); #region 检查链码是否重复 if (channelConfig.ChainCodeConfigs.Any(p => p.Name == chaincodeConfig.Name)) { return(stub.Response("链码已经存在", StatusCode.BAD_OTHERS)); } #endregion //校验组织是否存在 #region 检查链码组织是否 #endregion foreach (var item in chaincodeConfig.Policy.OrgIds) { //如果组织不存在 if (!channelConfig.OrgConfigs.Any(p => p.OrgId == item)) { return(stub.Response(item + "组织不存在", StatusCode.BAD_OTHERS)); } } channelConfig.ChainCodeConfigs.Add(chaincodeConfig); stub.SetChannelConfig(channelConfig); return(stub.Response("", StatusCode.Successful)); } catch (Exception ex) { return(stub.Response(ex.Message, StatusCode.BAD_OTHERS)); } }