示例#1
0
        /// <summary>
        /// 应用通道中区块的数据 启动通道
        /// </summary>
        /// <param name="channelid"></param>
        /// <returns></returns>
        public async Task <TxResponse> StartChannel(string channelid)
        {
            //判断通道是否存在
            if (_nodes.ContainsKey(channelid))
            {
                throw new Exception($"通道{channelid}已经存在");
            }
            //判断节点身份是否完整
            var identity = _identityProvider.GetPeerIdentity();
            var checkRs  = identity.Valid();

            if (!checkRs)
            {
                throw new Exception("证书校验失败");
            }

            var nodeDataManager = new DataManager(channelid, _memoryCache, _blockDatabaseSetting, _historyDatabaseSettings, _statusDatabaseSettings);
            var node            = new Node(channelid, _loggerFactory, _assemblyProvider, _identityProvider, nodeDataManager, _mq, _clientFactory, _memoryCache);
            var url             = _identityProvider.GetPeerIdentity().Address;

            node.Start(new NodeId(url));
            _nodes.Add(channelid, node);
            //获取最新区块
            var lastblock = nodeDataManager.GetLastBlock(channelid);

            //如果没有区块 则结束
            if (lastblock != null)
            {
                //从第一个区块遍历到最后的区块 应用区块的数据到状态机
                for (var i = 0; i <= lastblock.Header.Number; i++)
                {
                    var block = nodeDataManager.GetBlock(channelid, i);
                    nodeDataManager.ApplyBlock(block);
                }
            }

            return(new TxResponse()
            {
                Status = true
            });
        }
示例#2
0
        private IChaincodeStub GetChaincodeStub(TxRequest request)
        {
            //如果是初始化通道通道的config是null
            var requestData = request.Data;
            var identity    = _identityProvider.GetPeerIdentity();

            //如果是初始化化通道
            if (request.Header.ChaincodeName == ConfigKey.SysNetConfigChaincode && request.Header.FuncName == ConfigKey.InitChannelFunc)
            {
                return(new ChaincodeStub(this, _dataManager.GetStatusDB(), request, identity));
            }
            //如果是其他链码 获取链码配置
            var config    = _dataManager.GetChannelConfig();
            var chaincode = config.ChainCodeConfigs.Where(p => p.Name == requestData.Channel.Chaincode.Name).FirstOrDefault();

            if (chaincode == null)
            {
                throw new Exception("链码不存在");
            }
            requestData.Channel.Chaincode.Version   = chaincode.Version;
            requestData.Channel.Chaincode.NameSpace = chaincode.Namespace;
            return(new ChaincodeStub(this, _dataManager.GetStatusDB(), request, identity));
        }
示例#3
0
        private string CreateToken(Certificate ca)
        {
            var identity = _identityProvider.GetPeerIdentity();

            var claims = new[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, "QMTOKEN"),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim("Version", ca.TBSCertificate.Version),
                new Claim("SerialNumber", ca.TBSCertificate.SerialNumber),
                new Claim("Signature", ca.TBSCertificate.Signature),
                new Claim("Issuer", ca.TBSCertificate.Issuer),
                new Claim("NotBefore", ca.TBSCertificate.NotBefore.ToString()),
                new Claim("NotAfter", ca.TBSCertificate.NotAfter.ToString()),
                new Claim("Subject", ca.TBSCertificate.Subject),
                new Claim("CAType", ca.TBSCertificate.CAType.ToString()),
                new Claim("PublicKey", ca.TBSCertificate.PublicKey)
            };

            var key   = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_identityProvider.GetPrivateKey()));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                issuer: identity.Name,                //签发者
                audience: ca.TBSCertificate.Subject,  //接受者
                claims: claims,                       //自定义属性
                notBefore: DateTime.Now,              //xxx日期之前不被接受
                expires: DateTime.Now.AddMinutes(30), //token的生命周期
                signingCredentials: creds);

            //"iss" #非必须。issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者。
            //"iat" #非必须。issued at。 token创建时间,unix时间戳格式
            //"exp" #非必须。expire 指定token的生命周期。unix时间戳格式
            //"aud" #非必须。接收该JWT的一方。
            //"sub" #非必须。该JWT所面向的用户
            //"nbf" #非必须。not before。如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟。
            //"jti" #非必须。JWT ID。针对当前token的唯一标识
            return(new JwtSecurityTokenHandler().WriteToken(token));
        }
示例#4
0
 public PeerIdentity GetPeerIdentity()
 {
     return(_identityProvider.GetPeerIdentity());
 }