Ejemplo n.º 1
0
        private Task <ChainCodeInvokeResponse> ChaincodeInvoke(IChaincodeStub stub)
        {
            try
            {
                var chaincode = new Chaincode();
                chaincode.NameSpace = stub.GetChaincodeNameSpace();
                chaincode.Name      = stub.GetChaincodeName();
                chaincode.Version   = stub.GetChaincodeVersion();
                var ass           = _assemblyProvider.GetAssembly(stub.GetChannelId(), stub.GetChaincodeName(), stub.GetChaincodeNameSpace(), stub.GetChaincodeVersion());
                var classfullname = chaincode.NameSpace + "." + chaincode.Name;
                //必须使用 名称空间+类名称
                var type = ass.GetType(classfullname);
                //方法的名称
                MethodInfo method = type.GetMethod("Invoke");
                //必须使用名称空间+类名称
                var obj = ass.CreateInstance(classfullname);
                var rs  = method.Invoke(obj, new object[] { stub });
                if (rs != null)
                {
                    return(Task.FromResult((ChainCodeInvokeResponse)rs));
                }
            }
            catch (Exception ex)
            {
                return(null);
            }

            return(null);
        }
Ejemplo 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));
            }
        }