Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
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));
            }
        }