/// <summary> /// 初始化系统链码配置 /// </summary> /// <param name="channel"></param> private void InitSystemChainCode(ChannelConfig channel) { ///系统链码 区块查询链码 链码生命周期管理 net网络配置 var syschaincodeList = new List <string>(); syschaincodeList.Add(ConfigKey.SysBlockQueryChaincode); syschaincodeList.Add(ConfigKey.SysCodeLifeChaincode); syschaincodeList.Add(ConfigKey.SysNetConfigChaincode); foreach (var item in syschaincodeList) { var cfg = new ChaincodeConfig(); cfg.Name = item; cfg.Policy.OrgIds = channel.OrgConfigs.Select(p => p.OrgId).Distinct().ToList(); cfg.Policy.Number = cfg.Policy.OrgIds.Count; channel.ChainCodeConfigs.Add(cfg); } }
/// <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)); } }