/// <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));
        }
Example #2
0
        /// <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));
            }
        }
Example #3
0
        /// <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));
        }