/// <summary> /// 更新组织 只能更改自己的组织节点 /// </summary> /// <param name="stub"></param> /// <returns></returns> private ChainCodeInvokeResponse UpdateOrg(IChaincodeStub stub) { if (stub.GetArgs().Count() != 1) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } var arg = stub.GetArgs()[0]; OrgConfig newOrg = Newtonsoft.Json.JsonConvert.DeserializeObject <OrgConfig>(arg); #region 数据完整性校验 if (string.IsNullOrEmpty(newOrg.OrgId)) { return(stub.Response("组织ID不能为空", StatusCode.BAD_OTHERS)); } if (string.IsNullOrEmpty(newOrg.Name)) { return(stub.Response("组织名称不能为空", StatusCode.BAD_OTHERS)); } if (string.IsNullOrEmpty(newOrg.Address)) { return(stub.Response("组织链接地址不能为空", StatusCode.BAD_OTHERS)); } if (newOrg.Certificate == null) { return(stub.Response("组织证书不能为空", StatusCode.BAD_OTHERS)); } if (!newOrg.Certificate.Check()) { return(stub.Response("证书数据不完整", StatusCode.BAD_OTHERS)); } if (newOrg.Certificate.TBSCertificate.CAType != CAType.Peer) { return(stub.Response("证书类型不正确", StatusCode.BAD_OTHERS)); } #endregion var channelconfig = stub.GetChannelConfig(); //获取旧的组织配置 var oldorg = channelconfig.OrgConfigs.Where(p => p.OrgId == newOrg.OrgId).FirstOrDefault(); if (oldorg == null) { return(stub.Response("组织不存在", StatusCode.BAD_OTHERS)); } oldorg.Address = newOrg.Address; oldorg.Name = newOrg.Name; oldorg.Certificate = newOrg.Certificate; stub.SetChannelConfig(channelconfig); return(stub.Response("", StatusCode.Successful)); }
/// <summary> /// 初始化 /// </summary> /// <param name="stub"></param> /// <returns></returns> public ChainCodeInvokeResponse InitChaincode(IChaincodeStub stub) { try { /** * 1.获取链码的配置信息 * 2.判断链码的状态 待初始化 运行中 已停止 * 3.状态为待初始化的才可进行初始化操作 * 4.初始化需要调用链码的 Init方法 需要用到链码执行器 */ var args = stub.GetArgs(); if (args.Length != 2) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } var channelconfig = stub.GetChannelConfig(); var chaincode = channelconfig.ChainCodeConfigs .Where(p => p.Name == args[0]).FirstOrDefault(); if (chaincode == null) { return(stub.Response("链码不存在", StatusCode.BAD_OTHERS)); } //如果不是已安装状态 if (chaincode.Status != ChaincodeStatus.INSTALLED) { return(stub.Response("链码状态不正确", StatusCode.BAD_CHAINCODE_STATUS)); } chaincode.Status = ChaincodeStatus.SERVICE; var code = new QMBlockSDK.TX.Chaincode(); code.Name = chaincode.Name; //code.NameSpace = chaincode.Namespace; //code.Version = chaincode.Version; code.Args = Newtonsoft.Json.JsonConvert.DeserializeObject <string[]>(args[1]); var rs = stub.InitChaincode(code.Name, code.Args); if (rs) { stub.SetChannelConfig(channelconfig); return(stub.Response("", StatusCode.Successful)); } else { return(stub.Response("", StatusCode.BAD_OTHERS)); } } catch (Exception ex) { return(stub.Response(ex.Message, StatusCode.BAD_OTHERS)); } }
/// <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)); } }
/// <summary> /// 获取整个通道配置 /// </summary> /// <param name="stub"></param> /// <returns></returns> public ChainCodeInvokeResponse QueryChannelConfig(IChaincodeStub stub) { var config = stub.GetChannelConfig(); return(stub.Response(config)); }
/// <summary> /// 添加组织节点 只能更改自己的组织节点 /// </summary> /// <param name="stub"></param> /// <returns></returns> private ChainCodeInvokeResponse AddOrgMember(IChaincodeStub stub) { if (stub.GetArgs().Count() != 1) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } var arg = stub.GetArgs()[0]; OrgMemberConfig newOrgMember = Newtonsoft.Json.JsonConvert.DeserializeObject <OrgMemberConfig>(arg); #region 请求合法性校验 //如果修改的组织节点等于本组织节点 则需要验证请求是否由本节点发出 var identity = stub.GetPeerIdentity(); if (newOrgMember.OrgId == identity.OrgId) { var signature = stub.GetTxRequestHeaderSignature(); //这里添加验证 } #endregion #region 成员数据完整性校验 if (string.IsNullOrEmpty(newOrgMember.OrgId)) { return(stub.Response("组织ID不能为空", StatusCode.BAD_OTHERS)); } if (string.IsNullOrEmpty(newOrgMember.Name)) { return(stub.Response("成员名称不能为空", StatusCode.BAD_OTHERS)); } if (newOrgMember.Certificate == null) { return(stub.Response("证书不存在", StatusCode.BAD_OTHERS)); } if (!newOrgMember.Certificate.Check()) { return(stub.Response("证书数据不完整", StatusCode.BAD_OTHERS)); } if (newOrgMember.Certificate.TBSCertificate.CAType == CAType.Peer) { return(stub.Response("证书类型不正确", StatusCode.BAD_OTHERS)); } #endregion var channelconfig = stub.GetChannelConfig(); var org = channelconfig.OrgConfigs.Where(p => p.OrgId == newOrgMember.OrgId).FirstOrDefault(); if (org == null) { return(stub.Response("组织不存在", StatusCode.BAD_OTHERS)); } #region 成员唯一性检验 if (org.OrgMember.Any(p => p.Name == newOrgMember.Name)) { return(stub.Response("成员名称重复", StatusCode.BAD_OTHERS)); } if (org.OrgMember.Any(p => p.Certificate.TBSCertificate.SerialNumber == p.Certificate.TBSCertificate.SerialNumber)) { return(stub.Response("成员证书编号重复", StatusCode.BAD_OTHERS)); } if (org.OrgMember.Any(p => p.Certificate.TBSCertificate.PublicKey == p.Certificate.TBSCertificate.PublicKey)) { return(stub.Response("成员公钥重复", StatusCode.BAD_OTHERS)); } #endregion org.OrgMember.Add(newOrgMember); stub.SetChannelConfig(channelconfig); return(stub.Response("", StatusCode.Successful)); }
/// <summary> /// 添加组织 /// </summary> /// <param name="stub"></param> /// <returns></returns> private ChainCodeInvokeResponse AddOrg(IChaincodeStub stub) { if (stub.GetArgs().Count() != 1) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } var arg = stub.GetArgs()[0]; OrgConfig org = Newtonsoft.Json.JsonConvert.DeserializeObject <OrgConfig>(arg); #region 数据完整性校验 if (string.IsNullOrEmpty(org.OrgId)) { return(stub.Response("组织ID不能为空", StatusCode.BAD_OTHERS)); } if (string.IsNullOrEmpty(org.Name)) { return(stub.Response("组织名称不能为空", StatusCode.BAD_OTHERS)); } if (string.IsNullOrEmpty(org.Address)) { return(stub.Response("组织链接地址不能为空", StatusCode.BAD_OTHERS)); } if (org.Certificate == null) { return(stub.Response("组织证书不能为空", StatusCode.BAD_OTHERS)); } if (!org.Certificate.Check()) { return(stub.Response("证书数据不完整", StatusCode.BAD_OTHERS)); } if (org.Certificate.TBSCertificate.CAType != CAType.Peer) { return(stub.Response("证书类型不正确", StatusCode.BAD_OTHERS)); } //证书自签名校验 var checkRs = RSAHelper.VerifyData(org.Certificate.TBSCertificate.PublicKey, Newtonsoft.Json.JsonConvert.SerializeObject(org.Certificate.TBSCertificate), org.Certificate.SignatureValue); if (!checkRs) { throw new Exception("证书校验非自签名证书"); } #endregion var channelconfig = stub.GetChannelConfig(); //组织重复检验 if (channelconfig.OrgConfigs.Any(p => p.OrgId == org.OrgId)) { return(stub.Response("组织已加入通道", StatusCode.BAD_OTHERS)); } //组织地址校验 if (channelconfig.OrgConfigs.Any(p => p.Address == org.Address)) { return(stub.Response("组织Address已配置在通道", StatusCode.BAD_OTHERS)); } var orgconfig = new OrgConfig(); orgconfig.OrgId = org.OrgId; orgconfig.Address = org.Address; orgconfig.Name = org.Name; orgconfig.Certificate = org.Certificate; //组织加入通道 channelconfig.OrgConfigs.Add(orgconfig); //更新系统链码的背书策略 channelconfig.ChainCodeConfigs.Where(p => p.Name == ConfigKey.SysBlockQueryChaincode).FirstOrDefault().Policy.OrgIds.Add(org.OrgId); channelconfig.ChainCodeConfigs.Where(p => p.Name == ConfigKey.SysBlockQueryChaincode).FirstOrDefault().Policy.Number++; channelconfig.ChainCodeConfigs.Where(p => p.Name == ConfigKey.SysCodeLifeChaincode).FirstOrDefault().Policy.OrgIds.Add(org.OrgId); channelconfig.ChainCodeConfigs.Where(p => p.Name == ConfigKey.SysCodeLifeChaincode).FirstOrDefault().Policy.Number++; channelconfig.ChainCodeConfigs.Where(p => p.Name == ConfigKey.SysNetConfigChaincode).FirstOrDefault().Policy.OrgIds.Add(org.OrgId); channelconfig.ChainCodeConfigs.Where(p => p.Name == ConfigKey.SysNetConfigChaincode).FirstOrDefault().Policy.Number++; //保存数据 stub.SetChannelConfig(channelconfig); return(stub.Response("", StatusCode.Successful)); }