/// <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="request"></param> /// <returns></returns> private ChainCodeInvokeResponse CreateNewChannel(IChaincodeStub stub) { var identity = stub.GetPeerIdentity(); var args = stub.GetArgs(); if (args.Length != 1) { return(stub.Response("参数个数不正确", StatusCode.BAD_ARGS_NUMBER)); } //组织 var OrgConfig = new OrgConfig(); OrgConfig.OrgId = identity.OrgId; OrgConfig.Name = identity.Name; OrgConfig.Certificate = identity.Certificate; OrgConfig.Address = identity.Address; //通道 var channel = new ChannelConfig(); channel.ChannelID = args[0]; channel.OrgConfigs.Add(OrgConfig); //初始化系统链码 InitSystemChainCode(channel); stub.SetChannelConfig(channel); return(stub.Response("", StatusCode.Successful)); }
//将身份信息注册到通道中 private ChainCodeInvokeResponse RegistMember(IChaincodeStub stub) { var args = stub.GetArgs(); if (args.Length != 1) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } //获取ca var ca = Newtonsoft.Json.JsonConvert.DeserializeObject <Certificate>(args[0]); //获取配置 var chainconfig = stub.GetState <ChannelConfig>(ConfigKey.Channel); if (!ca.Check()) { return(stub.Response("CA证书校验失败", StatusCode.BAD_OTHERS)); } //获取组织 var org = chainconfig.OrgConfigs.Where(p => p.OrgId == ca.TBSCertificate.Issuer).FirstOrDefault(); if (org == null) { return(stub.Response("通道不存在" + ca.TBSCertificate.Issuer, StatusCode.BAD_OTHERS)); } //判断组织中是否已经注册了该账号 //org.OrgMember.Where(p=>p.Certificate.TBSCertificate) throw new NotImplementedException(); }
private ChainCodeInvokeResponse FindByKey(IChaincodeStub stub) { if (stub.GetArgs().Length != 1) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } var rs = stub.GetState <Account>("a"); return(stub.Response(rs)); }
/// <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)); } }
private ChainCodeInvokeResponse Transfer(IChaincodeStub stub) { var args = stub.GetArgs(); if (args.Length != 3) { return(stub.Response("", StatusCode.BAD_ARGS_NUMBER)); } var a = stub.GetState <Account>(args[0]); var b = stub.GetState <Account>(args[1]); a.Money = a.Money - Convert.ToDecimal(args[2]); b.Money = b.Money + Convert.ToDecimal(args[2]); if (a.Money < 0) { return(stub.Response("账户 A 余额不足", StatusCode.BAD_BUSINESS)); } stub.PutState(args[0], a); stub.PutState(args[1], b); return(stub.Response("", StatusCode.Successful)); }
/// <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> 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)); }