Esempio n. 1
0
        public Task <ChainCodeInvokeResponse> ChaincodeInit(TxRequest request)
        {
            if (request.Data.Type != TxType.Invoke)
            {
                return(Task.FromResult(new ChainCodeInvokeResponse()
                {
                    StatusCode = StatusCode.BAD_TX_TYPE
                }));
            }

            var stub      = GetChaincodeStub(request);
            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("Init");
            //必须使用名称空间+类名称
            var obj = ass.CreateInstance(classfullname);
            var rs  = method.Invoke(obj, new object[] { stub });

            if (rs != null)
            {
                return(Task.FromResult((ChainCodeInvokeResponse)rs));
            }
            return(null);
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
        public bool ValidateEndorse(Chaincode chainCode, Dictionary <string, EndorseResponse> endorseDir)
        {
            _logger.LogInformation("开始校验背书策略");
            foreach (var item in endorseDir)
            {
                if (item.Value.Status == false)
                {
                    return(false);
                }
            }
            //验证背书节点的策略
            var peers         = GetEndorsePeer(chainCode);
            var channelconfig = _dataManager.GetChannelConfig();
            //获取链码名称的背书策略
            var chaincodeConfig = channelconfig.ChainCodeConfigs.Where(p => p.Name == chainCode.Name).FirstOrDefault();

            //如果没有达到指定的背书数量则返回false
            if (chaincodeConfig.Policy.Number != endorseDir.Count)
            {
                return(false);
            }
            var list = peers.Select(p => p.Id).Distinct().ToList();

            //判断是否是指定节点的背书
            var ips = peers.Select(p => p.Id).ToList();

            foreach (var item in endorseDir)
            {
                if (!ips.Contains(item.Key))
                {
                    return(false);
                }
            }
            //判断几个节点的背书节点是否一致
            var checkdata = "";

            foreach (var item in endorseDir)
            {
                if (string.IsNullOrEmpty(checkdata))
                {
                    checkdata = Newtonsoft.Json.JsonConvert.SerializeObject(item.Value.TxReadWriteSet);
                    continue;
                }
                if (checkdata != Newtonsoft.Json.JsonConvert.SerializeObject(item.Value.TxReadWriteSet))
                {
                    return(false);
                }
            }
            return(true);
        }
Esempio n. 4
0
        /// <summary>
        /// 获取 需要背书的节点
        /// </summary>
        /// <param name="ChannelId"></param>
        /// <param name="chainCode"></param>
        /// <returns></returns>
        public List <IPeer> GetEndorsePeer(Chaincode chainCode)
        {
            _logger.LogInformation("获取背书需要的节点");

            var list = new List <IPeer>();
            //如果是其他 获取最新配置
            var channelconfig = _dataManager.GetChannelConfig();
            //获取链码名称的背书策略
            var chaincodeConfig = channelconfig.ChainCodeConfigs.Where(p => p.Name == chainCode.Name).FirstOrDefault();

            foreach (var item in chaincodeConfig.Policy.OrgIds)
            {
                var org  = channelconfig.OrgConfigs.Where(p => p.OrgId == item).FirstOrDefault();
                var peer = _peersprovider.Get(org.Address);
                list.Add(peer);
            }
            return(list);
        }
Esempio n. 5
0
 public List <IPeer> GetEndorsePeer(Chaincode chainCode)
 {
     return(_policyProvider.GetEndorsePeer(chainCode));
 }
Esempio n. 6
0
 public bool ValidateEndorse(Chaincode chainCode, Dictionary <string, EndorseResponse> endorseDir)
 {
     return(_policyProvider.ValidateEndorse(chainCode, endorseDir));
 }
Esempio n. 7
0
 public Channel()
 {
     Chaincode = new Chaincode();
 }